我正在做删除本地分支的可怕工作。 我从我们的集成分支获取最新的。
git fetch origin dev
然后我想把origindev和本地的特征分支进行比较。但我不想检查出origindev。我相信我们的目标是确保origindev的git日志包含每个特性分支的提示(最新提交)。
下面的命令对我的情况不是很有效。
git branch --contains <commit-id>
所以我在寻找另一条命令。
git branch origin/dev --contains-branch <some-feature-branch>
有没有什么命令可以做到这一点?
什么是 git branch --contains
是。
HEAD
到一个提交哈希。 如果您的分支是 br
,这就解决了 名称 br
到一个提交哈希。 (让一些变量 h 代表这个哈希值。)对于所有分支名。
现在,这个命令已经完成了:它列出了这个分支中包含分支提示提交的分支名称。
你的问题非常相似,但更简单。 您想解决的是 origin/dev
变成一些杂碎 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-base
和 git for-each-ref
(和 git rev-parse
,以了解详情)。
要列出可以从 origin/dev
,您可以使用
git branch --merged origin/dev
请注意,这确实列出了 origin/dev
如果它是一个本地分支(我假设你的情况不是这样)。
如果您想用脚本来解决 git branch
请注意,这是一条 "瓷器 "命令,也就是说,它的输出格式不是一成不变的,可能会在未来的 Git 版本中发生变化。