用 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** 也將保留在暫存區中。

更新於:2021年4月30日

763 次瀏覽

啟動您的 職業生涯

透過完成課程獲得認證

開始
廣告