关于版本控制:git merge squash和重复发生的冲突

git merge squash and recurring conflicts

我有一个masteralt分支的git存储库。 alt分支包含master代码的修改版本,并且我试图像这样合并从masteralt的更改:

1
git merge --squash master

合并导致冲突:

1
2
3
4
Auto-merging myproject/foo/bar
CONFLICT (content): Merge conflict in myproject/foo/bar
Squash commit -- not updating HEAD
Automatic merge failed; fix conflicts and then commit the result.

解决冲突并提交更改后,一切似乎都很好,但是当我再次运行git merge --squash master(不对任何分支进行任何更改)时,我也会遇到相同的冲突错误。

这是为什么? 我错过了什么?


通过squash合并,您已经创建了一个提交,该提交具有但实际上不是合并的作用。

也就是说,工作树具有您期望的修改,但是元数据却没有:至关重要的是,提交没有两个父项(一个在master上,一个在alt上),因此后续合并可以' t找出最后一个共同祖先。

squash的有用用途

  • 将完全完成的功能分支合并到master。我将在压缩的提交中累积任何有用的信息,但是特别是不希望此功能的增量开发历史污染master提交时间轴。
  • 将几个独立的功能(或来自不同开发人员的贡献)合并到同一集成分支中,而又不保留其增量历史。我可以将它们重新组合在一起,然后使用rebase -i压缩它们的提交,但这更容易
  • squash的无用用法

    您希望保留历史记录和祖先元数据完整的任何合并,例如您希望重复递归合并正确进行的任何时间,特别是OP尝试执行的操作。

    squash并不是一个很好的默认值,这就是为什么它不是默认值的原因。