用 Git 例子解釋硬重置
該圖顯示了 Git 倉庫中名為 *File1.txt* 的檔案。A、B、C 和 D 代表新增到檔案中的行。該圖表明在新增 A、B 和 C 行後執行了提交。*c1* 是新增 A 行後執行的提交,*c2* 是新增 B 行後執行的提交,*c3* 代表新增 C 行後執行的提交。現在新增 D 行。此更改在工作目錄中可用,並且此更改已暫存但尚未提交。
現在,如果我們執行硬重置以將主分支的 HEAD 指標向後移動兩步 (*c1*),那麼我們將丟失暫存區和工作目錄中的所有更改。在我們的例子中,工作目錄的一部分 D 行將被刪除。
步驟 1 − 建立一個倉庫,新增內容為 -A 的 File1.txt,提交更改,如圖所示。
$ git init Initialized empty Git repository in E:/tut_repo/.git/ $ dell@DESKTOP-N961NR5 MINGW64 /e/tut_repo (master) $ echo A>File1.txt $ dell@DESKTOP-N961NR5 MINGW64 /e/tut_repo (master) $ git add . $ dell@DESKTOP-N961NR5 MINGW64 /e/tut_repo (master) $ git commit -m 'A' [master (root-commit) 8679e6b] A 1 file changed, 1 insertion(+) create mode 100644 File1.txt
步驟 2 − 如上圖所示,再進行兩次提交,內容分別為 B 和 C。
$ dell@DESKTOP-N961NR5 MINGW64 /e/tut_repo (master) $ echo B>>File1.txt $ dell@DESKTOP-N961NR5 MINGW64 /e/tut_repo (master) $ cat File1.txt A B $ dell@DESKTOP-N961NR5 MINGW64 /e/tut_repo (master) $ git add . $ dell@DESKTOP-N961NR5 MINGW64 /e/tut_repo (master) $ git commit -m 'B' [master 6780ed4] B 1 file changed, 1 insertion(+) $ dell@DESKTOP-N961NR5 MINGW64 /e/tut_repo (master) $ echo C>>File1.txt $ dell@DESKTOP-N961NR5 MINGW64 /e/tut_repo (master) $ cat File1.txt A B C $ dell@DESKTOP-N961NR5 MINGW64 /e/tut_repo (master) $ git add . $ dell@DESKTOP-N961NR5 MINGW64 /e/tut_repo (master) $ git commit -m 'C' [master 287a5a1] C 1 file changed, 1 insertion(+) $ dell@DESKTOP-N961NR5 MINGW64 /e/tut_repo (master) $ git log --oneline 287a5a1 (HEAD -> master) C 6780ed4 B 8679e6b A
步驟 3 − 在工作目錄中進行更改以新增內容 D 並暫存更改。
$ dell@DESKTOP-N961NR5 MINGW64 /e/tut_repo (master) $ echo D>>File1.txt $ dell@DESKTOP-N961NR5 MINGW64 /e/tut_repo (master) $ cat File1.txt A B C D $ dell@DESKTOP-N961NR5 MINGW64 /e/tut_repo (master) $ git add . $ dell@DESKTOP-N961NR5 MINGW64 /e/tut_repo (master) $ git status -s M File1.txt
步驟 4 − 現在讓我們將 HEAD 重置到前兩次提交 HEAD~2,也就是我們的第一次提交。現在當我們重置提交時,讓我們看看暫存的更改是否丟失。
$ dell@DESKTOP-N961NR5 MINGW64 /e/tut_repo (master) $ git reset --hard HEAD~2 HEAD is now at 8679e6b A $ dell@DESKTOP-N961NR5 MINGW64 /e/tut_repo (master) $ cat File1.txt A $ dell@DESKTOP-N961NR5 MINGW64 /e/tut_repo (master) $ git log --oneline 8679e6b (HEAD -> master) A
當我們將 HEAD 重置到我們的第一次提交時,我們觀察到 Git 將第一次提交的內容快照(即內容 A)複製到暫存區和工作目錄。由於此原因,在重置之前已暫存的內容 D 將丟失並被內容 A 覆蓋。下圖顯示了這一點。
廣告