我有一个从 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 上做了更多的工作,提交 C4C5 时,这发生了。
A - B ------------- BC123 [master]
     \
      C1 - C2 - C3 - C4 - C5 [feature]

并且当您发出 pull 请求时,feature 中而不是 master 中的所有更改都会出现。就 Git 而言,这是 C1C5 。如果您再次压缩和 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 包含 C1C2C3 。所以公关只显示你 C4C5 。这仍然令人困惑,同样的建议也适用:一旦你 merge 了一个分支,就删除它。如果您需要做更多的工作,请打开另一个。

虽然压缩和 merge 更简单,但 merge (正确完成)为 Git 提供了更健康的历史记录和更多信息。如果您了解分支和 merge 的工作原理,您将从 Git 中获得更多 yield 。

关于Github "Squash and Merge"- 显示所有先前更改的后续 pull 请求,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49200667/

10-14 15:40
查看更多