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



我正在使用一个成功的 git 分支模型,其中您master分支仅由带有版本标签的合并提交组成,并且所有开发都在develop分支中进行。

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

当我执行新版本发布时,我希望 git 让我成为一个 chengelog。git merge develop --log这样做,但这种"展开"合并在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 $2 in
merge)
git log --pretty='  %s' --first-parent ..MERGE_HEAD >${tempfile=`mktemp`}
sed -i '/^*/,/^$/ { //!d }; /^*/ r '$tempfile  "$1"
rm $tempfile
;;
esac

编辑:在GNU/任何东西上,钩子变得更简单,因为sed的buffier:

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

最新更新