通過實戰操作學git

  雖然說 ”好記性不如爛筆頭”,但是學習不看等於沒學,學習不用等於不會,所以說”實戰纔是檢驗真理的唯一標準“,通過實戰則會學到很多東西。

  因爲陳** 太懶,並且不喜歡查百度,老是犯同樣的問題,於是我通過完整的操作git流程和一些實戰中的場景,將常用git流程和命令整理了下來,這樣也方便我女盆友帶入學習,哈哈哈。

  首先,新人進入公司,拉取代碼必然先要註冊賬號,設置自己的環境。俗話說得好:工欲善其事必先利其器,所以配置一個好的環境可以方便自己很多。下面就先配置環境:

step1:配置電腦和git環境

  下載git就不多說了,陳某某可以看我之前的筆記。然後就是配置git環境了。

1,配置git環境

  首先,您需要配置您的 Git 環境,包括設置您的用戶名和郵箱,以便您的提交能夠正確歸屬。

git config --global user.name "Your Name"
git config --global user.email "[email protected]"

  因爲Git 的簽名設置涉及到用戶的姓名和電子郵件地址,以及 GPG 密鑰的使用。並且簽名用於標識提交的作者和驗證提交的真實性。所以設置簽名有助於確保提交的真實性和作者的身份,特別是在開源項目中。根據特定的的需求,也可以選擇是否使用 GPG 密鑰進行更強的簽名驗證。

  並且後續提交代碼,也可以通過commit添加簽名的提交,比如下面操作:

git commit -s -m "Signed commit"    # 進行簽名的提交

這樣查看log,即使用 git log, 顯示結果如下:

commit 6e65a67132ae94b9bdc887d72ff87e2f14ac3c9f (HEAD -> main)
Author: Your Name <[email protected]>
Date:   Mon Aug 17 12:34:56 2023 +0000

    Your commit message
    
    Signed-off-by: Your Name <[email protected]>
    GPG Key ID: XXXXXXXX

commit a8c7e9d63a44c692e53c6181f2b1b55e523c19fe
Author: Another Contributor <[email protected]>
Date:   Sun Aug 16 15:20:12 2023 +0000

    Another commit message
    
    Signed-off-by: Another Contributor <[email protected]>
    GPG Key ID: YYYYYYYY

  在這個示例中,每個提交都帶有 "Signed-off-by" 行,顯示了簽名的作者信息和 GPG 密鑰的 ID。請將 "Your Name"、"[email protected]"、"Your commit message"、"XXXXXXXX" 等想象爲實際的信息。

2,clone代碼倉庫

  自己的環境設置好之後,就可以通過 Git 命令行或圖形界面工具來克隆公司的代碼倉庫。假設遠程代碼倉庫的 URL 爲 https://github.com/yourcompany/repository.git,就可以執行以下命令來克隆代碼倉庫:

git clone https://github.com/yourcompany/repository.git

   陳童靴,注意複製的時候需要更改一下名稱,當然公司的代碼庫旁邊就有git clone(ssh...)等。

3,切換到dev_new 分支

  默認情況下,您克隆倉庫後會在主分支(通常是 master 或 main)上。但根據您的需求,您需要切換到公司給您創建的 dev_new 分支上,通過下面命令進行操作:

git checkout -b dev_new

  怎麼說呢,就是master分支(近年來,github社區修改爲main分支了,因爲master有歧義,涉及到一些人權等問題)一般是主分支,項目的發佈版本。所以我們克隆到本地後,如果要開發的話,也要切換到自己的開發分支,因爲遠程自己也有自己的開發分支。所以我個人認爲就是和遠程保持一致而已。也不要東3自己本地的master分支就好。

4,拉取遠程分支更新

  一旦切換到 dev_new 分支,也就是自己的開發分支,當然就可以通過以下命令拉取遠程分支的最新更改:

git pull origin dev_new

  如果在拉取過程中有衝突,需要解決這些衝突。Git 會提示您手動合併衝突的部分。但是首次拉取,一般沒有。因爲自己遠程的dev_new分支也是克隆master分支的,至於所說的衝突就是後面提交代碼多了的問題。這個後面遇到再說,我也會給出實戰例子的,不要擔心。

