Git amend - 在子分支上看不到 amend commit changes 的变化

Git amend - dont see changes of amend commited changes on sub branch

我做了以下事情:

git checkout -b v1
<made some changes in the working directory, created commit c1 and push>
git checkout -b v2
<made some changes in the working directory, created commit c2 and push>
git checkout -b v3
<made some changes in the working directory, created commit c3 and push>
git checkout -b v4
<made some changes in the working directory, created commit c4 and push>

所以现在我有以下 git 树结构:

M --- v1 --- v2 --- v3 --- v4
.
.

我对 v1 进行了一些更改并执行了以下操作:

git checkout v1
<made some changes on working directory>
git add .
git commit --amend
git push origin v1 --force

现在,当我在 v4 上签出时,我没有看到我在 v1 上推送的提交 c1 的更改... 更改在哪里?我该如何解决这个问题?

一个 git 分支包含所有回到存储库开始的历史,而不仅仅是前一个分支的历史。修改或重新设置分支只会影响该分支的历史记录。尝试 运行 gitk --all 看看发生了什么。

您可以使用一系列变基来解决问题:

git rebase [sha of old v1] v2 --onto v1
git rebase [sha of old v2] v3 --onto v2
git rebase [sha of old v3] v4 --onto v3

但通常您不需要保留 v1 v2 和 v3 分支,因为它们的所有数据都在 v4 中。将来,如果您希望修改历史早期的提交,请使用 git rebase -i 并以这种方式修改它。

事情是这样的。

你做了你所做的并得到了这个:

M --- v1 --- v2 --- v3 --- v4

实际上,这并不完全正确,你有这个:

c1 --- c2 --- c3 --- c4 --- c5
^      ^      ^      ^      ^
M      v1     v2     v3     v4

您有 5 个提交和 5 个分支,每个分支都引用各自的提交。

然后你检查了 v1 并修改了那个提交,这反过来又给了你这张图片:

c1 --- c2 --- c3 --- c4 --- c5
^  \          ^      ^      ^
M   \         v2     v3     v4
     c2'
     ^
     v1

修改提交不会更改仍然引用旧提交的其他分支或标记或提交。它只是创建一个新的提交并将分支指向这个。

您需要做的是在新 v1 的基础上变基 v2,然后在新的 v2 基础上变基 v3,最后在新的 v3 基础上变基 v4。

这将是在 v3 之上重新设置 v2 的结果:

c1 --- c2 --- c3 --- c4 --- c5
^  \                 ^      ^
M   \                v3     v4
     c2' --- c3'
     ^       ^
     v1      v2

正如你在这里看到的,c3 被保留是因为 c4 仍然引用它,因此这个提交仍然是 v3 和 v4 的一部分。

最后,在对 v3 和 v4 进行变基后,您将得到:

c1 ( --- c2 --- c3 --- c4 --- c5 )
^  \                         
M   \                         
     c2' --- c3' --- c4' --- c5'
     ^       ^       ^       ^
     v1      v2      v3      v4

请注意,在磁盘上,c2-c5 仍然存在,但由于在这行提交的末尾没有分支或标记或其他提交,它们现在在日志中不可见,并且它们符合条件用于垃圾收集,这时不时发生。 GC 执行后,这就是您剩下的:

c1 
^  \                         
M   \                         
     c2' --- c3' --- c4' --- c5'
     ^       ^       ^       ^
     v1      v2      v3      v4

这当然是一样的:

c1 --- c2' --- c3' --- c4' --- c5'
^      ^       ^       ^       ^
M      v1      v2      v3      v4