根据您希望进行操作的频率,您可以选择手动执行(首先解释)或使用脚本执行(之后解释)。以下假设存在一个指向您复制的仓库的"上游(upstream)"远程。例如:
$ git remote -v
origin git@github.com:you/repo.git (fetch)
origin git@github.com:you/repo.git (push)
upstream git://github.com/original/repo.git (fetch)
upstream git://github.com/original/repo.git (push)
列出所有已合并的本地分支
要获取已经与上游主分支合并过的分支列表:
$ git fetch upstream
$ git branch --merged upstream/master
my-feature
my-other-feature
master
您可以随后删除它们:
$ git branch -d my-feature
$ git branch -d my-other-feature
如果更改是手动应用的,则可能不在上游历史记录中,因此具有等效代码更改的本地分支可能不会列出。需要手动检测这种情况的分支。
删除不存在的远程分支的本地引用
如果您有本地分支代表已经被删除的远程分支(分支是为拉取请求而创建的,在合并拉取请求后,通过github的gui删除了分支),则有一个标准的git命令来清理这些分支引用:
$ git remote prune origin
删除已合并的远程分支
要获取您的 fork 中已合并的远程分支列表,类似于第一个命令,但使用 -r
开关(远程分支):
$ git branch -r --merged upstream/master
origin/my-feature
origin/my-other-feature
upstream/someone-elses-branch
要删除已合并的自己的远程分支:
$ git push origin :my-feature
$ git push --delete origin my-other-feature # equivalent, just different syntax
脚本解决方案
使用脚本解决方案时要小心,因为很容易意外删除您不想删除的分支。但是请记住,分支只是引用/名称 - 意外删除分支并不意味着内容丢失,它们可以轻松恢复(例如,只需检查git reflog
)。
下面的脚本将删除以“feature”开头的本地和远程分支 - 这是确保您自己的最新主分支不会被意外删除的一种方法。
#!/bin/bash
echo -n "Fetching latest ... "
git fetch origin
git fetch upstream
echo "done"
echo "Deleting merged local feature branches ... "
branches=`git branch --no-color --merged upstream/master`
for branch in $branches;
do
if [[ "$branch" =~ ^feature ]]; then
git branch -d $branch;
fi
done
echo "done"
echo "Deleting local refs to remote branches that don't exist ... "
git remote prune origin
git remote prune upstream
echo "done"
echo "Deleting merged remote feature and hotfix branches ... "
branches=`git branch -r --no-color --merged upstream/master`
for branch in $branches;
do
if [[ "$branch" =~ ^(origin)\/(feature.*$) ]]; then
remote=${BASH_REMATCH[1]};
branch=${BASH_REMATCH[2]};
git push $remote :$branch;
fi
done
echo "done"
echo ""
echo "all finished"