我如何定制git的合并提交消息?

每次我做一个合并,我需要一个合并提交生成,我希望它不仅仅是所有提交的摘要。

我的问题是如何格式git-fmt-merge-msg或什么决定了这个自动化的消息 (我可以通过修改它,并使用git-log –pretty = format:'…'来提交后手动执行此操作)

例如,我想格式化为:

合并分支“testing”
*testing:
[BZ:#123]第五承诺主题
[BZ:#123]第四个提交主题
[BZ:#123]第三个提交主题
[BZ:#123]第二个提交主题
[BZ:#123]第一个提交主题


合并细节:
[BZ:#123]第五承诺主题
在2010-06-30 11:29:00 +0100
– 第五承诺机构

[BZ:#123]第四个提交主题
在2010-06-30 11:22:17 +0100
– 第四个承诺机构

[BZ:#123]第三个提交主题
在2010-06-30 11:21:43 +0100
– 第三个承诺机构

[BZ:#123]第二个提交主题
于2010-06-30 11:21:30 +0100
– 第二个承诺机构

[BZ:#123]第一个提交主题
在2010-06-30 11:29:57 +0100
– 第一次承诺机构

编辑:

对于非理想的修复,请参阅下面的答案

但真正的问题是如何修改'fmt-merge-msg'生成的信息?

我知道这不是回答原来的问题,但为了像我这样的git noobs这个页面的好处,因为它是目前第一个Google的“git变更合并提交信息”的结果,我会提到这是可能的至:

git commit --amend -m"New commit message" 

更改合并提交的提交消息,而不会丢失与合并提交的任何父级的链接。

看起来像版本Git 1.7.8你可以做git merge --edit ...来指定提交信息。

截至1.7.10 ,放入编辑模式将是默认行为

从这个版本开始,交互式会话中的“git merge”命令将启动一个编辑器,当它自动parsing用户解释结果提交的合并时,就像“git commit”命令没有给出时一样提交消息。

(虽然我没有在Windows上的msysgit中看到它)

我发现解决这个问题有两种方法

注意 :不要同时使用两个,就好像提交未能合并一样,会再次将日志添加到底部。

个人说明 :我使用第一个解决scheme,因为它完全依赖于git的钩子和configuration属性,而不是外部脚本。
对于一个真正的解决scheme,必须扩展名为“fmt-merge-msg”的git命令,在传递–log选项时生成oneline描述(如果你真的需要这个解决scheme,你必须创build你自己的补丁git)并从源代码进行编译)。

1.按照VonC的build议使用prepare-commit-message
此解决scheme有问题,您需要中断提交,然后手动提交

设置将构build所需的提交消息的别名:

 [alias] lm = log --pretty=format:'%s%n by %C(yellow)%an%Creset (%ad)%n %n%b' --date=local 

通过在$ GIT_DIR / hooks /(下面的示例脚本)中创build可执行的prepare-commit-msg来创buildprepare-commit-msg钩子。

 #!/bin/sh #... case "$2,$3" in merge,) echo "Merge details:" >> $1 echo "" >> $1 git lm ORIG_HEAD..MERGE_HEAD >> "$1" ;; *) ;; esac 

应该定义一个别名提交消息,如

 [alias] m = merge --no-ff --no-commit 

2.使用自动生成合并的自定义命令
(使用1中创build的lm别名)

 #!/bin/sh echo "" echo "merge with commit details -- HEAD..$1" git merge --no-ff --no-log -m "`git lm HEAD..$1`" --no-commit $1 

然后执行一个相当严格的命令:

 ./cmd-name <branch to merge> 

如果您仍然想要提交提交的oneline描述,则需要向-m参数中添加新的命令或其他内容(如果使用了-log,则会在底部生成)

一旦你把<branch A>合并到<branch B> ,git会自动提交一个消息,说“merge branch <branch A><branch B>

如果你想定制git的合并提交信息,你可以尝试:

 $ git commit --amend -m "Your merge message" 

这个命令会把你的git的合并提交信息更新到提交信息中。

你也可以尝试:

 $ git merge <branch A> --no-commit 

它会把你的<branch B><branch A>合并成<branch A> <Branch B>'s提交和提交信息列表

如果它不能快进,那么你会得到这样的东西:

 Automatic merge went well; stopped before committing as requested # check this with git status $ git status 

它会告诉你,你的提交已经添加到阶段,但还没有提交,你可以提交它们而不运行git add

 $ git commit -m "your merge commit message" 

如果你想改变<branch B>的最后提交信息,那么你可以试试:

 $ git commit --amend -m "your new commit message" 

但是,一般情况下,我们不更新其他提交消息,除非它们不正确。

假设,在git合并之后你会发生冲突,然后简单地解决你的冲突,并做:

 $ git add . $ git commit -m "your commit message" 

现在还有一个git-merge--log选项,它只是你想要的一半 – 它将短日志(提交摘要)放在合并消息中。 不过,一个完整的解决scheme将不得不使用VonC的答案。

您可以尝试定义一个prepare-commit-msg钩子 ( 示例一会产生一些自定义的“默认提交消息”)

一个非常简单的bash函数,设置一个默认的消息并添加你的参数。 如果你想进行更改,它将使用--edit开关打开你的编辑器。

编辑〜/ .bashrc或bash_aliases。 (不要忘记发送source ~/.bashrc )在你的bashrc中应用修改

 function mergedevelop() { git merge --no-ff --edit -m "master <-- develop: $1" develop; } 

使用:

mergedevelop "PR #143..."有消息:

大师< – develop:PR#143 …