解决合并冲突后如何使用默认的 git 提交消息?

在执行合并和解决冲突之后,是否有一种“简单”的方法可以从命令行接受默认生成的提交消息?我们的一个开发人员将解决所有的冲突,然后执行一个 git commit -m"Merge Commit"来替换生成的提交消息,该消息列出了所有的冲突文件。我希望有一个不同的标志,只是采取当前文件没有修改。我知道有一个-F 或—— file = 选项,但这需要始终知道文件名。

谢谢你

42708 次浏览

只需将编辑器设置为一个不执行任何操作的命令:

GIT_EDITOR=true git commit

显然,这里的“正确”答案是让您的开发人员在生成合并提交时遵循您的团队的正确实践。请注意,您想要的行为曾经是默认行为,而且直到最近 git 才开始要求“人工生成”合并提交消息。这是有原因的,并不是为了让开发人员用一个毫无意义的信息来缩短这个过程。

也许开发人员正在生成合并提交,而他/她应该重新定基?

也就是说,合并提交是 git fmt-merge-msg的输出,您必须向合并提交的父级提供 git fmt-merge-msg

默认情况下,当合并失败时,将要使用的提交消息保存在 git 文件夹中的一个文件中,通常是 .git/MERGE_MSG。冲突解决后,运行 git commit将把这条保存的消息提供给默认编辑器。

如果消息本身没有被拾取,那么可以使用 --file选项将其提供给 git 命令,该选项从文件中读取提交消息:

git commit --file .git/MERGE_MSG

如果您真的想强制执行这个规则,那么可能有一种方法可以使用 git 钩子强制执行这个规则。

每次出现合并冲突时,“合并差异”将显示哪些文件发生了冲突: git diff HEAD HEAD^1 HEAD^2 --name-only。我不知道是否从技术上来说,这是可能的组合差异显示 更多文件比只是冲突的。

但是,假设它像我们想要的那样工作(这是一个假设) ,那么您可以拥有一个 git commit-msg钩子,它检查消息 用户输入的并断言

  1. 这是合并提交吗?
  2. 如果是,组合 diff 是否显示文件?
  3. 如果是,字符串“冲突:”后面是否跟着这些文件名?

如果这些条件失败,那么让脚本打印来屏幕显示错误的解释,然后返回非零值来中止提交。您可以让开发人员安装这个提交钩子,或者您也可以将其安装在服务器上以确保实施它。

根据 那些文件,我只是尝试了这个简单的命令,它对我很有效:

git commit --no-edit

然后,运行 git log以确认使用了默认消息。

上面提到的 git commit --file .git/MERGE_MSG很好,但它忽略了几点:

  • 工作目录不是最顶端的目录
  • 当前存储库是一个 Git 子模块,因此没有 .git目录,只有一个文件 .git

还可以选择:

  • MERGE_MSG包含有关具有冲突的文件的一些信息。

前两点可以与 git rev-parse一起使用:

git commit -F "$(git rev-parse --git-dir)/MERGE_MSG"

或者,使用 Git 别名:

commit-merge = !cat $(git rev-parse --git-dir)/MERGE_MSG | git commit -F -

这在“普通”存储库和子模块中都可以工作。如果应该丢弃标记为 #的冲突标记,为了简单起见,只能使用合并消息的第一行:

git commit -m $(head -1 $(git rev-parse --git-dir)/MERGE_MSG)

或者另一个化名:

commit-merge = !head -1 $(git rev-parse --git-dir)/MERGE_MSG | git commit -F -

我必须在别名中使用 -F键,因为我不能让 Git 发出引号,以便在使用 bash 生成的命令中进行处理(否则 git commit会在合并期间报告部分提交)。


两天前还是 释放的 Git 2.12.0引入了 git merge --continue来进行合并提交,该提交在合并过程中由于冲突而停止。它对于子模块也可以正常工作,但是不接受 --no-edit,至少现在还不能,因此建议编辑器在结束合并之前更改提交消息。

可以使用没有消息的默认 “笨蛋承诺”。这将触发控制台中的 VIM 编辑器。默认消息将出现在 VIM 中,只需使用命令 “ : wq”应用合并和退出 VIM 即可。

以下步骤的演练:

git commit (hit enter)


:wq (to exit and apply merge in VIM editor)
$git commit --amend --no-edit
  • 它将采取您以前提交的消息,什么都不会改变。
  • 当您解析任何 merge conflict并希望获取以前提交的消息并在 feature branch中应用主代码以避免冲突时,这将很有帮助。