我有一个从 master 分支 pull 出来的分支。我们称之为集成。
在集成分支中,我进行了各种提交(C1、C2、C3)。完成后,我向 master 分支发出了一个 Pull Request。从主分支,我做了一个“挤压和 merge ”,所以它只在主分支中产生了一次提交。这一切看起来都很棒。
但后来,我对集成分支做了一些额外的更改,当我再次提出 pull 请求时,我看到了我已经提交的先前更改(C1、C2、C3、C4)的所有提交注释。如果我在之前的提交中使用默认的“创建 merge 提交”,则不会出现此问题。我做错了什么?
最佳答案
视觉上更容易理解。这是你的 repo 。 master
在提交 B
,你的 feature
分支在提交 C3
。
A - B [master]
\
C1 - C2 - C3 [feature]
正常的 merge 就是这样做的。添加了一个新的 merge 提交
BC123
,将 master
中的内容与 feature
中的内容结合起来。历史是联系在一起的。请注意, feature
没有移动,它仍然在 C3
。A - B ------------- BC123 [master]
\ /
C1 - C2 - C3 [feature]
挤压和 merge 就是这样做的。
A - B ------------- BC123 [master]
\
C1 - C2 - C3 [feature]
BC123
包含与以前相同的 merge 内容,但与 feature
分支没有联系。同样,feature
没有改变。 feature
没有被压扁,它会一直存在。相反, BC123
包含来自 feature
的压扁更改。当你在
feature
上做了更多的工作,提交 C4
和 C5
时,这发生了。A - B ------------- BC123 [master]
\
C1 - C2 - C3 - C4 - C5 [feature]
并且当您发出 pull 请求时,
feature
中而不是 master
中的所有更改都会出现。就 Git 而言,这是 C1
到 C5
。如果您再次压缩和 merge ,将在 master
上进行新的提交,但仅限于 C4 和 C5 的内容,因为 Git 非常擅长找出分支之间的重复内容。A - B ------------- BC123 - C45 [master]
\
C1 - C2 - C3 - C4 - C5 [feature]
虽然您可以通过这种方式工作,但这很令人困惑。
长话短说:一旦你 merge 了一个分支,就不要再处理它了。删除它。如果您需要做更多的工作,请打开一个新的分支。
回到 merge 版本...
A - B ------------- BC123 [master]
\ /
C1 - C2 - C3 [feature]
如果你在
feature
上做更多的工作......A - B ------------- BC123 [master]
\ /
C1 - C2 - C3 - C4 - C5 [feature]
然后执行 pull 请求,Git 将向您显示
feature
中不在 master
中的提交。由于 merge , master
包含 C1
、 C2
和 C3
。所以公关只显示你 C4
和 C5
。这仍然令人困惑,同样的建议也适用:一旦你 merge 了一个分支,就删除它。如果您需要做更多的工作,请打开另一个。虽然压缩和 merge 更简单,但 merge (正确完成)为 Git 提供了更健康的历史记录和更多信息。如果您了解分支和 merge 的工作原理,您将从 Git 中获得更多 yield 。
关于Github "Squash and Merge"- 显示所有先前更改的后续 pull 请求,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49200667/