用 Git 例子解释硬重置


该图显示了 Git 仓库中名为 *File1.txt* 的文件。A、B、C 和 D 代表添加到文件中的行。该图表明在添加 A、B 和 C 行后执行了提交。*c1* 是添加 A 行后执行的提交,*c2* 是添加 B 行后执行的提交,*c3* 代表添加 C 行后执行的提交。现在添加 D 行。此更改在工作目录中可用,并且此更改已暂存但尚未提交。

现在,如果我们执行硬重置以将主分支的 HEAD 指针向后移动两步 (*c1*),那么我们将丢失暂存区和工作目录中的所有更改。在我们的例子中,工作目录的一部分 D 行将被删除。

步骤 1 − 创建一个仓库,添加内容为 -A 的 File1.txt,提交更改,如图所示。

$ 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)
$ git add .

$ dell@DESKTOP-N961NR5 MINGW64 /e/tut_repo (master)
$ git commit -m 'A'
[master (root-commit) 8679e6b] A
1 file changed, 1 insertion(+)
create mode 100644 File1.txt

步骤 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 6780ed4] 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 287a5a1] C
1 file changed, 1 insertion(+)

$ dell@DESKTOP-N961NR5 MINGW64 /e/tut_repo (master)
$ git log --oneline
287a5a1 (HEAD -> master) C
6780ed4 B
8679e6b 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,也就是我们的第一次提交。现在当我们重置提交时,让我们看看暂存的更改是否丢失。

$ dell@DESKTOP-N961NR5 MINGW64 /e/tut_repo (master)
$ git reset --hard HEAD~2
HEAD is now at 8679e6b A

$ dell@DESKTOP-N961NR5 MINGW64 /e/tut_repo (master)
$ cat File1.txt
A

$ dell@DESKTOP-N961NR5 MINGW64 /e/tut_repo (master)
$ git log --oneline
8679e6b (HEAD -> master) A

当我们将 HEAD 重置到我们的第一次提交时,我们观察到 Git 将第一次提交的内容快照(即内容 A)复制到暂存区和工作目录。由于此原因,在重置之前已暂存的内容 D 将丢失并被内容 A 覆盖。下图显示了这一点。

更新于:2021年4月29日

156 次浏览

启动您的职业生涯

通过完成课程获得认证

开始
广告