我有一个带有 master
和 alt
分支的 git 存储库。 alt
分支包含 master
代码的修改版本,我正在尝试 merge 从 master
到 alt
的更改,就像这样:
git merge --squash master
在冲突中 merge 结果:
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
时(没有在任何分支上进行任何更改)我将得到相同的冲突错误。
这是为什么呢?我错过了什么?
最佳答案
通过压缩
merge ,您创建了一个具有 merge 效果但实际上不是 merge 的提交。
也就是说,工作树具有您期望的修改,但元数据没有:关键是,提交没有两个父项(一个在 master
上,另一个在 alt
),因此后续 merge 无法找出最后的共同祖先。
squash
的有用用途
- 将一个完全完成的功能分支 merge 到
master
。我会将所有有用的信息积累到压缩的提交中,但特别不希望此功能的增量开发历史污染master
提交时间线。 - 将几个独立的功能(或来自不同开发人员的贡献) merge 到同一个集成分支中,同样不保留它们的增量历史记录。我可以将它们全部 rebase ,然后使用
rebase -i
压缩它们的提交,但这更容易
squash 的无用用法
您希望保持历史和祖先元数据完整的任何 merge ,例如您希望重复递归 merge 正常工作的任何时间,特别是 OP 正在尝试做。
squash
并不是一个很好的默认设置,这就是为什么它不是默认设置的原因。
关于git merge squash 和反复出现的冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11797904/