如何在解决合并冲突时使用Git的默认提交信息?

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

168

根据文档,我刚刚尝试了这个简单的命令并且它对我起作用了:

git commit --no-edit
以后,运行git log以确认已经使用了默认消息。

6
可以使用更简短的命令 git log -1 查看最新提交记录。 - Lyubomyr Shaydariv
这似乎也适用于merge命令,例如git merge master --no-edit - amoebe

27

默认情况下,当合并失败时,要使用的提交消息将保存在git文件夹中的一个文件中,通常位于.git/MERGE_MSG。 解决冲突后运行 git commit 将使用该保存的消息作为默认编辑器的输入。

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

git commit --file .git/MERGE_MSG

19

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

GIT_EDITOR=true git commit

我喜欢这个。:) 尽管我仍然认为这个问题表明开发过程中存在更深层次的问题。如果程序员处于“想要”无意义合并消息的情况下,他们可能并没有真正合并两个叉,并且只是从上游集成了新的更改。这就是一个变基。 - Andy Ross
1
哦,我同意你可能希望你的程序员考虑他们的合并消息 - 但那不是问题;)。但是,由于您的分支已发布,您经常需要执行微不足道的合并,因此无法进行变基。 - Chronial
我不太确定这是如何工作的。更改编辑器如何防止git commit -m“Merge Commit”语法覆盖生成的默认提交消息?我的问题是,我想在提交消息中保留所有合并冲突文件的列表。 - yoyodyn
它不会 - 在git(或大多数其他工具)中没有办法阻止它执行已明确告知的操作。如果您不想设置提交消息,请不要使用“-m”。我的答案只是防止编辑器弹出。 - Chronial
这对使用git进行“实验”脚本非常有用。例如,https://gist.github.com/jhoblitt/6bb4305e0b548e8e0de9 - Joshua Hoblitt

5
显然,这里的“正确”答案是让您的开发人员遵循团队生成合并提交的正确做法。请注意,您想要的行为曾经是默认设置,只有最近Git才开始要求针对合并使用“人工生成”的提交消息。这样做是有原因的,而这个原因不是让开发人员用无意义的消息来绕过流程。
也许开发人员应该在重置时而非合并提交时进行操作?
话虽如此,合并提交是git fmt-merge-msg的输出,您需要向其提供合并提交的父级。

2
这个命令怎么使用?文档说它期望通过 stdin 提供合并对象。我尝试将其作为管道输入,也尝试通过文件提供父级的修订号,但它一直抛出一个“fatal: Error in line 1:...” 的错误。 - Maic López Sáenz
1
重新定义一个分支不会像合并一样引起冲突,这是为什么呢? - randombits
1
@randombits 这仍需要冲突解决,但不会生成合并提交。 - RJFalconer

4

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 选项,因此建议在结束合并之前使用编辑器修改提交消息。

2
您可以使用默认的"git commit"命令,不需要任何消息。 这将在您的控制台中触发VIM编辑器。 默认消息将出现在VIM中,只需使用命令“:wq”来应用合并并退出VIM。
以下是步骤说明:
git commit (hit enter)

:wq (to exit and apply merge in VIM editor)

1
$git commit --amend --no-edit
  • 它将使用你之前提交的信息,并且不会发生任何改变。
  • 当你解决任何合并冲突并希望使用主代码中的你之前提交的消息并在你的特性分支中应用以避免冲突时,它会很有帮助。

0
如果你真的想要强制执行这个规则,那么可能有一种方法可以使用 git 钩子来强制执行。
每次出现合并冲突时,都会显示一个“合并差异”,其中会显示哪些文件发生了冲突:git diff HEAD HEAD^1 HEAD^2 --name-only。我不知道技术上是否可能让合并差异显示比仅仅是冲突文件更多的文件。
但是,假设它按照我们想要的方式工作(这是一个假设),那么你可以有一个 git commit-msg 钩子来检查用户输入的消息并断言:
  1. 这是一个合并提交吗?
  2. 如果是,合并差异是否显示文件?
  3. 如果是,字符串“Conflicts:”是否跟随这些文件名?
如果这些条件失败,则让脚本打印出错误说明,并返回非零以中止提交。你可以让开发人员安装这个提交钩子,或者你也可以在服务器上安装它来确保强制执行。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接