用 Git 例子解釋軟重置
軟重置會將 HEAD 指標移動到指定的提交。這不會重置暫存區或工作目錄。
示例
該圖顯示了 Git 倉庫中名為 *File1.txt* 的檔案。A、B、C 和 D 代表新增到檔案中的行。該圖表明在新增每行 A、B 和 C 後都會執行提交。*c1* 是新增行 A 後執行的提交,*c2* 是新增行 B 後執行的提交,*c3* 代表新增行 C 後執行的提交。
現在新增行 D。此更改在工作目錄中可用,此更改已暫存,但尚未提交。現在讓我們執行軟重置,使 master 分支的 HEAD 指向提交 *c1*。軟重置後,HEAD 將指向提交 *c1*,而不會更改暫存區或工作區中的任何內容。
步驟 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) c2bd7e5] A 1 file changed, 1 insertion(+) create mode 100644 File1.txt
步驟 2 - 使用內容 B 和 C 執行另外 2 次提交,如上圖所示。
$ 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 05cf92e] 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 36361c2] C 1 file changed, 1 insertion(+) $ dell@DESKTOP-N961NR5 MINGW64 /e/tut_repo (master) $ git log --oneline 36361c2 (HEAD -> master) C 05cf92e B c2bd7e5 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 指標向後移動兩次提交。但是,暫存區和工作目錄不會進行任何更改。
$ dell@DESKTOP-N961NR5 MINGW64 /e/tut_repo (master) $ git log --oneline 36361c2 (HEAD -> master) C 05cf92e B c2bd7e5 A $ dell@DESKTOP-N961NR5 MINGW64 /e/tut_repo (master) $ git reset --soft HEAD~2 $ dell@DESKTOP-N961NR5 MINGW64 /e/tut_repo (master) $ git log --oneline c2bd7e5 (HEAD -> master) A $ 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 status On branch master Changes to be committed: (use "git restore --staged <file>..." to unstage) modified: File1.txt
如下圖所示,當我們執行軟重置時,Git 只會將 HEAD 移動到指定的提交,而不會影響工作區和暫存區。軟重置後,我們的工作目錄將包含檔案中的所有四行。暫存的更改 **- 內容 D** 也將保留在暫存區中。
廣告