git - 如果远程跟踪引用不再存在,则删除本地 Git 分支

标签 git github version-control branch git-branch

<分区>

我有一个本地和一个远程 Git 存储库。

  • 在我的本地存储库中,我创建并切换到一个新分支:git checkout -b feature/niceNewFeature

  • 我编写代码,git add .git commitgit push 我的 feature/niceNewFeature 分支到远程存储库(例如 GitHub)。

  • 在此之后,我创建一个 GitHub pull 请求以将 feature/niceNewFeature 分支 merge 到 master - 代码经过审查后,我将这样做。

  • 由于feature/niceNewFeature现在 merge 到master,我会在GitHub上删除它。

  • 但是,在我的本地存储库中,如果我执行 git branch 命令,feature/niceNewFeature 分支仍然会列出。

我如何从我的本地存储库中删除 feature/niceNewFeature 分支,因为它已经 merge 到 master 并从远程存储库中删除?

最佳答案

简答:

git fetch --prune

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

详细答案:

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

git fetch --prune (或 git fetch -p)

如果你这样做,然后你运行 git branch -vv (详细),你会看到虽然 feature/niceNewFeature分支仍然列出,上游分支现在“消失”了:

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 s 每行开头的第一个和第二个字符(空格)
  3. awk它过滤“消失”的( /: gone]/ ),并获得他们的第一列( {print $1} )。请记住,“消失”意味着远程跟踪引用不再存在。
  4. 输出(即要删除的分支的名称,在我们的例子中为feature/niceNewFeature)通过管道传输到git branch -d。 (删除)与 xargs命令,因此它将删除分支。注意分支必须在其上游分支完全 merge ,因为只有-d使用选项,而不是 -D (即 --delete --force )。

关于git - 如果远程跟踪引用不再存在,则删除本地 Git 分支,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44477690/

相关文章:

git - git svn 与 git 子树兼容吗?

git - 当我 git clone : fatal: does not appear to be a git repository

git - 无法克隆 github 存储库

Git merge 来自特定上游版本的提交

git - 我如何解决一条 GitHub 消息,指出我当前分支的尖端落后于它的远程分支?

version-control - Subversion 的免费源代码管理替代方案

git - git diff --staged 与 git diff --cached HEAD 相同吗?

git - 如何确定 git 提交是否跳过了 pre-hook 检查?

java - 与 jitpack 使用的分支相关的 github 版本

java - 列出由 Hudson 制作的所有构建的应用程序