我有一个从 master 分支中 pull 出的分支。我们称之为集成。
在集成分支中,我进行了各种提交(C1、C2、C3)。完成后,我向 master 分支发出了 Pull Request。从 master 分支,我做了一个“Squash and Merge”,所以它只在 master 中产生了一个提交。这一切看起来都很棒。
但后来,我对集成分支做了一些额外的更改,当我再次发出 pull 请求时,我看到了我已经提交的先前更改(C1、C2、C3、C4)的所有提交评论。如果我在之前的提交中使用默认的“创建 merge 提交”,则不会出现此问题。我做错了什么?
最佳答案
视觉上更容易理解。这是你的 repo 协议(protocol)。 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 了一个分支,就不要再处理它了。删除它。如果您需要做更多工作,请打开一个新分支。
This issue is not seen if I use the default "Create an Merge commit" in my earlier commit.
回到 merge 后的版本...
A - B ------------- BC123 [master]
\ /
C1 - C2 - C3 [feature]
如果您在功能
上做更多的工作...
A - B ------------- BC123 [master]
\ /
C1 - C2 - C3 - C4 - C5 [feature]
然后执行 pull 请求,Git 将向您显示 feature
中不在 master
中的提交。由于 merge ,master
包含C1
、C2
和C3
。所以 PR 只显示了 C4
和 C5
。这仍然令人困惑,同样的建议适用: merge 分支后,将其删除。如果您需要做更多工作,请打开另一个。
虽然压缩和 merge 更简单,但 merge (正确完成)为 Git 提供了更健康的历史记录和更多信息。如果您了解分支和 merge 的工作原理,您将会从 Git 中获得更多 yield 。
关于Github "Squash and Merge"- 显示所有先前更改的后续 pull 请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49200667/