如果本地 Git 分支的远程跟踪引用不再存在,则删除它们
Delete local Git branches if their remote-tracking references don't exist anymore
我有一个本地和一个远程 Git 存储库。
在我的本地存储库中,我创建并切换到一个新分支:git checkout -b feature/niceNewFeature
我编写代码,git add .
、git commit
和 git push
我的 feature/niceNewFeature
分支到远程存储库(例如 Git中心).
在此之后,我创建了一个 GitHub Pull Request 以将 feature/niceNewFeature
分支合并到 master
- 在代码被审查后,我将这样做。
由于feature/niceNewFeature
现在合并到master
,我会在GitHub上删除它。
但是,在我的本地存储库中,如果我执行 git branch
命令,feature/niceNewFeature 分支仍然会列出。
如何从我的本地存储库中删除 feature/niceNewFeature
分支,因为它已经合并到 master
并从远程存储库中删除?
简答:
git fetch --prune
git branch -lvv | cut -c3- | awk '/: gone]/ {print }' | 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 }' | xargs git branch -d
它的作用基本上如下:
- 以详细模式 (
vv
) 列出所有本地 (-l
) 分支(这与我们之前的输出几乎一样)
- 它
cut
是每行开头的第一个和第二个字符(空格)
- 使用
awk
过滤 "gone" 个 (/: gone]/
),并获取它们的第一列 ({print }
)。请记住,"gone" 意味着远程跟踪引用不再存在。
- 输出(这是要删除的分支的名称,在我们的示例中为
feature/niceNewFeature
)通过 xargs
命令通过管道传输到 git branch -d
(删除),因此它将删除分支。请注意,该分支必须在其上游分支中完全合并,因为只使用了 -d
选项,而不是 -D
(即 --delete --force
)。
你这样做:
git remote prune origin
(如果 'origin' 是您的 github 遥控器的名称,否则替换为正确的名称)
我有一个本地和一个远程 Git 存储库。
在我的本地存储库中,我创建并切换到一个新分支:
git checkout -b feature/niceNewFeature
我编写代码,
git add .
、git commit
和git push
我的feature/niceNewFeature
分支到远程存储库(例如 Git中心).在此之后,我创建了一个 GitHub Pull Request 以将
feature/niceNewFeature
分支合并到master
- 在代码被审查后,我将这样做。由于
feature/niceNewFeature
现在合并到master
,我会在GitHub上删除它。但是,在我的本地存储库中,如果我执行
git branch
命令,feature/niceNewFeature 分支仍然会列出。
如何从我的本地存储库中删除 feature/niceNewFeature
分支,因为它已经合并到 master
并从远程存储库中删除?
简答:
git fetch --prune
git branch -lvv | cut -c3- | awk '/: gone]/ {print }' | 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 }' | xargs git branch -d
它的作用基本上如下:
- 以详细模式 (
vv
) 列出所有本地 (-l
) 分支(这与我们之前的输出几乎一样) - 它
cut
是每行开头的第一个和第二个字符(空格) - 使用
awk
过滤 "gone" 个 (/: gone]/
),并获取它们的第一列 ({print }
)。请记住,"gone" 意味着远程跟踪引用不再存在。 - 输出(这是要删除的分支的名称,在我们的示例中为
feature/niceNewFeature
)通过xargs
命令通过管道传输到git branch -d
(删除),因此它将删除分支。请注意,该分支必须在其上游分支中完全合并,因为只使用了-d
选项,而不是-D
(即--delete --force
)。
你这样做:
git remote prune origin
(如果 'origin' 是您的 github 遥控器的名称,否则替换为正确的名称)