以 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)替换。

更新于: 2021 年 4 月 30 日

219 次查看

开启您的 职业生涯

通过完成课程获得认证

开始学习
广告