要删除分支,我至少知道以下命令:
private
如果分支完全合并,则第一个删除该分支,无论如何,第二个删除该分支。
现在考虑一个工作流,在该工作流中,分支被重新建立为主分支,而不是合并分支。第一个命令不会删除分支(它没有被合并)。第二个将删除该分支,但无论如何都将执行此操作(即使尚未完成变基)。我想知道是否有一种更安全的方式删除分支,可以是:
您知道任何这样的命令吗?
答案 0 :(得分:1)
您可以使用git-log
来确定一个分支上是否有任何补丁在另一分支上没有等效项:
git log --no-merges --cherry-pick --left-only oldbranch...master
这是带有三个点的对称差异。 --cherry-pick
查找“可樱桃提取”的提交,在另一个分支上没有等效的提交。对称差异通常会显示来自任一分支的提交,而另一分支上没有等效项; --left-only
告诉它仅显示来自左分支的提交(在这种情况下为oldbranch
)。
如果您不希望看到提交,可以将git rev-list --count
替换为git log
。
答案 1 :(得分:1)
以防万一
- 在更好的情况下(因为master可以有其他新的提交)“删除,如果master包含与创建后该分支的提交相等的提交”(请确保in的“ equal”位可能存在问题某些情况,但更简单的情况..)
git rebase master oldbranch
git checkout master
git branch -d oldbranch
应该这样做,rebase会识别并忽略您已经选择的提交,如果所有这些master
和oldbranch
将是同一提交,即oldbranch已被合并并且删除成功
但是情况
- 在更糟的情况下,“如果当前分支和母版之间的差异为空,则删除”
是可区分的,有可能达到相同的结果,但步长不同,而这只是匹配的累积效果。这里的问题是,您希望结果历史记录是什么样的?您必须使用不同的命令才能获得不同的结果。
所以我想出的最琐碎的顺序是击中你所有的绝望对象
if [[ `git rev-parse master:` = `git rev-parse oldbranch:` ]]; then
echo '`oldbranch` tip identical to master tip, not bothering with rebase, deleting'
git checkout master &&
git branch -D oldbranch
else
git rebase master oldbranch &&
git checkout master &&
git branch -d oldbranch && echo oldbranch completely merged, deleting
fi
此处未处理的情况是,两个分支提示是否达到了部分重叠的累积差异并以不同的方式划分了这些差异,为此,您只需要决定哪种历史记录将是最有用的。我会合并。
答案 2 :(得分:0)
很少有方法标记在cherry-pick
期间选择了哪个提交
cherry-pick -x
您可以使用cherry-pick -x
,这样您将拥有为cherry-pick
选择的原始提交
git notes
使用git notes添加注释(注释不是SHA-1的一部分),可以删除或修改注释而不影响提交ID
一旦有了原始提交,就可以使用脚本来使用
来验证所有提交是否在目标分支中git branch --contains <commit>