在远程仓库上删除本地Git分支后删除它们

时间:2013-08-01 00:04:02

标签: git github branch pull repository

我希望我的本地和远程存储库在分支方面始终保持同步。

在GitHub上进行Pull Request审核后,我合并并删除了我的分支(远程)。 我如何在本地存储库中获取此信息并让Git删除我的本地版本的分支?

12 个答案:

答案 0 :(得分:174)

快捷方式

git branch --merged | grep -v "\*" | xargs -n 1 git branch -d

注意:如果您不在master,则可能会删除分支。继续阅读“更好的方式”。

确保我们保持主人

您可以确保master或其他任何分支都不会被grep删除。在那种情况下你会去:

git branch --merged | grep -v "\*" | grep -v "YOUR_BRANCH_TO_KEEP" | xargs -n 1 git branch -d

因此,如果我们想保留masterdevelopstaging,我们会选择:

git branch --merged | grep -v "\*" | grep -Ev "(\*|master|develop|staging)" | xargs -n 1 git branch -d

将其设为别名

由于时间有限,您可能需要为.zshrc.bashrc添加别名。我叫gbpurgegit branches purge):

alias gbpurge='git branch --merged | grep -Ev "(\*|master|develop|staging)" | xargs -n 1 git branch -d'

然后重新加载.bashrc.zshrc

. ~/.bashrc


. ~/.zshrc

答案 1 :(得分:75)

我使用与GitHub相同的流程,并且没有找到满足我的先前答案,因为git branch --merged列出了已合并的分支,但并非在我的情况下远程删除了所有分支。 所以,这对我有用:

git fetch --all -p; git branch -vv | grep ": gone]" | awk '{ print $1 }' | xargs -n 1 git branch -d

其中:

  • git fetch --all -p:更新本地分支机构状态
  • git branch -vv:列出本地分支机构状态
  • grep ": gone]":过滤已删除的
  • awk '{ print $1 }':提取他们的名字
  • xargs -n 1 git branch -d:将名称传递给删除命令

注意:如果您愿意,可以使用-D而不是-d来强制执行删除。

例如:

someUsr@someHost:~/repo$ git branch -a
basic-testing
integration-for-tests
* master
origin
playground-for-tests
test-services
remotes/origin/HEAD -> origin/master
remotes/origin/basic-testing
remotes/origin/master
remotes/origin/test-services

someUsr@someHost:~/repo$ git fetch --all -p; git branch -vv | grep ": gone]" | awk '{ print $1 }' | xargs -n 1 git branch -d
Fetching origin
Deleted branch integration-for-tests (was fbc609a).
Deleted branch playground-for-tests (was 584b900).

someUsr@someHost:~/repo$ git branch -a
basic-testing
* master
origin
test-services
remotes/origin/HEAD -> origin/master
remotes/origin/basic-testing
remotes/origin/master
remotes/origin/test-services

参考:

http://git-scm.com/book/en/v2/Git-Branching-Remote-Branches

答案 2 :(得分:69)

尝试:

git pull --prune

如果删除了相应的远程分支,则删除本地分支。

更新

上述陈述不正确。

事实上,正在运行git pull --prune仅删除远程跟踪分支,例如

remotes/origin/fff
remotes/origin/dev
remotes/origin/master

然后,您可以运行git branch -r来检查计算机上剩余的远程跟踪分支。假设左分支是:

origin/dev
origin/master

表示分支origin/fff已删除。

因此,在运行git pull --prune之后,只需运行:

git branch --merged | grep -vFf <(git branch -r | cut -d'/' -f2-)

你可以找到所有当地的分支机构:

  1. 不再有对应的远程分支;
  2. 可以安全移除。
  3. 然后,<the command above> | xargs git branch -d可以删除所有这些内容。

答案 3 :(得分:23)

这应该可以避免使用已接受的解决方案删除开发分支:

git branch --merged | egrep -v "^\*|master|development" | xargs -n 1 git branch -d

答案 4 :(得分:13)

对于使用PowerShell的人来说,这相当于答案above

git branch -vv | Select-String -Pattern ': gone]' | ForEach-Object{($_ -split "\s+")[1]} | %{ git branch -D $_ }
  1. 过滤所有标记为已消失
  2. 的分支
  3. 在每个找到的分支机构上调用git branch -D

答案 5 :(得分:5)

非常简单的解决方案:删除您的本地仓库并重新克隆远程仓库。可能看起来不是很优雅,但它很简单,如果不阅读手册,你就会明白你在做什么:-)。

答案 6 :(得分:5)

这些都不适合我。你可以在这里看到我的另一个答案: https://stackoverflow.com/a/34969726/550454

但基本上,我现在在我的~/.gitconfig

中有这个
[alias]
  prune-branches = !git remote prune origin && git branch -vv | grep ': gone]' | awk '{print $1}' | xargs -r git branch -d

