I have a branch which I pulled from master branch. Let's call it integration.
In the integration branch, I made various commits (C1, C2, C3). When I am done, I made a Pull Request to the master branch. From the master branch, I did a "Squash and Merge" so it results in only a single commit in the master. This all seems great.
But then later, I made some additional changes to the integration branch and when I make a pull request again, I am seeing all the commit comments of previous changes (C1, C2, C3, C4) that I have already committed. This issue is not seen if I use the default "Create an Merge commit" in my earlier commit. What did I do wrong?
答案 0 :(得分:7)
视觉上更容易理解。这是你的回购。 master
位于提交B
,您的feature
分支位于提交C3
。
A - B [master]
\
C1 - C2 - C3 [feature]
正常合并会这样做。添加了一个新的合并提交BC123
,将master
中的内容与feature
中的内容相结合。历史是联系在一起的。请注意feature
不会移动,它仍然在C3
。
A - B ------------- BC123 [master]
\ /
C1 - C2 - C3 [feature]
壁球和合并就是这样。
A - B ------------- BC123 [master]
\
C1 - C2 - C3 [feature]
BC123
包含与之前相同的合并内容,但与feature
分支没有任何关联。同样,feature
不会改变。 feature
不会被压扁,它会四处乱窜。相反,BC123
包含来自feature
的压缩变更。
当您在feature
上完成更多工作时,在此处提交C4
和C5
,就会发生这种情况。
A - B ------------- BC123 [master]
\
C1 - C2 - C3 - C4 - C5 [feature]
当您发出提款请求时,feature
中的所有更改都不会显示在master
中。至于Git关注的是C1
到C5
。如果你要挤压&再次合并,master
会有一个新的提交,但只有C4和C5的内容,因为Git非常善于找出分支之间的重复内容。
A - B ------------- BC123 - C45 [master]
\
C1 - C2 - C3 - C4 - C5 [feature]
虽然可以以这种方式工作,但这很令人困惑。
长话短说:一旦你合并了一个分支,就再也不用了。删除它。如果你需要做更多工作,请打开一个新分支。
如果我在之前的提交中使用默认的“创建合并提交”,则不会出现此问题。
回到合并版本......
A - B ------------- BC123 [master]
\ /
C1 - C2 - C3 [feature]
如果您在feature
...
A - B ------------- BC123 [master]
\ /
C1 - C2 - C3 - C4 - C5 [feature]
然后执行拉取请求,Git会向您显示feature
中不在master
中的提交。由于合并,master
包含C1
,C2
和C3
。因此PR只向您显示C4
和C5
。这仍然令人困惑,同样的建议适用:合并分支后,删除它。如果你需要做更多工作,请打开另一个。
壁球&合并更简单,合并(完成正确)为Git提供了更健康的历史和更多信息。如果您了解分支和合并的工作原理,您将从Git中获得更多。
答案 1 :(得分:3)
如果我理解你的情况正确......
你做错的主要事情是在合并之后继续使用分支。合并后,删除分支。额外的工作应该在一个新的分支上。
第一次"壁球和合并"不影响整合分支;集成提交如何出现在主分支上。因此,有意义的是A,B和&由于您正在重复使用旧分支,因此C仍然存在。
祝你好运。