用 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 覆蓋。下圖顯示了這一點。

更新於:2021年4月29日

156 次瀏覽

啟動您的職業生涯

透過完成課程獲得認證

開始
廣告