答案 7 :(得分:1)

我已经编写了这个单行代码来列出所有没有相应远程分支的本地分支:

xargs

完成此操作后,diff -u <(git branch|sed 's/..//') <(git branch -r|sed 's/..origin\///')|tail -n +4|sed -n "s/^-//p" -|xargs -r git branch -d

可以轻松删除这些本地分支
{{1}}

答案 8 :(得分:1)

我这样做是为了删除合并的本地分支:

git branch -d $(git branch --merged)

如果你想要删除不存在的跟踪:

git pull --prune

答案 9 :(得分:0)

如果您刚刚将分支推送并合并为master,请在git bash中执行以下操作:

git branch -d branch_name_to_delete

如果您目前在该分支机构,它会将您推回主人。此时用

拉一下
git pull

答案 10 :(得分:0)

我有相同的问题,可以使用简单的命令行来解决:

git branch -d $(git branch --merged | grep -v "master")

首先,执行 git pull origin 以确保其正常运行。

subshel​​l首先返回所有合并到您当前分支的分支(确保您已检出master分支!!),除了 master ,如果您不这样做,则可以在列表中不要使用grep -v。然后,git branch -d <branch_1> <branch_n>

会将所有合并的分支从您的本地仓库中删除

答案 11 :(得分:-2)

投票的答案确实有可能删除主人。比较下面的实际例子。

我有两个功能分支hemen_README和hemen_BASEBOX被合并到develop中,然后develop被合并到master中。功能分支hemen_README和hemen_BASEBOX被远程删除但仍然在本地显示。此外,我不是在当地掌握,而是在开发。

在那种情况下

    hemen@hemen-MXC061:~/data/projects/vagrant-webdev$ git branch -v -a
    * develop                      671ad6c Merged in hemen_README (pull request #1)
        hemen_BASEBOX                a535c0f added global exec paths to puppet manifest
        hemen_README                 ba87489 Updated Readme with considerable details
        master                       8980894 [behind 7] Initial Vagrantfile, works for vagrant up. Also initial .gitignore
        remotes/origin/develop       671ad6c Merged in hemen_README (pull request #1)
        remotes/origin/hemen_BASEBOX a535c0f added global exec paths to puppet manifest
        remotes/origin/hemen_README  ba87489 Updated Readme with considerable details
        remotes/origin/master        2f093ce Merged in develop (pull request #3)

所以如果我运行上面的部分命令

    hemen@hemen-MXC061:~/data/projects/vagrant-webdev$ git branch --merged | grep -v "\*"
        hemen_BASEBOX
        hemen_README
        master

请注意,它也会显示master,最终会被删除。

无论如何我都能做到。我正在与您分享我的会话日志,了解我是如何实现这一目标的。

    hemen@hemen-MXC061:~/data/projects/vagrant-webdev$ git remote prune origin --dry-run
    Pruning origin
    URL: git@bitbucket.org:hemenkapadiapublic/vagrant-webdev.git
     * [would prune] origin/hemen_BASEBOX
     * [would prune] origin/hemen_README
    hemen@hemen-MXC061:~/data/projects/vagrant-webdev$ git remote prune origin 
    Pruning origin
    URL: git@bitbucket.org:hemenkapadiapublic/vagrant-webdev.git
     * [pruned] origin/hemen_BASEBOX
     * [pruned] origin/hemen_README

我刚刚检查了将被修剪然后修剪它。看下面的分支命令,我们已经处理了遥控器

    hemen@hemen-MXC061:~/data/projects/vagrant-webdev$ git branch -v -a
    * develop                671ad6c Merged in hemen_README (pull request #1)
        hemen_BASEBOX          a535c0f added global exec paths to puppet manifest
        hemen_README           ba87489 Updated Readme with considerable details
        master                 8980894 [behind 7] Initial Vagrantfile, works for vagrant up. Also initial .gitignore
        remotes/origin/develop 671ad6c Merged in hemen_README (pull request #1)
        remotes/origin/master  2f093ce Merged in develop (pull request #3)

现在继续删除本地分支

    hemen@hemen-MXC061:~/data/projects/vagrant-webdev$ git branch -d hemen_BASEBOX 
    Deleted branch hemen_BASEBOX (was a535c0f).
    hemen@hemen-MXC061:~/data/projects/vagrant-webdev$ git branch -d hemen_README
    Deleted branch hemen_README (was ba87489).

现在分支很好。

    hemen@hemen-MXC061:~/data/projects/vagrant-webdev$ git branch -v -a
    * develop                671ad6c Merged in hemen_README (pull request #1)
        master                 8980894 [behind 7] Initial Vagrantfile, works for vagrant up. Also initial .gitignore
        remotes/origin/develop 671ad6c Merged in hemen_README (pull request #1)
        remotes/origin/master  2f093ce Merged in develop (pull request #3)