172

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

在 GitHub 上对 Pull Request 进行审查后,我在那里合并并删除了我的分支(远程)。我怎样才能在我的本地存储库中获取这些信息并让 Git 也删除我的本地版本的分支?

4

11 回答 11

193

快捷方式

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

注意:如果你不在master,这有可能删除分支。继续阅读“更好的方法”。

确保我们保持主人

您可以确保ingmaster或任何其他分支不会被greping for more 删除。在这种情况下,你会去:

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

因此,如果我们想保留master,例如,我们会去developstaging

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

将此设为别名

由于它有点长,您可能想为您的.zshrcor添加一个别名.bashrc。我的被​​称为gbpurge(对于git branches purge):

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

然后重新加载你的.bashrcor .zshrc

. ~/.bashrc

或者

. ~/.zshrc
于 2013-08-01T07:30:01.797 回答
93

我在 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

于 2015-01-19T08:50:18.343 回答
75

尝试:

git pull --prune

如果相应的远程分支被删除,它将删除您的本地分支。

更新:

上面的说法并不那么正确。

实际上,运行git pull --prune只会删除远程跟踪分支,例如

遥控器/原点/fff
遥控器/原点/开发
遥控器/原点/主控

然后,您可以运行git branch -r以检查机器上留下的远程跟踪分支。假设左分支是:

起源/开发
原产地/主人

这意味着分支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可以将它们全部删除。

于 2013-08-01T00:11:36.237 回答
23

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

git branch --merged | egrep -v "^\*|master|development" | xargs -n 1 git branch -d
于 2014-11-07T14:45:01.337 回答
16

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

git branch -vv | Select-String -Pattern ': gone]' | ForEach-Object{($_ -split "\s+")[1]} | %{ git branch -D $_ }
  1. 过滤所有标记为已消失的分支
  2. 调用git branch -D每个找到的分支
于 2016-03-01T22:47:08.230 回答
7

非常简单的解决方案:删除您的本地仓库并重新克隆远程仓库。可能看起来不是很优雅,但它很简单,您无需阅读手册页即可准确理解您在做什么:-)。

于 2015-05-13T21:37:43.360 回答
6

这些都不适合我。你可以在这里看到我的其他答案: 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
于 2016-01-23T22:33:29.303 回答
5

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

git branch -d branch_name_to_delete

如果您当前在该分支中,它会将您推回 master。在这一点上做一个拉

git pull
于 2018-02-19T19:26:16.217 回答
3

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

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

如果您也想删除不存在的跟踪:

git pull --prune
于 2017-12-07T07:57:45.003 回答
1

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

diff -u <(git branch|sed 's/..//') <(git branch -r|sed 's/..origin\///')|tail -n +4|sed -n "s/^-//p" -

完成此操作后,删除这些本地分支很容易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
于 2016-06-01T15:48:23.087 回答
-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)
于 2014-06-04T05:30:11.070 回答