如何使 "git merge --log" 停止展平合并提交

How to make "git merge --log" stop flattening merge commits

我正在使用 a successful git branching model,其中 master 分支仅由带有版本标记的合并提交组成,所有开发都在 develop 分支上进行。

develop 分支还包括合并提交(功能分支)和普通提交(小的个人更改)。

当我执行新版本发布时,我希望 git 让我成为一个 chengelog。 git merge develop --log 这样做,但是这个 "unrolls" 合并在 develop 上提交,导致历史平坦。

我想让 'git merge --log' 仅在 develop 上使用提交,这可能吗?

示例:

合并时我现在实际得到的是:

Merge branch 'develop' into master

* develop:
  fix 1 on branch develop
  fix 2 on branch develop
  fix 1 on branch b1
  fix 2 on branch b1
  fix 3 on branch b1
  fix 1 on branch b2
  fix 2 on branch b2
  fix 1 on branch b3

我想要它是什么:

Merge branch 'develop' into master

* develop:
  fix 1 on branch develop
  fix 2 on branch develop
  Merge branch 'b1' into develop
  Merge branch 'b2' into develop
  Merge branch 'b3' into develop

要获取您想要的进行中合并的日志,请使用

git log --pretty='  %s' --first-parent ..MERGE_HEAD  # with e.g. `-10` to limit to 10

或者要查看从现有合并中获得的结果,请使用 merge^1..merge^2 作为您的范围。

进行冒烟测试的最快方法可能是 git merge --log=1 生成正确的样板文件,然后在 vim 中是

:/^\*/+,+!git log --pretty='  \%s' --first-parent ..MERGE_HEAD

以您想要的方式填写日志。要使其自动化,您需要使用 prepare-commit-msg 挂钩,类似于

case  in
merge)
        git log --pretty='  %s' --first-parent ..MERGE_HEAD >${tempfile=`mktemp`}
        sed -i '/^\*/,/^$/ { //!d }; /^\*/ r '$tempfile  ""
        rm $tempfile
        ;;
esac

编辑:在 GNU/anything 上,挂钩变得更简单,因为 sed 的缓冲区:

case  in
merge)
        git log --pretty='  %s' --first-parent ..MERGE_HEAD \
        | sed -i '/^\*/,/^$/ { //!d }; /^\*/ r /dev/stdin' ""
        ;;
esac