删除所有已推送的git分支

时间:2019-07-08 07:48:54

标签: git

我的需要

您好,我正在寻找一个删除所有已已推送到本地的本地分支的命令。

我特别想保留所有尚未提交的分支到其各自的远程分支。

原因

git prune通过删除远程站点时清除分支来完成一部分工作,但是由于我有许多功能分支,因此我只需要保留尚未完全推送到远程的分支即可,以避免我的仓库中有一长串本地分支机构,将它们限制在实际工作中。

谢谢!

2 个答案:

答案 0 :(得分:3)

git remote update # `git fetch --all` but it allows configurable skipping, see the docs
git for-each-ref refs/heads --format='
        [[ "%(upstream)" != "" ]] &&    # there is an upstream branch
        git merge-base --is-ancestor %(refname) %(upstream) &&  # which has this tip
        echo delete %(refname)
' # | sh # | git update-ref --stdin

为shell生成命令是有用且有趣的-如果按上面的c&p命令,它实际上不会对仓库执行任何操作,则其输出是用于检查上游是否有分支的命令;删除#,它会执行检查,而不仅仅是打印它们,然后尝试。

答案 1 :(得分:3)

尽管就jthill提出的灵活灵巧的解决方案而言,它看起来像是一头盲目大象,但在此我还是分享我到目前为止为满足您所描述的相同需求而倾向于使用的残酷方法:

# nuke all branches* (which have no unique commit)
git branch -d $(git for-each-ref --format="%(refname:short) refs/heads")

# for "main" branches (I mean permanent, like master), recreate them if needed from remote
git checkout master

这是一次性版本,但为方便起见,可以轻松地为其创建别名。

请注意-d标志,与-D相比,它表示“软删除”,并且拒绝删除具有未合并提交的分支(-D忽略的安全检查)。


* 在这里,git可能(取决于当前分支的状态)抱怨无法删除您所在的分支。在直接命令模式下没什么大不了的,但是在别名方面有点烦人。只需事先检出模拟分支,然后再将其删除。由于我们在确定所有内容,因此我倾向于将分支命名为from-orbit