如果本地Git分支的远程跟踪引用不存在,则删除它们。

8
我有一个本地和一个远程 Git 仓库。
- 我在本地创建并切换到一个新的分支:git checkout -b feature/niceNewFeature - 进行编码,git add .git commitgit push 将我的 feature/niceNewFeature 分支推送到远程仓库(例如 GitHub)。 - 接着我创建了一个 GitHub Pull 请求,将 feature/niceNewFeature 分支合并到 master 分支上- 经过代码审核后,我会这样做。 - 由于 feature/niceNewFeature 已经合并到了 master,我会在 GitHub 上将其删除。 - 然而,在我的本地仓库中,如果我执行 git branch 命令,仍然会列出 feature/niceNewFeature 分支。
那么,既然它已经合并到了 master 并从远程仓库中删除了,我该如何从我的本地仓库中删除 feature/niceNewFeature 分支呢?

使用带有 --purge 标志的命令 git fetch --all --purge,它将删除所有分支、标签等。 - CodeWizard
1个回答

23

简短回答:

git fetch --prune

git branch -lvv | cut -c3- | awk '/: gone]/ {print $1}' | xargs git branch -d

详细回答:

首先,删除已在远程不存在的任何远程跟踪引用:

git fetch --prune(或git fetch -p

如果您执行此操作,然后运行git branch -vv(详细模式),您将看到尽管feature/niceNewFeature分支仍然列出,但上游分支现在为“gone”:

feature/niceNewFeature  832f7a7 [origin/feature/niceNewFeature: gone] Some commit message.

其次,让我们使用以下命令删除本地分支:

git branch -lvv | cut -c3- | awk '/: gone]/ {print $1}' | xargs git branch -d

它的作用基本如下:

  1. 以详细模式(-l)列出所有本地分支(vv)(几乎与我们之前的输出相同)
  2. cut去除每行开头的前两个字符(即空格)
  3. 使用awk过滤掉“gone”分支(/: gone]/),并获取它们的第一列({print $1})。请记住,“gone”表示远程跟踪引用已不存在。
  4. 输出(即要删除的分支名称,在我们的例子中是feature/niceNewFeature)被管道传输到使用xargs命令的git branch -d(删除)命令,因此它将删除该分支。请注意,该分支必须完全合并到其上游分支中,因为只使用了-d选项,而没有使用-D(即--delete --force)。

1
在我看来,这个答案比重复问题上被接受的答案要好(但也会出现在其他额外的回答中)。 - torek
1
就我个人而言,在我的电脑上,这可以简化为 git branch -vv | awk '/: gone]/ {print $1}' | xargs git branch -d-l标志和cut命令是不必要的)。 - Jesse
2
Bash别名考虑单引号:alias youralias='git branch -lvv | cut -c3- | awk '"'"'/: gone]/ {print $1}'"'"' | xargs git branch -d' - javi_swift

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接