用 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 次浏览

启动您的 职业生涯

通过完成课程获得认证

开始
广告
© . All rights reserved.