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

问题描述 投票:0回答:8

在进行合并并解决冲突后,是否有一种“简单”的方法来接受从命令行默认生成的提交消息?

我们的一位开发人员将解决所有冲突,然后执行

git commit -m"Merge Commit"
替换列出所有冲突文件的生成的提交消息。我想要一个不同的标志,它只接受当前文件而不进行修改。我知道有一个
-F
--file=
选项,但这需要始终知道文件名。

git merge-conflict-resolution commit-message
8个回答
165
投票

根据文档,我只是尝试了这个简单的命令,它对我有用:

git commit --no-edit

然后,运行

git log

 确认已使用默认消息。


26
投票
默认情况下,当合并失败时,要使用的提交消息将保存在 git 文件夹中的文件中,通常是

.git/MERGE_MSG

。解决冲突后,运行 
git commit
 会将保存的消息提供给默认编辑器。

如果消息本身没有被拾取,则可以使用

--file

 选项将其提供给 git 命令,该选项从文件中读取提交消息:

git commit --file .git/MERGE_MSG
    

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

GIT_EDITOR=true git commit
    

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

也许开发人员正在生成合并提交,而他/她应该进行变基?

也就是说,合并提交是

git fmt-merge-msg

 的输出,您必须将合并提交的父级提供给它。


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
投票
,不带任何消息。这将触发控制台中的 VIM 编辑器。默认消息将出现在 VIM 中,只需使用命令

":wq" 应用合并并退出 VIM。 以下步骤的演练:

git commit (hit enter) :wq (to exit and apply merge in VIM editor)

$git commit --amend --no-edit

1
投票
它将接受您之前提交的消息,并且不会发生任何改变。
    当您解决任何
  • merge conflict
  • 并希望获取之前提交的消息并在
  • feature branch
     中应用主代码以避免冲突时,这将会很有帮助。
        
如果你真的想强制执行此规则,那么可能有一种方法可以使用 git hooks 强制执行此规则。

0
投票
每次出现合并冲突时,“组合差异”都会显示哪些文件发生了冲突:

git diff HEAD HEAD^1 HEAD^2 --name-only

。我不知道从技术上讲,组合差异是否可以显示

更多

文件而不仅仅是冲突文件。
但是,假设它按照我们想要的方式工作(这是一个假设),那么您可以有一个 git commit-msg

钩子来检查用户输入的消息

并断言


这是合并提交吗?

如果是这样,组合差异是否显示文件?
  1. 如果是这样,字符串“Conflicts:”后面是否有这些文件名?
  2. 如果这些条件失败,则让脚本打印以屏幕显示错误的解释,然后返回非零值以中止提交。您可以让开发人员安装此提交钩子,或者您也可以将其安装在服务器上以确保强制执行。

© www.soinside.com 2019 - 2024. All rights reserved.