以 Git 为例解释混合重置
混合重置会将 HEAD 指针移动到指定的提交。这是 git 中的默认重置选项。它还会将提交快照的内容复制到暂存区,而不是工作目录。这将导致覆盖暂存区。在这种情况下,工作目录内容将是安全的。让我们通过一个例子来理解这一点。
示例
该图显示了 Git 存储库中名为 File1.txt 的文件。A、B、C 和 D 表示添加到文件中的行。该图表明在添加每行 A、B 和 C 后都会执行提交。c1 是添加行 A 后执行的提交,c2 是添加行 B 后执行的提交,而 C3 表示添加行 C 后执行的提交。现在添加行 D。此更改在工作目录中可用,并且此更改已暂存但尚未提交。
现在,如果我们执行混合重置并将 master 分支的 HEAD 指向 c1 提交,那么我们不会丢失工作目录中的更改。在我们的例子中,包含内容 D 的行将保留在工作目录中。但是,如果内容 D 已暂存,则暂存的内容将丢失,因为混合模式会替换暂存区,同时保持工作目录不变。
步骤 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) f12b5e8] A 1 file changed, 1 insertion(+) create mode 100644 File1.txt
步骤 2 - 如上图所示,再进行 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 a704cbd] 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 31aa99f] c 1 file changed, 1 insertion(+) $ dell@DESKTOP-N961NR5 MINGW64 /e/tut_repo (master) $ git log --oneline 31aa99f (HEAD -> master) c a704cbd B f12b5e8 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,即我们的第一次提交。当我们执行此类重置时,git 仅替换暂存区。因此,工作目录中文件中的当前更改不受影响。该文件将包含所有四行内容 A、B、C、D
$ git reset --mixed HEAD~2 Unstaged changes after reset: M File1.txt $ 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 diff diff --git a/File1.txt b/File1.txt index f70f10e..b9b94a9 100644 --- a/File1.txt +++ b/File1.txt @@ -1 +1,4 @@ A +B +c +D
执行混合重置后,工作目录中执行的更改保持不变。该文件将包含所有四行。但是,暂存区中的更改将被第一次提交的内容快照(内容 A)替换。
广告