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
我做了以下事情:
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