在git中查找跨越分支的标记的合并提交

时间:2017-07-15 04:56:29

标签: git

我的产品是IntelliJ的插件。我支持基础IntelliJ平台的几个版本,并为每个版本发布我的插件版本,因为它们的API经常在不同版本之间发生变化。它只是我在研究它,所以我在master中开发,然后为每个其他版本维护一个分支。所以我的回购看起来像这样:

   1.6.0  1.6.1-eap1
.... a---b---c--- master
      \       \
       d-------e--- idea-2017.1
        \       \
         f-------g--- idea-2016.3
          \       \
          ...     ...  etc etc

a是一个稳定版本,已使用1.6.0标记。 c是EAP(测试版)版本,已使用1.6.1-eap1标记。这种方案适用于这两种情况。

我偶尔会想要创建一个不会进入发布渠道的开发版,但是用户可以手动下载并测试他们是否喜欢。我想为每个平台生成一个开发版,因为开发用户可以使用任何IntelliJ版本。我能想到的最好的方法是为dev构建创建一个分支,比如标记1.6.0(commit a),然后从提交d,{{{ 1}}等等我可以将dev分支合并到并创建dev构建。

假设我想编写一个脚本来创建和维护这些分支,我如何从标记f中找到提交df等来创建开发构建分支从?

3 个答案:

答案 0 :(得分:3)

这是我最终做的事情:

#!/bin/sh

set -e  # Automatically abort if any simple command fails

die () {
    echo >&2 "$@"
    exit 1
}

[ "$#" -eq 2 ] || die "Usage: $0 <branch name> <tag>"

tag_commit=$(git rev-list --abbrev-commit -n 1 $2)
[ "${tag_commit}" = "" ] && die "No commit found for $2"

child_commit() {
  git log --graph --pretty=format:"%h %p" --decorate -20  --first-parent $1 | grep $2 | cut -c 3-10
}

branch_2017_1=$(child_commit idea-2017.1 $tag_commit)
[ "${branch_2017_1}" = "" ] && die "No commit found for idea-2017.1"

branch_2016_3=$(child_commit idea-2016.3 $branch_2017_1)
[ "${branch_2016_3}" = "" ] && die "No commit found for idea-2016.3"

branch_2016_2=$(child_commit idea-2016.2 $branch_2016_3)
[ "${branch_2016_2}" = "" ] && die "No commit found for idea-2016.2"

branch_2016_1=$(child_commit idea-2016.1 $branch_2016_2)
[ "${branch_2016_1}" = "" ] && die "No commit found for idea-2016.1"

git branch "$1" $tag_commit
git branch "$1-2017.1" $branch_2017_1
git branch "$1-2016.3" $branch_2016_3
git branch "$1-2016.2" $branch_2016_2
git branch "$1-2016.1" $branch_2016_1

现在我只是更新我的合并和发布准备脚本,以选择接受分支系列名称,我想我会很好。

秘密酱在child_commit函数中,该函数来自here

答案 1 :(得分:1)

对于问题&#34;在a g最早提交的idea-2016.3之间找到idea-2017之内的最早提交,最早提交idea-2017这不在master&#34;解决方案是使用命令:

git log --oneline --source --ancestry-path  master idea-2017 idea-2016.3 --not 1.6.0

输出在历史上与你的相同:

cf32d9f idea-2017 e
88f264c idea-2016.3 g
5bc9fa1 idea-2017 d
3f460fe idea-2016.3 f
224cac8 master c
67620cd master b

然后找到标有idea-2016.3的最新行和标有idea-2017的最新行,这将是您的提交。

请注意,如果由于例如f中的版本差异导致某些阻止程序问题而导致输出可能不合适,这在后续f'中已得到修复。所以我仍然会考虑明确标记。

答案 2 :(得分:0)

可能最简单的方法是在shell脚本中维护受支持的版本/分支名称列表?

我之所以这么想,是因为你添加了另一个变化:

1.6.0      eap1 eap2
.... a---b---c---h--- master
      \       \   \
       d-------e---i--- idea-2017.1
        \       \   \
         f-------g---j--- idea-2016.3
          \       \   \
          ...     ...  etc etc

您希望将更改(h)合并到图表中显示的分支的开头,即h合并到eg。分支2017.1将指向e,这是合并到的正确提交。

你可以做一些事情,回去寻找一个共同的祖先或者其他东西,但我认为这是不必要的复杂,并没有真正为你买任何东西。

另外,如果你只保留一个分支列表,你可以相对容易地停止支持旧版本。