【问题标题】:How to make "git merge --log" stop flattening merge commits如何使“git merge --log”停止扁平化合并提交
【发布时间】:2019-03-11 02:20:25
【问题描述】:

我正在使用a successful git branching model,其中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 merge feature-branch


    【解决方案1】:

    要获取您想要的动态合并日志,请使用

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

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

    进入smoketest最快的方法可能是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 的缓冲区:

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

    【讨论】:

    • 谢谢!顺便说一句,您忘记在示例 2 中在 sed 正则表达式中打开单引号。我无法编辑它,因为更改必须至少为 6 个字符。你能修复它以防有人发现这也有用吗?
    猜你喜欢
    • 2012-08-29
    • 1970-01-01
    • 2015-05-27
    • 1970-01-01
    • 2015-01-05
    • 1970-01-01
    • 2012-11-09
    • 2016-12-30
    • 1970-01-01
    相关资源
    最近更新 更多