5,獲取其他分支的更新

  如果您還想獲取其他分支(如 master 或 dev)的更新,您可以切換到相應分支並拉取最新更改,操作如下:

git checkout master
git pull origin master

git checkout dev
git pull origin dev

  這種情況一般就是協助同事進行測試操作,所以需要遠程拉取別人的分支代碼,但是不影響自己的開發分支。這個我後面也會舉個例子的。

6,定期更新

  在您工作的過程中,定期地更新您的本地分支以獲取最新的更改。您可以使用 git pull 命令來獲取遠程分支的更新。就是自己開發的部分會給遠程代碼提交,當然別人也會提交,爲了保持代碼的最新,則需要定期update。

  以上就是一個整體的流程,其實這樣說,懂得都懂,不懂得也是一臉懵逼。所以我爲小陳設定了下面一些常見新手會遇到的場景,並且手把手的教練。

 

step2:初步提交代碼

   小陳喜歡使用Pycharm寫代碼,覺得非常好用,於是自己寫完代碼後,進行提交代碼,結果架構師反饋,提交的PR有問題,需要修改,但是她不知道爲什麼會有.idea文件,自己都沒有注意,結果把本地的.idea文件夾提交到遠程了。

  順便提一句.idea文件:首先,無論是誰開發,使用IDE都無可厚非,畢竟這是一種提升開發效率的軟件,而.idea文件就是以”configuration File" 形式存儲於Pycharm等IDE工具中的配置文件,也就是說,在創建項目時,IDE會自動生成一個.idea文件夾,目的是存儲項目設置相關的文件。.idea文件夾包含了工程相關的元數據,如項目名稱,編譯器配置,版本控制,項目模板,語言設置,運行配置等等。

   廢話說完了,那麼如何從自己已經提交到自己遠程倉庫中刪除“.idea” 文件及其內容呢。

1,從本地倉庫刪除 “.idea”文件夾。

  首先在自己的本地項目目錄中,運行以下命令來刪除:

git rm -r .idea

  然後可以使用git status查看更改狀態,當然也可以直接提交更改:

git commit -m "Remove .idea directory"

  這裏順帶說一下git commit命令。

  git commit 是 Git 版本控制系統中的一個重要命令,用於將暫存區中的更改提交到版本歷史中。每次提交都會生成一個新的提交記錄,其中包含了更改的快照以及相關的元數據。以下是關於 git commit 命令以及常見參數的詳細介紹:

git commit -m "Commit message"

  常見參數

  • -m "Commit message":使用 -m 參數後面跟隨的字符串作爲提交消息。提交消息應該簡潔明瞭地描述本次提交的目的和內容。注意這裏少說廢話,也不要長篇大論,就簡單明瞭的將自己的問題提交了,比如自己寫了什麼功能等。
  • -a:自動將已追蹤的修改添加到暫存區並提交。這相當於運行 git addgit commit 命令的組合。注意,該選項只適用於已經追蹤的文件,對於新添加的文件仍然需要使用 git add

  • -s:用於簽署提交,表示提交的更改已經經過簽名驗證。通常用於在開源項目中證明提交者的身份。這個之前有介紹,如果使用-s,則提交都帶有 "Signed-off-by" 行,並且顯示自己的name, email。

  • -v:在提交消息中顯示當前更改的詳細信息,包括差異和更改的行數統計。

  示例

git add file.txt    # 將更改添加到暫存區
git commit -m "Fix a bug"   # 提交暫存區中的更改並添加提交消息

git commit -a -m "Add new feature"   # 添加並提交所有已追蹤的更改,包括新添加的文件

git commit -s -m "Signed commit"    # 進行簽名的提交


git commit    # 使用文本編輯器輸入詳細的提交消息

  

2,推送到遠程分支

  注意這裏,因爲是自己刪除自己的代碼(這裏指的是.idea文件夾),所以其實並不需要增加git commit 新寫”delete .idea"去覆蓋自己之前的commit,可以複用之前的,讓別人無需知道自己做了一件蠢事,所以這裏則可以使用下面命令:

