雖然說 ”好記性不如爛筆頭”,但是學習不看等於沒學,學習不用等於不會,所以說”實戰纔是檢驗真理的唯一標準“,通過實戰則會學到很多東西。
因爲陳** 太懶,並且不喜歡查百度,老是犯同樣的問題,於是我通過完整的操作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 add
和git 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
規則示例:
-
忽略特定文件或文件夾:
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
文件的步驟:
-
定位
.gitconfig
文件:- 在 Windows 系統上,
.gitconfig
文件通常位於你的用戶主文件夾下(例如:C:\Users\YourUsername
)。 - 在類 Unix 系統上(如 Linux 和 macOS),
.gitconfig
文件位於你的用戶主目錄下(例如:/Users/YourUsername
)。
- 在 Windows 系統上,
-
編輯
.gitconfig
文件:你可以使用任何文本編輯器來編輯
.gitconfig
文件。你可以在終端使用命令行編輯器如nano
或vim
,也可以使用圖形界面的編輯器如 Notepad(Windows)、TextEdit(macOS)、VS Code 等。打開終端(或命令提示符)並輸入以下命令來編輯
.gitconfig
文件:
git config --global --edit
這將打開默認文本編輯器,並在其中顯示 .gitconfig
文件的內容。
關於配置選項:
-
在打開的
.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]
部分設置一些常用的別名命令。
-
保存文件:
在編輯完成後,保存文件並關閉文本編輯器。
-
驗證配置:
可以使用以下命令來查看當前的全局配置:
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.file
和 git 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 log
和 git 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 reset
或git 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官網會更好。我這裏只是簡單的總結了一下小陳(一個初學者)遇到的小問題而已,如果各位看官看到了,請輕噴,謝謝!