如何确定集成分支是否包含功能分支

时间:2020-05-07 22:45:56

标签: git git-branch

我正在做删除本地分支的可怕工作。我从集成分支那里获取最新信息:

git fetch origin dev

,然后我想将Origin / dev与本地功能分支进行比较。但我不想签出origin / dev。我相信目标是确保origin / dev的git日志包含每个功能分支的提示(最新提交)。

以下命令对我的情况不是很有效:

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

所以我正在寻找替代命令:

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

有没有可以执行此操作的命令?

2 个答案:

答案 0 :(得分:0)

git branch --contains的作用是:

  1. HEAD解析为提交哈希。如果您在分支机构br上,这会将 name br解析为提交哈希。 (让一些变量 h 表示此哈希。)
  2. 对于所有分支名称:

    • 将名称解析为提交哈希。我们称其为分支哈希的 b
    • 测试祖先: b h 的祖先吗?
    • 如果 b h 的祖先,请打印此分支的名称。

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

您的问题非常相似,但更为简单。您想将名称origin/dev解析为一些哈希 h 。然后,对于分支名称的某些子集(您关心的功能名称),您想要:

  • 将名称解析为哈希ID b
  • 测试祖先: b h 的祖先吗? (换句话说:该分支的小费提交是否是origin/dev的小费提交的祖先?)
  • 如果是,请打印名称。

有一个实现此“ is-ancestor”测试的命令,但这有点令人惊讶:它是origin/dev。命令:

git merge-base

如果$ b是$ h的祖先,则报告成功(退出为零),如果不是,则报告失败(退出为非零)。它实现的“是祖先”测试与git merge-base $b $h 使用的测试相同,因此可以直接提供您想要的答案。

剩下的问题是找到所需的分支名称。 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/*本身,然后在循环中添加一些内容以跳过“无趣的”分支名称,或使用其他任何方式。

有关详细信息,请参见git merge-basegit for-each-ref(以及git rev-parse的文档)。

答案 1 :(得分:0)

要列出origin/dev可以访问的分支提示,可以使用

git branch --merged origin/dev

请注意,如果它是本地分支机构,则它会列出origin/dev(我认为您不是这种情况)。

如果要在git branch周围编写脚本,请注意这是一个“瓷器”命令,即其输出格式不是一成不变的,并且可能会在Git的未来版本中更改。