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

时间:2012-12-19 21:50:18

标签: git merge message commit conflict

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

谢谢

7 个答案:

答案 0 :(得分:73)

Per the docs,我只是尝试了这个简单的命令,它对我有用:

git commit --no-edit

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

答案 1 :(得分:18)

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

如果消息没有自行获取,可以使用--file选项输入git命令,该选项从文件中读取提交消息:

git commit --file .git/MERGE_MSG

答案 2 :(得分:14)

只需将编辑器设置为无效的命令:

GIT_EDITOR=true git commit

答案 3 :(得分:7)

显然,这里的“正确”答案是让您的开发人员在生成合并提交时为您的团队遵循正确的做法。请注意,您希望以前的行为是默认行为,并且最近只有git开始要求合并的“人工生成”提交消息。这是有原因的,并不是说开发人员会用无意义的消息来短路过程。

也许开发人员在他/她应该改变时会生成合并提交吗?

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

答案 4 :(得分:3)

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键,因为我无法使用bash在生成的命令中处理Git发出的引号(否则git commit会在合并期间抱怨部分提交)。

两天前released的Git 2.12.0引入git merge --continue来进行合并提交,该合并提交在合并期间因冲突而停止。它也适用于子模块,但至少还不接受--no-edit,因此建议编辑器在结束合并之前更改提交消息。

答案 5 :(得分:1)

您可以使用没有消息的默认 "git commit"。这将触发控制台中的 VIM 编辑器。 VIM 中会出现默认消息,只需使用命令 ":wq" 应用合并并退出 VIM。

以下步骤演练:

git commit (hit enter)

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

答案 6 :(得分:0)

如果你真的想强制执行这条规则,那么可能有办法使用git hooks强制执行此规则。

每次发生合并冲突时,“组合差异”都会显示哪些文件存在冲突:git diff HEAD HEAD^1 HEAD^2 --name-only。我不知道从技术上讲,组合差异是否可以显示更多文件,而不仅仅是冲突文件。

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

  1. 这是合并提交吗?
  2. 若然,合并差异显示文件?
  3. 如果是,字符串“Conflicts:”后跟那些文件名吗?
  4. 如果这些条件失败,则让脚本打印以显示错误的解释,然后返回非零以中止提交。您可以让开发人员安装此提交挂钩,或者您也可以将其安装在服务器上以确保执行它。