在进行合并和解决冲突之后,是否有一种“简单”的方法可以从命令行接受默认生成的提交消息?我们的一位开发人员将解决所有冲突,然后git commit -m"Merge Commit"
替换生成的列出所有冲突文件的提交消息。我想要一个不同的标志,它只需要当前文件而不修改。我知道有一个 -F 或 --file= 选项,但这需要一直知道文件名。
谢谢
默认情况下,当合并失败时,要使用的提交消息保存在 git 文件夹中的文件中,通常是.git/MERGE_MSG
. 解决冲突后,运行git commit
会将保存的消息提供给默认编辑器。
如果消息没有被自己拾取,则可以使用该--file
选项将其提供给 git 命令,该选项从文件中读取提交消息:
git commit --file .git/MERGE_MSG
只需将编辑器设置为不执行任何操作的命令:
GIT_EDITOR=true git commit
显然,这里的“正确”答案是让您的开发人员在生成合并提交时为您的团队遵循正确的做法。请注意,您想要的行为曾经是默认行为,并且直到最近 git 才开始要求“人工生成”的合并提交消息。这是有原因的,而且开发人员不会用毫无意义的信息来缩短流程。
也许开发人员在他/她应该改基础时生成合并提交?
也就是说,合并提交是 的输出git fmt-merge-msg
,您必须将合并提交的父级提供给它。
git commit --file .git/MERGE_MSG
正如已经提到的那样很好,但它忽略了几点:
.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
它也适用于子模块,但至少目前不接受,因此建议编辑器在结束合并之前更改提交消息。
您可以使用没有消息的默认“git commit” 。这将触发控制台中的 VIM 编辑器。默认信息将出现在 VIM 中,只需使用命令":wq"应用合并并退出 VIM。
演练以下步骤:
git commit (hit enter)
:wq (to exit and apply merge in VIM editor)
如果您真的想强制执行此规则,那么可能有一种方法可以使用 git 挂钩强制执行此规则。
每次发生合并冲突时,“组合差异”都会显示哪些文件发生冲突:git diff HEAD HEAD^1 HEAD^2 --name-only
. 我不知道从技术上讲,组合差异是否有可能显示比冲突文件更多的文件。
但是,假设它像我们想要的那样工作(这是一个假设),那么你可以有一个 gitcommit-msg
钩子来检查用户输入的消息并断言
如果这些条件失败,则让脚本打印以筛选错误的解释,然后返回非零以中止提交。您可以让开发人员安装此提交挂钩,或者您也可以将其安装在服务器上以确保执行它。
$git commit --amend --no-edit
merge conflict
并希望获取先前提交的消息并在您的应用中应用主代码feature branch
以避免冲突时,这将很有帮助。