git merge: 有没有办法在没有合并冲突的情况下对涉及到的文件进行操作?

git merge: there is a way to operate on the files involved even if there isn't merge conflict?

当且仅当两个分支在合并前对同一行进行了修改时,才会发生合并冲突。然而,即使没有发生合并冲突,也可能是两个完美工作的分支合并的结果不起作用。有一种方法可以预合并两个分支,处理应该由合并产生的文件(可能还有 add/delete/modify 其他文件),然后提交合并结果?我试过了,但只有当合并冲突发生并且只在涉及的代码行上时,我才有这种可能性。我确定这可以在 git 中完成(我不是唯一遇到此问题的人)但我不知道要启动的命令顺序。

git merge --no-commit <branchName>

就是为了这个目的(见doc)。

(之后你不需要做git merge --continue,当当前状态适合你的需要时提交你的工作。不要忘记add你可以引入的任何修改你的非提交合并之后)

您也可以先进行合并,然后对其进行测试,修复问题,最后 git commit --amend 在推送之前对合并提交进行修复。

(这应该是评论,但有点长,需要一些格式。)

写这篇文章的时候有两个答案:

  • git merge --no-commit,调整结果(并根据需要调整 git add),并使用 git commitgit merge --continue 提交;或
  • git merge,测试和修复(和 git add 根据需要),并使用 git commit --amend 将旧的合并提交推开,用新的和替换它-改进了一个。

两者都可以。但是请注意,有一种观点认为您永远不应该执行其中任何一项,因为将来不可能使用自动化系统重复合并。我不清楚订阅此规则的人更喜欢哪个选项,因为有两个选项:

  • 在合并之前,进行一次(或多次提交)准备好所有内容,以便自动合并成功并产生有效结果。
  • 或者,在自动合并成功但产生无效结果后,进行后续提交以修复它。

在任何一种情况下,任何 "prepare" 或 "fix" 提交,以及任何 自己 不起作用的提交都应该有一个解释日志消息。如果是合并本身不起作用,请注意在合并提交的日志消息中:将毫无意义的 merge branch <name> 消息替换为类似以下内容:

automatic but broken merge of branch <name>

This merge has the contents that Git produces on its own,
and exists so that someone who is repeating the work in the
future can do it automatically as well, and compare.  The
*next* commit contains the manual change that makes the
merge functional, so when bisecting, use the *next* commit,
not this one.

当然,如果您更喜欢 "don't make broken commits on purpose" 的思想流派,您只需合并并修复(使用 --no-commit--amend,无论您喜欢哪个) .