用 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 覆盖。下图显示了这一点。
广告