如何判断集成分支是否包含特征分支

问题描述 投票:0回答:1

我正在做删除本地分支的可怕工作。 我从我们的集成分支获取最新的。

git fetch origin dev

然后我想把origindev和本地的特征分支进行比较。但我不想检查出origindev。我相信我们的目标是确保origindev的git日志包含每个特性分支的提示(最新提交)。

下面的命令对我的情况不是很有效。

git branch --contains <commit-id>
  1. 它不清楚如何使用当前分支以外的分支。
  2. 我没有比较分支的 commit-id,但我有分支的名字。

所以我在寻找另一条命令。

git branch origin/dev --contains-branch <some-feature-branch>

有没有什么命令可以做到这一点?

git git-branch
1个回答
1
投票

什么是 git branch --contains 是。

  1. 解决 HEAD 到一个提交哈希。 如果您的分支是 br,这就解决了 名称 br 到一个提交哈希。 (让一些变量 h 代表这个哈希值。)
  2. 对于所有分支名。

    • 将分支名解析为提交的哈希值。 让我们把它称为 "提交哈希"。b 的分支哈希。
    • 测试祖先性:是 b 鼻祖 h?
    • 如果 b 鼻祖 h,打印这个分支的名称。

现在,这个命令已经完成了:它列出了这个分支中包含分支提示提交的分支名称。

你的问题非常相似,但更简单。 您想解决的是 origin/dev 变成一些杂碎 h. 然后,对于你的分支名称中的一些子集--你关心的特征名称--你要。

  • 将名称解析为一个哈希ID b.
  • 测试祖先性:是 b 鼻祖 h? (换句话说:这个分支的提示提交包含在了 origin/dev 的祖先。origin/dev?)
  • 如果是,就打印出名字。

有一个命令实现了这个 "is-ancestor "的测试,但它有点令人惊讶:它就是 git merge-base. 命令:

git merge-base $b $h

如果$b是$h的祖先,则报告成功(退出为零),如果不是,则报告失败(退出为非零)。 它所实现的 "is ancestor "测试与 git branch --contains 的用途,所以这直接提供了您想要的答案。

剩下的问题是找到想要的分支名。 剩余的问题是找到所需的分支名。git for-each-ref 命令就是为了实现这个目的而设计的。

因此。

hname=origin/dev
h=$(git rev-parse $hname) || die "cannot get commit hash ID for $hname"
git for-each-ref --format='%(refname:short) %(objectname)' refs/heads/feature |
    while read name b; do
        if git merge-base --is-ancestor $h $b; then
            echo $name is contained within $hname
        fi
    done

(注:未经测试)。 这个 refs/heads/feature 这里代表的是名为 feature/*;如果你有不同的模式需要匹配,使用该不同的模式,或者使用 refs/heads 本身,并在循环中加入一些东西来跳过 "无趣 "的分支名,或者不管它需要什么。

参见文档中的 git merge-basegit for-each-ref (和 git rev-parse,以了解详情)。


1
投票

要列出可以从 origin/dev,您可以使用

git branch --merged origin/dev

请注意,这确实列出了 origin/dev 如果它是一个本地分支(我假设你的情况不是这样)。

如果您想用脚本来解决 git branch请注意,这是一条 "瓷器 "命令,也就是说,它的输出格式不是一成不变的,可能会在未来的 Git 版本中发生变化。

© www.soinside.com 2019 - 2024. All rights reserved.