我有一个本地和一个远程 Git 存储库。
在我的本地存储库中,我创建并切换到一个新分支:git checkout -b feature/niceNewFeature
我编写代码,git add .
,git commit
和 git 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
它的作用基本上如下:
- 以详细模式 (
-l
) 列出所有本地 (vv
) 分支(这几乎就像我们之前的输出)
- 它
cut
s 每行开头的第一个和第二个字符(空格)
- 与
awk
它过滤“消失”的( /: gone]/
),并获得他们的第一列( {print $1}
)。请记住,“消失”意味着远程跟踪引用不再存在。
- 输出(即要删除的分支的名称,在我们的例子中为
feature/niceNewFeature
)通过管道传输到git branch -d
。 (删除)与 xargs
命令,因此它将删除分支。注意分支必须在其上游分支完全 merge ,因为只有-d
使用选项,而不是 -D
(即 --delete --force
)。