git merge squash 和反复出现的冲突

标签 git version-control git-branch git-squash

我有一个带有 masteralt 分支的 git 存储库。 alt 分支包含 master 代码的修改版本,我正在尝试 merge 从 masteralt 的更改,就像这样:

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 的有用用途

  1. 将一个完全完成的功能分支 merge 到master。我会将所有有用的信息积累到压缩的提交中,但特别不希望此功能的增量开发历史污染 master 提交时间线。
  2. 将几个独立的功能(或来自不同开发人员的贡献) merge 到同一个集成分支中,同样不保留它们的增量历史记录。我可以将它们全部 rebase ,然后使用rebase -i 压缩它们的提交,但这更容易

squash 的无用用法

您希望保持历史和祖先元数据完整的任何 merge ,例如您希望重复递归 merge 正常工作的任何时间,特别是 OP 正在尝试做

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

关于git merge squash 和反复出现的冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11797904/

相关文章:

git - 保持 .git 尽可能小

version-control - 二进制增量存储

svn - 将历史从 SVN 导入/导出到 TFS

php - Git for Web Development(过程方法)

git - 如何基于现有的 Github 分支创建新分支? (请阅读 - 试过初学者指南)

git - 将文件添加到 git 的阶段没有任何作用,也无法提交

Git 文本不可见

linux - GitHub 帮助 - 将文件夹推送到存储库

git - 命令确定当前 HEAD 的上游 ref?

git 将本地提交的更改移动到新分支并推送