以 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)替換。

廣告
資料結構
網路
關係資料庫管理系統
作業系統
Java
iOS
HTML
CSS
Android
Python
C 程式設計
C++
C#
MongoDB
MySQL
Javascript
PHP