我正在做删除本地分支的可怕工作。我从集成分支那里获取最新信息:
git fetch origin dev
,然后我想将Origin / dev与本地功能分支进行比较。但我不想签出origin / dev。我相信目标是确保origin / dev的git日志包含每个功能分支的提示(最新提交)。
以下命令对我的情况不是很有效:
git branch --contains <commit-id>
所以我正在寻找替代命令:
git branch origin/dev --contains-branch <some-feature-branch>
有没有可以执行此操作的命令?
答案 0 :(得分:0)
git branch --contains
的作用是:
HEAD
解析为提交哈希。如果您在分支机构br
上,这会将 name br
解析为提交哈希。 (让一些变量 h 表示此哈希。)对于所有分支名称:
命令现已完成:它已列出分支名称,这些分支的分支提示提交包含在该分支中。
您的问题非常相似,但更为简单。您想将名称origin/dev
解析为一些哈希 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-base
和git for-each-ref
(以及git rev-parse
的文档)。
答案 1 :(得分:0)
要列出origin/dev
可以访问的分支提示,可以使用
git branch --merged origin/dev
请注意,如果它是本地分支机构,则它会列出origin/dev
(我认为您不是这种情况)。
如果要在git branch
周围编写脚本,请注意这是一个“瓷器”命令,即其输出格式不是一成不变的,并且可能会在Git的未来版本中更改。