Git修改-在子分支上看不到修改提交的更改

时间:2019-05-03 11:27:14

标签: git git-commit

我做了以下事情:

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的更改... 更改在哪里,如何解决此问题?

2 个答案:

答案 0 :(得分:3)

发生了什么事

您做了您所做的,并得到了:

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

答案 1 :(得分:1)

一个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并以此方式进行修改。