如何删除已合并的分支?我可以一次删除所有分支,而不是逐个删除每个分支吗?
当前回答
公认的解决方案很好,但有一个问题,它还删除了尚未合并到远程的本地分支。
如果你查看的输出,你会看到
$ git branch --merged master -v
api_doc 3a05427 [gone] Start of describing the Java API
bla 52e080a Update wording.
branch-1.0 32f1a72 [maven-release-plugin] prepare release 1.0.1
initial_proposal 6e59fb0 [gone] Original proposal, converted to AsciiDoc.
issue_248 be2ba3c Skip unit-for-type checking. This needs more work. (#254)
master be2ba3c Skip unit-for-type checking. This needs more work. (#254)
分支bla和issue_248是将被默默删除的本地分支。
但您也可以看到单词[gone],它表示已被推到远程(现在已不存在)的分支,因此表示可以删除分支。
因此,原始答案可以更改为(拆分为多行以缩短行长度)
git branch --merged master -v | \
grep "\\[gone\\]" | \
sed -e 's/^..//' -e 's/\S* .*//' | \
xargs git branch -d
以保护尚未合并的分支。此外,也不需要为master提供保护,因为它在源位置有一个远程,不会显示为已删除。
其他回答
注意:如果您的工作流可能将master和dev作为祖先,则可以添加其他分支以排除它们。通常我从“sprint-start”标签分支出来,master、dev和qa都不是祖先。
首先,列出在远程中合并的本地跟踪分支(考虑使用-r标志列出所有远程跟踪分支)。
git branch --merged
您可能会看到一些不想删除的分支。我们可以添加一些参数来跳过我们不想删除的重要分支,比如master或develop。下面的命令将跳过master分支和其中包含dev的任何内容。
git branch --merged| egrep -v "(^\*|master|main|dev)"
如果要跳过,可以将其添加到egrep命令中,如下所示。不会删除分支skip_branch_name。
git branch --merged| egrep -v "(^\*|master|main|dev|skip_branch_name)"
要删除已合并到当前签出分支的所有本地分支,请执行以下操作:
git branch --merged | egrep -v "(^\*|master|main|dev)" | xargs git branch -d
您可以看到master和dev被排除在外,以防它们是祖先。
您可以通过以下方式删除合并的本地分支:
git branch -d branchname
如果未合并,请使用:
git branch -D branchname
要从远程使用中删除它,请执行以下操作:
git push --delete origin branchname
git push origin :branchname # for really old git
从远程删除分支后,可以通过以下方式进行修剪以消除远程跟踪分支:
git remote prune origin
或者如另一个答案所示,通过以下方式修剪单独的远程跟踪分支:
git branch -dr branchname
为了避免意外地从master以外的任何其他分支运行命令,我使用以下bash脚本。否则,从已合并非主分支的分支运行git branch--merged |grep-v“\*”|xargs-n 1 git branch-d可能会删除主分支。
#!/bin/bash
branch_name="$(git symbolic-ref HEAD 2>/dev/null)" ||
branch_name="(unnamed branch)" # detached HEAD
branch_name=${branch_name##refs/heads/}
if [[ $branch_name == 'master' ]]; then
read -r -p "Are you sure? [y/N] " response
if [[ $response =~ ^([yY][eE][sS]|[yY])$ ]]; then
git branch --merged | grep -v "\*" | xargs -n 1 git branch -d
fi
else
echo "Refusing to delete branches that are not merged into '$branch_name'. Checkout master first."
fi
要删除合并的分支,gitdelete合并的分支比shell黑客更健壮、更方便。它还检测重基合并和挤压合并。它的自述文件有更多细节。
git从git额外回购中删除合并的分支。
https://github.com/tj/git-extras/blob/master/Commands.md#git-删除合并的分支
Git中没有命令会自动为您执行此操作。但是你可以编写一个脚本,使用Git命令来满足你的需要。这可以通过多种方式实现,具体取决于您使用的分支模型。
如果您需要知道分支是否已合并到master中,如果myTopicBranch已合并,则以下命令将不会产生输出(即,您可以删除它)
$ git rev-list master | grep $(git rev-parse myTopicBranch)
您可以使用Gitbranch命令解析出Bash中的所有分支,并对所有分支执行for循环。在这个循环中,您可以使用上面的命令检查是否可以删除分支。
推荐文章
- 为什么我需要显式地推一个新分支?
- 如何撤消最后的git添加?
- Rubymine:如何让Git忽略Rubymine创建的.idea文件
- Gitignore二进制文件,没有扩展名
- Git隐藏错误:Git隐藏弹出并最终与合并冲突
- 了解Git和GitHub的基础知识
- 没有。Git目录的Git克隆
- Git与Mercurial仓库的互操作性
- 忽略git中修改(但未提交)的文件?
- “git restore”命令是什么?“git restore”和“git reset”之间有什么区别?
- Git合并与强制覆盖
- Git拉另一个分支
- 在Bash命令提示符上添加git分支
- 如何更改Git日志日期格式
- git pull -rebase和git pull -ff-only之间的区别