以 Git 為例解釋混合重置


混合重置會將 HEAD 指標移動到指定的提交。這是 git 中的預設重置選項。它還會將提交快照的內容複製到暫存區,而不是工作目錄。這將導致覆蓋暫存區。在這種情況下,工作目錄內容將是安全的。讓我們透過一個例子來理解這一點。

示例

該圖顯示了 Git 儲存庫中名為 File1.txt 的檔案。A、B、C 和 D 表示新增到檔案中的行。該圖表明在新增每行 A、B 和 C 後都會執行提交。c1 是新增行 A 後執行的提交,c2 是新增行 B 後執行的提交,而 C3 表示新增行 C 後執行的提交。現在新增行 D。此更改在工作目錄中可用,並且此更改已暫存但尚未提交。

現在,如果我們執行混合重置並將 master 分支的 HEAD 指向 c1 提交,那麼我們不會丟失工作目錄中的更改。在我們的例子中,包含內容 D 的行將保留在工作目錄中。但是,如果內容 D 已暫存,則暫存的內容將丟失,因為混合模式會替換暫存區,同時保持工作目錄不變。

步驟 1 - 建立一個儲存庫,新增包含內容 A 的 File1.txt,並提交更改,如所示

$ dell@DESKTOP-N961NR5 MINGW64 /e/tut_repo
$ 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)
$ cat File1.txt
A

$ 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) f12b5e8] A
1 file changed, 1 insertion(+)
create mode 100644 File1.txt

步驟 2 - 如上圖所示,再進行 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 a704cbd] 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 31aa99f] c
1 file changed, 1 insertion(+)

$ dell@DESKTOP-N961NR5 MINGW64 /e/tut_repo (master)
$ git log --oneline
31aa99f (HEAD -> master) c
a704cbd B
f12b5e8 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,即我們的第一次提交。當我們執行此類重置時,git 僅替換暫存區。因此,工作目錄中檔案中的當前更改不受影響。該檔案將包含所有四行內容 A、B、C、D

$ git reset --mixed HEAD~2
Unstaged changes after reset:
M File1.txt

$ dell@DESKTOP-N961NR5 MINGW64 /e/tut_repo (master)
$ git status -s
M File1.txt

$ dell@DESKTOP-N961NR5 MINGW64 /e/tut_repo (master)
$ cat File1.txt
A
B
c
D
$ git diff
diff --git a/File1.txt b/File1.txt
index f70f10e..b9b94a9 100644
--- a/File1.txt
+++ b/File1.txt
@@ -1 +1,4 @@
A
+B
+c
+D

執行混合重置後,工作目錄中執行的更改保持不變。該檔案將包含所有四行。但是,暫存區中的更改將被第一次提交的內容快照(內容 A)替換。

更新於: 2021 年 4 月 30 日

219 次檢視

開啟您的 職業生涯

透過完成課程獲得認證

開始學習
廣告

© . All rights reserved.