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

sf8*_*f89 159 git branch pull github repository

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

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

sf8*_*f89 177

快捷的方式

git branch --merged | grep -v "\*" | xargs -n 1 git branch -d
Run Code Online (Sandbox Code Playgroud)

注意:如果你没有master,这有可能删除分支.继续阅读"更好的方式".

确保我们保持主人

您可以确保master不会grep因为更多而删除该问题或任何其他分支.在那种情况下你会去:

git branch --merged | grep -v "\*" | grep -v "YOUR_BRANCH_TO_KEEP" | xargs -n 1 git branch -d
Run Code Online (Sandbox Code Playgroud)

因此,如果我们想继续保持master,developstaging举例来说,我们会去:

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

把它作为别名

由于它有点长,您可能想要为您的.zshrc或添加别名.bashrc.我被称为gbpurge(for git branches purge):

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

然后重新加载你的.bashrc.zshrc:

. ~/.bashrc
Run Code Online (Sandbox Code Playgroud)

要么

. ~/.zshrc
Run Code Online (Sandbox Code Playgroud)

  • 仅供参考,如果你想保留多个分支,你可以使用单个grep,如下所示:`grep -Ev'(\*| master | important-branch)'` (4认同)
  • 如果你想把它放在你的`〜/ .gitconfig`中,把以下内容添加到`[alias]`部分:`gbpurge =!"git branch --merged | grep -Ev'\\*| master | develop | staging'| xargs -n 1 git branch -d"`(不需要在grep表达式中使用()). (4认同)

Ale*_*sio 79

我使用与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:将名称传递给delete命令

注意:如果您愿意,可以使用-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
Run Code Online (Sandbox Code Playgroud)

参考:

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

  • 更好的是:`awk '$3 $4 ~ /:gone]$/ { print $1 }'` (3认同)
  • 我冒昧地确保我总是那样对抗主人,因此:`git checkout master; git pull origin master; git fetch --all -p; git branch -vv | grep走了| awk'{print $ 1}'| xargs -n 1 git branch -d`很棒的脚本和解释,谢谢你:) (2认同)
  • 除了需要`-D`而不是`-d`之外,这是一个完美的答案! (2认同)

nic*_*_zs 71

尝试:

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. 可以安全地删除.

然后,<the command above> | xargs git branch -d可以删除所有这些.

  • 这个答案不太正确.`--prune`标志只会删除远程跟踪分支,而不是本地分支. (42认同)
  • 你也可以做`git fetch --prune`,这是我的选择方式 (8认同)
  • 不会upvote,但这是我删除本地分支然后从GitHub删除后我需要的,但它们仍然作为遥控器存在于我的git remote -v命令中. (6认同)
  • 同意@Cupcake这里,这并没有实现我在这里寻找的东西. (3认同)

小智 23

这应该可以避免使用公认的解决方案删除分支和开发分支:

git branch --merged | egrep -v "^\*|master|development" | xargs -n 1 git branch -d
Run Code Online (Sandbox Code Playgroud)


ama*_*ler 15

对于使用PowerShell的人来说,这相当于上面的答案:

git branch -vv | Select-String -Pattern ': gone]' | ForEach-Object{($_ -split "\s+")[1]} | %{ git branch -D $_ }
Run Code Online (Sandbox Code Playgroud)
  1. 过滤标记为删除的所有分支
  2. 呼叫git branch -D每个找到的分支机构


Jos*_*ing 7

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

git branch -d branch_name_to_delete
Run Code Online (Sandbox Code Playgroud)

如果你当前在该分支中,它会将你推回到 master 分支。此时进行拉动

git pull
Run Code Online (Sandbox Code Playgroud)


Mar*_*Loo 5

非常简单的解决方案:删除本地存储库,然后重新克隆远程存储库。可能看起来不太优雅,但它很简单,您无需阅读手册页即可完全了解自己在做什么:-)。

  • 因为您将丢失所有本地分支机构,藏匿处,未推动的提交……这就像用炸药捕鱼一样。 (6认同)
  • 为什么有这么多反对票?我的意思是显然效率不高,尤其是对于较大的回购协议,但它确实满足了OP的要求。还有其他理由不这样做吗? (3认同)
  • 当您正在使用的笔记本电脑因某种原因损坏、丢失或被盗时,也会发生同样的情况,因此我倾向于不在本地保留任何重要内容。对我来说,最好创建一个分支并推送它,即使是小功能,然后在它不再有用后将其删除。 (2认同)

Kar*_*bur 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
Run Code Online (Sandbox Code Playgroud)