git commit --amend

  進去之後是自己之前的commit,一般情況下不需要修改,如果要修改則進去修改也可以。但是注意,就是該操作會改變你原來的commit id哦。

  最後就是push了。

git push origin <branch-name>

  其中,<branch-name>是自己要推送更改的分支名稱。

 3,一勞永逸解決問題——創建並編譯  .gitignore文件

  如何一次性解決問題呢,那麼就是在本地設置.gitignore文件內容,這樣就不會每次提交.idea文件,並且再進行刪除操作了。

  本地設置的地址是:將自己的.gitignore剪貼到C盤根目錄(Windows:C:/User/你的用戶名/)

  一般項目的根目錄下,都會存在一個名爲 .gitignore 的文件。但是自己也可以爲自己設置一個全局的個人的.gitignore,因爲項目的.gitignore可能沒有考慮那麼到位,如果你不想修改項目的.gitignore,並且自己也不想手動刪除,就給自己配置一個吧。

  當然我們可以給自己配置專屬的其他希望忽略的內容。爲此呢,我這裏簡單的說一下常見的規則,並且給小陳兩個模板,一次是如果寫C++常用的模板,一個是Python爲主的代碼。

  在.gitignore文件中,您可以列出希望Git忽略的文件、文件夾或模式。以下是一些常見的.gitignore規則示例:

  1. 忽略特定文件或文件夾:

filename.ext            # 忽略特定文件
folder/                 # 忽略特定文件夾

  2,使用通配符

*.ext                   # 忽略所有擴展名爲 .ext 的文件
folder/*.ext            # 忽略特定文件夾中的所有擴展名爲 .ext 的文件

  3,忽略文件夾及其內容

folder/                 # 忽略整個文件夾及其內容

  4,排除特定文件或文件夾

!filename.ext           # 不忽略特定文件(排除忽略規則)
!folder/                # 不忽略特定文件夾(排除忽略規則)

  5,忽略編譯生成的文件或文件夾

build/                  # 忽略編譯生成的文件夾
*.o                     # 忽略所有 .o 文件(編譯生成的目標文件)

  6,忽略操作系統或編譯器生成的文件:

.DS_Store               # 忽略 macOS 生成的 .DS_Store 文件
Thumbs.db               # 忽略 Windows 生成的 Thumbs.db 文件
*.swp                   # 忽略 Vim 生成的 .swp 臨時文件

  這只是一些常見的示例,.gitignore文件的內容會因項目類型、開發環境和個人偏好而有所不同。您可以根據您的項目需要自定義.gitignore文件,以忽略不必要的文件和文件夾,並確保倉庫中只包含必要的源代碼和資源文件。另外,GitHub官方提供了一個.gitignore模板集合,您可以在GitHub/gitignore上找到針對不同編程語言、開發環境和工具的模板參考。

   這裏給出兩個模板,C++和Pyhton的

  C++ 深度學習項目的 .gitignore 文件示例:

# Compiled Object files
*.slo
*.lo
*.o
*.obj

# Precompiled Headers
*.gch
*.pch

# Compiled Dynamic libraries
*.so
*.dylib
*.dll

# Compiled Static libraries
*.lai
*.la
*.a
*.lib

# Executables
*.exe
*.out
*.app

# Build directories
_build/
build/
dist/
bin/
tmp/
CMakeFiles/
CMakeCache.txt
CMakeScripts/
CMakeTmp/
CTestTestfile.cmake

# Visual Studio files
.vscode/
*.sln
*.vcxproj
*.vcxproj.filters
*.pdb
*.idb
*.ipdb
*.obj
*.db
*.tlog
*.manifest
*.log
*.cache
*.ilk
*.dll
*.exe
*.log
*.suo
*.user
*.vcproj.*
*.opensdf

# Xcode files
.DS_Store
*.xcodeproj/
*.xcworkspace/

# IDE project files
.idea/
*.pro.user
*.kdev4

# Miscellaneous
*.swp
*.swo
*.tmp
*.tmp.*
*~
*#
.#*

  Python 深度學習項目的 .gitignore 文件示例:

# Byte-compiled / optimized / DLL files
__pycache__/
*.py[cod]
*$py.class

# C extensions
*.so

# Distribution / packaging
dist/
build/
eggs/
*.egg-info/
*.egg

# Python local environment
.env/

# Jupyter Notebook auto-generated files
.ipynb_checkpoints/

# PyCharm
.idea/
*.iml
*.iws
*.ipr

# Visual Studio Code
.vscode/

# Miscellaneous
*.swp
*~
__MACOSX/
.DS_Store
Thumbs.db

  上述示例中的 .gitignore 文件會排除編譯、構建、臨時文件以及 IDE 生成的文件等,以確保您的版本控制倉庫保持乾淨。根據項目的具體情況,您可能需要根據需要進行適當的調整。這些示例只是一些常見的排除規則,您可以根據項目的實際情況進行修改。

4,順帶配置.gitconfig文件

  之前忘了說.gitconfig文件了,既然都配置了.gitignore文件,那麼順手也配置一下.gitconfig吧。.gitconfig 是 Git 的配置文件,用於設置 Git 的全局配置選項。你可以通過編輯這個文件來配置你的 Git 環境。以下是如何配置 .gitconfig 文件的步驟:

  1. 定位 .gitconfig 文件:

    • 在 Windows 系統上,.gitconfig 文件通常位於你的用戶主文件夾下(例如:C:\Users\YourUsername)。
    • 在類 Unix 系統上(如 Linux 和 macOS),.gitconfig 文件位於你的用戶主目錄下(例如:/Users/YourUsername)。
  2. 編輯 .gitconfig 文件:

    你可以使用任何文本編輯器來編輯 .gitconfig 文件。你可以在終端使用命令行編輯器如 nano 或 vim,也可以使用圖形界面的編輯器如 Notepad(Windows)、TextEdit(macOS)、VS Code 等。

    打開終端(或命令提示符)並輸入以下命令來編輯 .gitconfig 文件:

git config --global --edit

  這將打開默認文本編輯器,並在其中顯示 .gitconfig 文件的內容。

  關於配置選項:

  1. 在打開的 .gitconfig 文件中,你可以設置各種不同的選項,如用戶名、電子郵件、默認編輯器、別名等。以下是一些示例配置選項:

[user]
    name = Your Name
    email = [email protected]

[core]
    editor = code --wait  # 設置默認編輯器爲 Visual Studio Code

[alias]
    co = checkout
    ci = commit
    br = branch

  在 [user] 部分設置你的用戶名和郵箱,在 [core] 部分設置默認編輯器,在 [alias] 部分設置一些常用的別名命令。

  1. 保存文件:

    在編輯完成後,保存文件並關閉文本編輯器。

  2. 驗證配置:

    可以使用以下命令來查看當前的全局配置:

git config --global --list

  請注意,--global 標誌表示這些配置將適用於你的整個 Git 環境。如果你想在特定項目中覆蓋某些配置,你可以在項目目錄下創建一個名爲 .git/config 的文件,其中的配置選項會覆蓋全局配置。

  下面是一個有經驗的 Git 用戶使用的 .gitconfig 文件示例。這個示例包含了一些常見的配置,以及一些高級別的配置選項,如顏色設置、別名、分支保護等.

[user]
    name = John Doe
    email = [email protected]

[core]
    editor = code --wait  # 默認編輯器設置爲 Visual Studio Code
    autocrlf = input      # 在提交時轉換換行符爲 LF

[color]
    ui = auto             # 自動啓用顏色

[alias]
    co = checkout
    ci = commit
    br = branch
    st = status
    hist = log --pretty=format:'%h %ad | %s%d [%an]' --graph --date=short

[diff]
    tool = vscode        # 使用 Visual Studio Code 作爲 diff 工具
[difftool "vscode"]
    cmd = code --wait --diff $LOCAL $REMOTE

[merge]
    tool = vscode        # 使用 Visual Studio Code 作爲合併工具
[mergetool "vscode"]
    cmd = code --wait $MERGED
    trustExitCode = true

[push]
    default = simple     # 默認推送模式設置爲 simple

[rebase]
    autosquash = true    # 自動摺疊 commit

[fetch]
    prune = true         # 獲取時自動刪除遠程分支上不存在的分支

[pull]
    rebase = true        # 默認拉取模式設置爲 rebase

[commit]
    gpgsign = true       # 啓用 GPG 簽名

[credential]
    helper = wincred     # 使用 Windows 憑據管理器存儲憑據

[branch "main"]
    protection = required-status-checks,strict  # 保護分支配置

[core]
    pager = less -F -X    # 設置分頁工具爲 less 並禁用清屏

  

  我自己的如下:

[user]
	name = XaaXbb
	email = [email protected]
[core]
	editor = vim
	autocrlf = input
   	fileMode = false
[color]
	ui = auto
[push]
	default = simple
[alias]
	co = checkout
	cb = checkout -b
	cp = cherry-pick
	cx = cherry-pick -x
	st = status
	ss = status -s
	br = branch
	ba = branch -a
	cs = commit -s
	ca = commit --amend -s
	df = diff
	dfca = diff --cached
	throw = reset --hard HEAD
	throwh = reset --hard HEAD^
	lg = log --oneline --decorate --color
	logs = log --stat --color
	dt = difftool
	mt = mergetool
[merge]
	tool = vimdiff
[diff]
	tool = vimdiff
[difftool]
	prompt = false
[log]
	date = default
[filter "lfs"]
	clean = git-lfs clean -- %f
	smudge = git-lfs smudge -- %f
	required = true
	process = git-lfs filter-process
[pull]
	rebase = true
[safe]
	directory = %(prefix)///AA/BB/CC/..

  

step3:再次提交代碼(git 如何刪除Untracked files)

  小陳發現自己剛剛設定好一切後,同時新增加了一些其他無用的東西,但是這次學聰明瞭,並沒有add進去,於是她要刪除 Git 中的未跟蹤文件,最簡單的方法就是git status去查看,然後手動去項目刪除,當然作爲一個程序員,必須要代碼刪除,這可是尊嚴,不是碼?

  所以可以使用 git clean 命令進行刪除。git clean 命令用於清除未添加到版本控制的文件。請注意,git clean 命令是不可逆的,並且將永久性地刪除未跟蹤文件,請確保在執行該命令之前確認你確實要刪除這些文件。

  下面簡單介紹一下,以下是一些常用的 git clean 命令選項:

  • -n--dry-run:顯示將要刪除的未跟蹤文件列表,但不執行刪除操作。
  • -f--force:強制執行刪除操作,即使存在只讀文件或受保護的文件夾。
  • -d:同時刪除未跟蹤的文件夾。
  • -x:同時刪除 Git 忽略的文件。

  例如,要查看將要刪除的未跟蹤文件列表,可以執行以下命令:

git clean -n

  如果你確定要刪除這些未跟蹤文件,請使用以下命令進行刪除:

git clean -f

  如果你還希望刪除未跟蹤的文件夾,可以添加 -d 選項

git clean -fd

  請再次注意,執行 git clean 命令時要小心,以免誤刪除重要文件。在執行任何 Git 命令之前,請確保已備份你的代碼。

step4: 遠程拉取別人分支進行測試

  小陳做了兩天,老闆發現其能力確實稍微有些欠缺,就讓她先幫忙測試,順帶熟悉項目代碼。同時呢,項目組小張寫完了一個功能找老闆merge,但是老闆希望小陳來幫忙測試一下,於是小陳就有新的需求:需要遠程拉取小張的dev分支,然後幫助小張測試代碼,因爲這時候小張的代碼並沒有merge到master分支,所以小陳需要去拉去小張的開發分支,然後再測試,那麼小陳應該如何做呢?

  下面簡單介紹一下流程,其實和拉取master分支一樣。

1,首先查看遠程倉庫的所有分支

git branch -r

  通過上述命令,可以查看遠程倉庫的所有分支。

  爲了讓小陳對branch命令有個深刻的印象,下面再複習一下git branch的命令操作:git branch 是一個用於管理和查看分支的 Git 命令。它用於列出、創建、刪除和切換分支,以及顯示有關分支的信息。

  下面是常見的git branch命令及其介紹:

    git branch: 顯示當前倉庫中所有分支的列表,當前分支會用星號標記。

    git branch <branch-name>: 創建一個新分支,命名爲 <branch-name>。

    git branch -d <branch-name>: 刪除已合併到其他分支的 <branch-name> 分支。如果分支未合併,此命令會報錯。

    git branch -D <branch-name>: 強制刪除分支 <branch-name>,無論其是否合併。

    git branch -m <new-branch-name>: 重命名當前分支爲 <new-branch-name>。

    git branch -a: 列出本地和遠程所有分支的列表。

    git branch -v: 列出每個分支的最新提交信息。

    git branch --merged: 列出已合併到當前分支的其他分支。

    git branch --no-merged: 列出尚未合併到當前分支的其他分支。

    git branch --contains <commit>: 列出包含指定 <commit> 的所有分支。

    git branch --set-upstream-to=<upstream-branch>: 爲當前分支設置上游分支,以便與遠程跟蹤分支關聯。

    git branch --unset-upstream: 解除當前分支與上游分支的關聯。

  下面是常見的git branch命令的示例用法(陳童靴只需要掌握這幾個目前就夠用了):

    創建一個新分支:git branch feature-branch

    切換到另一個分支:git checkout another-branch

    列出所有分支:git branch -a

    刪除已合併的分支:git branch -d merged-branch

    列出包含特定提交的分支:git branch --contains <commit-hash>

 

2,基於遠程分支創建本地分支

  根據上面列出的遠程分支,進行復制要拉取的遠程分支的名稱(也就是找到小張的開發分支),然後創建本地分支

git checkout  local_branch_name  origin/remote_branch_name

  上面代碼是根據遠程分支創建一個本地跟蹤分支。

3,切換到本地測試分支

  然後從自己本地的開發分支切換到本地測試分支

git checkout local_branch_name

  這樣就可以切換到本地分支了。

  但是實際上,上面步驟2和步驟3的命令,通過下面代碼一步實現

git checkout -b local_branch_name  origin/remote_branch_name

  說到 checkout命令,當然這也是git中比較重要的命令之一。下面再複習一下 git checkout命令。git checkout 是 Git 中一個重要的命令,主要用於切換分支、恢復文件以及創建新分支等操作。根據不同的用法,它有不同的功能。      

  以下是一些常見的 git checkout 命令及其介紹:

切換分支:
    git checkout <branch-name>:將工作目錄切換到指定的 <branch-name> 分支。

    git checkout -b <new-branch-name>:創建並切換到名爲 <new-branch-name> 的新分支。

    git checkout -:切換回上一個分支,特別適用於在兩個分支之間切換。
恢復文件:

    git checkout -- <file>:將指定的 <file> 文件恢復爲最近一次提交的狀態。這可以用於取消工作目錄中的修改。

    git checkout <commit> -- <file>:將指定的 <file> 文件恢復到指定 <commit> 提    交中的狀態。

切換提交狀態:
    git checkout <commit>:將工作目錄和暫存區重置爲指定的 <commit> 提交狀態。您將進入分離頭指針狀態,用於查看特定提交的內容。

切換標籤:
    git checkout <tag-name>:將工作目錄切換到指定的 <tag-name> 標籤對應的提交。

切換到特定目錄:
    git checkout --path <directory>:將工作目錄切換到指定的 <directory> 目錄。這在您只希望檢出倉庫中的一部分內容時很有用。

   下面是常見的git checkout命令的示例用法(陳童靴只需要掌握這幾個目前就夠用了):

    切換到另一個分支:git checkout feature-branch

    創建並切換到新分支:git checkout -b new-feature

    恢復文件到最近一次提交狀態:git checkout -- file.txt

    恢復文件到特定提交狀態:git checkout abc123 -- file.txt

    切換到某個標籤對應的提交:git checkout v1.0

  

4,獲取遠程最新的提交

  本地分支創建好之後,並且切換到測試分支,就可以拉取小張的提交到遠程的分支代碼了,通過下面命令:

git pull

  這樣就可以抓取遠程同事的最新提交,到本地分支。然後幫助他測試了。

5,刪除自己新增的debug代碼

  拉取同事的代碼測試之後,如果有問題,就要反饋bug,如果問題不大,自己可以debug也是OK的,但是自己有修改則要提交到遠程小張分支上,但是這時候我們本地debug的打印代碼就要刪除了,只留下解bug的代碼。

  如何刪除自己的打印測試代碼呢,這時候也可以使用git checkout。

  上面介紹提到過,如果您想在Git中撤銷對文件的修改(假設是 a.file),您可以使用以下命令:

git checkout -- a.file

   這將撤銷對 a.file 的修改,將文件恢復到最近一次提交的狀態。

  如果您想要Git撤銷對整個工作目錄下所有文件的修改(包括新增的文件和刪除的文件),可以使用以下命令:

git checkout -- .

  注意:也可以使用下面命令撤銷對文件的修改:

git checkout a.file

  實際上 git checkout a.filegit checkout -- a.file 在大多數情況下是等效的,都可以用來撤銷對文件的修改,將其恢復到最近一次提交的狀態。兩者的區別在於使用 -- 的情況。

  • git checkout a.file 是直接指定了文件名,Git 會將文件恢復到最近一次提交的狀態。
  • git checkout -- a.file 中的 -- 是一種約定,用於分隔文件名和可能與文件名相同的分支名或提交哈希。使用 -- 可以確保 Git 將後面的內容解釋爲文件名而不是分支名。

  在撤銷文件修改的場景下,兩者的效果是一樣的,您可以根據習慣選擇使用哪種方式。如果文件名可能與分支名相同,使用 -- 可以避免歧義。

  請注意,這些命令會永久性地丟棄未保存的修改,所以在使用前請確保您已經保存了需要保留的修改。如果您需要更細粒度的控制,也可以考慮使用 git stash 命令來保存當前的修改,然後再恢復。

   除了上面兩種用法之外,在Git中,git checkout 命令還可以還原到指定提交的狀態,我們上面默認直接回退到上一次提交,而下面加上提交的哈希值就可以回退到指定版本。命令如下:

git checkout <commit> -- <file>

  其中 <commit> 是提交的哈希值或者分支名,這個命令可以用來從指定的提交中獲取指定文件的副本,相當於撤銷該文件的所有後續修改,將其還原到指定提交的狀態。

   既然要查找哈希值或分支名,那麼如何做呢? 這裏再補充一個概念,就是log查找。這裏介紹兩個命令,git log 和 git reflog。

6,補充學習:git log和 git reflog

  git loggit reflog 都是用於查看Git提交歷史的命令,但它們有不同的用途和適用場景。

git log

  git log 用於查看倉庫的提交歷史。它會列出所有的提交記錄,並按照提交時間的倒序顯示,最新的提交在最上面。通過 git log 命令,你可以查看每個提交的作者、提交時間、提交消息以及提交所包含的更改。

適用場景:

  • 瞭解項目的提交歷史,包括每個提交的詳細信息。
  • 追蹤項目的演變和不同版本之間的變化。
  • 查找特定提交引入的更改或問題。

  示例:

git log

  當你使用 git log 命令查看Git提交歷史時,會顯示一系列提交記錄,每個提交記錄都包含有關提交的信息,如提交作者、提交時間、提交哈希、提交消息等。以下是一個示例 git log 命令的結果:

commit 5c2d7f6d9b2c7809c26c704a93e4a4e9e4d77e87
Author: John Smith <[email protected]>
Date:   Fri Aug 12 15:24:18 2022 +0300

    Add new feature: user authentication

commit 9fbae82f1de89b8a1cfcf65a5e1d29e91e96f489
Author: Jane Doe <[email protected]>
Date:   Thu Aug 11 10:57:32 2022 -0700

    Fix issue with data processing

commit 72b1a3d6f7850d03c3d8c41a013bfef49e614a96
Author: Alex Johnson <[email protected]>
Date:   Wed Aug 10 18:42:09 2022 +0200

    Update README with installation instructions

...

  在這個示例中,每個提交記錄都包含以下信息:

  • commit: 提交的哈希值,是提交的唯一標識。
  • Author: 提交作者的姓名和電子郵件地址。
  • Date: 提交的時間戳,顯示提交的日期和時間。
  • 提交消息: 描述提交所做更改的簡短文本。

  通過查看這些提交記錄,你可以瞭解項目的開發歷史,包括誰在何時做了哪些更改。這對於跟蹤項目的演變和查找特定更改非常有用。請注意,實際的 git log 輸出可能會更長,具體的提交信息會根據項目的不同而有所變化。 

git reflog

  git reflog 用於查看本地倉庫的引用日誌,包括分支、HEAD、標籤等的變更歷史。這包括了所有的引用操作,比如分支切換、提交、合併等。git reflog 通常用於恢復誤操作或找回丟失的提交。

適用場景:

  • 恢復意外刪除的分支或提交。
  • 找回在分支切換或重置後丟失的提交。
  • 調查引用操作的歷史,以便理解倉庫狀態的變化。

  示例:

git reflog

  以下是一個示例 git reflog 命令的結果:

5bf6542 (HEAD -> feature-branch) HEAD@{0}: checkout: moving from develop to feature-branch
827f564 (develop) HEAD@{1}: commit: Update file1.txt
e4824b3 HEAD@{2}: commit: Fix issue #123
3a17d98 HEAD@{3}: checkout: moving from master to develop
1f0b2c6 HEAD@{4}: commit: Add new feature
...

  在這個示例中,每個條目都包含以下信息:

  • 提交哈希: 當前狀態的提交哈希值。
  • 分支/引用: 當前 HEAD 所指向的分支或引用(如果有的話)。
  • 操作類型和操作編號: 操作類型(commit、checkout 等)和操作的編號,這些編號可以用於執行 git resetgit cherry-pick 等操作。

   下面給一個結合 git reflog 的結果進行 Git 調用的示例:

1,恢復意外刪除的分子

  假設你意外刪除了一個分支,而現在想恢復它。你可以使用 git reflog 找到刪除前的提交哈希,然後重新創建分支。

git checkout -b recovered-branch 827f564

  這會創建一個名爲recovered-branch 的新分支,並將它指向提交 827f564

2,找回丟失的提交

  如果你切換分支或進行操作後發現之前的提交消失了,你可以使用 git reflog 找回這些提交。

git checkout -b temp-branch e4824b3

  這會創建一個臨時分支 temp-branch 並將其指向提交 e4824b3,從而使你能夠檢查丟失的提交

3,撤銷操作

  如果你意外執行了一個操作(如合併或重置),你可以使用 git reflog 找到之前的操作,然後通過 git reset 或其他適當的命令進行撤銷。

git reset --hard 1f0b2c6

  這會將當前分支重置到提交 1f0b2c6,並將工作目錄和索引回滾到該提交狀態。通過結合 git reflog 的結果,你可以更好地理解本地倉庫的引用變更歷史,並使用相應的 Git 命令進行恢復、找回或撤銷操作。這對於糾正錯誤或恢復意外操作非常有用。

  最後總結一下:在實際使用中,git log 用於查看提交歷史,幫助你理解項目的發展和更改。而 git reflog 則是在需要恢復誤操作或追蹤引用變更歷史時使用的工具。通常情況下,你會更頻繁地使用 git log,而 git reflog 則是一個輔助工具,用於處理特定的場景。

step5:等後面小陳遇到新的情況再補充吧

  希望小陳不會再犯這些小錯誤,當然git使用的熟悉後,可能會遇到更麻煩的事情,這時候查看git官網會更好。我這裏只是簡單的總結了一下小陳(一個初學者)遇到的小問題而已,如果各位看官看到了,請輕噴,謝謝!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章