我如何删除已合并的所有Git分支?
我有很多Git分支。 如何删除已经合并的分行? 有一个简单的方法来删除它们,而不是一个一个地删除它们吗?
更新:
如果您的工作stream将这些分支作为可能的祖先,那么您可以添加其他分支来排除master和dev。 通常我会分出一个“sprint-start”的标签,而master,dev和qa不是祖先。
要删除已经合并到当前签出分支中的所有本地分支:
git branch --merged | egrep -v "(^\*|master|dev)" | xargs git branch -d
你可以看到,主人和开发者被排除在外的情况下,他们是一个祖先。
您可以删除合并的本地分支:
git branch -d branchname
如果没有合并,请使用:
git branch -D branchname
要在旧版本的Git中从远程删除它,请使用:
git push origin :branchname
在更新的Git版本中使用:
git push --delete origin branchname
一旦从远程删除分支,您可以删除远程跟踪分支:
git remote prune origin
或修剪个别的远程追踪分支,如其他答案所示:
git branch -dr branchname
希望这可以帮助。
删除已经合并的所有远程分支:
git branch -r --merged | grep -v master | sed 's/origin\//:/' | xargs -n 1 git push origin
在更新的Git版本中
git branch -r --merged | grep -v master | sed 's/origin\///' | xargs -n 1 git push --delete origin
只是稍微扩展Adam的答案:
通过运行git config -e --global
将其添加到您的Gitconfiguration中
[alias] cleanup = "!git branch --merged | grep -v '\\*\\|master\\|develop' | xargs -n 1 git branch -d"
然后你可以删除所有的本地合并分支做一个简单的git cleanup
。
这也可以删除除master以外的所有合并分支。
git branch --merged | grep -v '^* master$' | grep -v '^ master$' | xargs git branch -d
你会想从这些命令中排除master
& develop
分支。
本地git明确:
git branch --merged | grep -v '\*\|master\|develop' | xargs -n 1 git branch -d
远程git明确:
git branch -r --merged | grep -v '\*\|master\|develop' | sed 's/origin\///' | xargs -n 1 git push --delete origin
同步远程分支的本地registry:
git fetch -p
对于那些在Windows上,喜欢PowerShell脚本的人,这里是一个删除本地合并分支:
function Remove-MergedBranches { git branch --merged | ForEach-Object { $_.Trim() } | Where-Object {$_ -NotMatch "^\*"} | Where-Object {-not ( $_ -Like "*master" )} | ForEach-Object { git branch -d $_ } }
Git Sweep在这方面做得很好。
您可以将提交添加到–merged选项。 这样,你可以确保只删除合并到的分支,即原点/主
以下命令将从您的原点删除合并的分支。
git branch -r --merged origin/master | grep -v "^.*master" | sed s:origin/:: |xargs -n 1 git push origin --delete
你可以testing哪个分支将被删除,replacegit push origin – 用echo删除
git branch -r --merged origin/master | grep -v "^.*master" | sed s:origin/:: |xargs -n 1 echo
我使用下面的Ruby脚本来删除我已经合并的本地和远程分支。 如果我为一个具有多个遥控器的存储库进行操作,并且只想从一个遥控器中删除,我只需在遥控列表中添加一个select语句即可获得我想要的遥控器。
#!/usr/bin/env ruby current_branch = `git symbolic-ref --short HEAD`.chomp if current_branch != "master" if $?.exitstatus == 0 puts "WARNING: You are on branch #{current_branch}, NOT master." else puts "WARNING: You are not on a branch" end puts end puts "Fetching merged branches..." remote_branches= `git branch -r --merged`. split("\n"). map(&:strip). reject {|b| b =~ /\/(#{current_branch}|master)/} local_branches= `git branch --merged`. gsub(/^\* /, ''). split("\n"). map(&:strip). reject {|b| b =~ /(#{current_branch}|master)/} if remote_branches.empty? && local_branches.empty? puts "No existing branches have been merged into #{current_branch}." else puts "This will remove the following branches:" puts remote_branches.join("\n") puts local_branches.join("\n") puts "Proceed?" if gets =~ /^y/i remote_branches.each do |b| remote, branch = b.split(/\//) `git push #{remote} :#{branch}` end # Remove local branches `git branch -d #{local_branches.join(' ')}` else puts "No branches removed." end end
使用Git 2.5.0版本:
git branch -d `git branch --merged`
kuboon的答案错过了在分支名称中删除具有master主字段的分支。 以下对他的回答进行了改进:
git branch -r --merged | grep -v "origin/master$" | sed 's/\s*origin\///' | xargs -n 1 git push --delete origin
当然,它并不删除“主”分支本身:)
Git中没有任何命令会自动为您执行此操作。 但是你可以编写一个使用Git命令的脚本来为你提供所需的东西。 这可以通过多种方式来完成,具体取决于您使用的分支模型。
如果你需要知道一个分支是否已经被合并到master中,如果myTopicBranch已经被合并(即你可以删除它),下面的命令将不会产生输出。
$ git rev-list master | grep $(git rev-parse myTopicBranch)
你可以使用Git分支命令,parsingBash中的所有分支,并对所有分支进行for
循环。 在这个循环中,你可以使用上面的命令来检查是否可以删除分支。
git branch --merged | grep -Ev '^(. master|\*)' | xargs -n 1 git branch -d
git branch --merged | grep -Ev '^(. master|\*)' | xargs -n 1 git branch -d
将删除当前所有分支和/或master
分支。
对于那些希望了解这些命令的人来说,这里有一篇有用的文章: Git Clean:删除已经合并的分支,作者:Steven Harman 。
如何删除PowerShell控制台中的合并分支
git branch --merged | %{git branch -d $_.Trim()}
请参阅Windows的GitHub
你可以使用git-del-br
工具 。
git-del-br -a
你可以使用pip
来安装它
pip install git-del-br
PS:我是这个工具的作者。 任何build议/意见,欢迎。
亚当的更新答案的别名版本:
[alias] branch-cleanup = "!git branch --merged | egrep -v \"(^\\*|master|dev)\" | xargs git branch -d #"
此外,看到这个答案为转义复杂的别名方便的提示。
尝试以下命令:
git branch -d $(git branch --merged | grep -vw $(git rev-parse --abbrev-ref HEAD))
通过使用git rev-parse
将获得当前分支名称以排除它。 如果你有错误,这意味着没有地方分支去除。
要对远程分支执行相同操作(使用远程名称更改origin
),请尝试:
git push origin -vd $(git branch -r --merged | grep -vw $(git rev-parse --abbrev-ref HEAD) | cut -d/ -f2)
如果你有多个遥控器,添加grep origin |
之前cut
只过滤origin
。
如果上述命令失败,请尝试先删除合并的远程跟踪分支:
git branch -rd $(git branch -r --merged | grep -vw $(git rev-parse --abbrev-ref HEAD))
然后git fetch
再次git fetch
远程并再次使用以前的git push -vd
命令。
如果您经常使用它,请考虑将其作为别名添加到~/.gitconfig
文件中。
如果您错误地删除了一些分支,请使用git reflog
来查找丢失的提交。
基于这些答案我做了我自己的Bash脚本也做到了 !
它使用git branch --merged
和git branch -d
删除已合并的分支,并在删除之前提示您为每个分支。
merged_branches(){ local current_branch=$(git rev-parse --abbrev-ref HEAD) for branch in $(git branch --merged | cut -c3-) do echo "Branch $branch is already merged into $current_branch." echo "Would you like to delete it? [Y]es/[N]o " read REPLY if [[ $REPLY =~ ^[Yy] ]]; then git branch -d $branch fi done }
我使用git-flow esque命名scheme,所以这对我来说非常安全:
git branch --merged | grep -e "^\s\+\(fix\|feature\)/" | xargs git branch -d
它基本上寻找以stringfix/
或feature/
开始的合并提交。
如果您想删除已经合并到您当前所在分支的所有本地分支机构,则基于较早的答案,我已经提出了一个安全的命令:
git branch --merged | grep -v \* | grep -v '^\s*master$' | xargs -t -n 1 git branch -d
这个命令不会影响你当前的分支或你的主分支。 它还会在使用xargs的-t标志之前告诉你它在做什么。
编写一个脚本,在这个脚本中,Git检出所有已经合并为主的分支。
然后做git checkout master
。
最后,删除合并的分支。
for k in $(git branch -ra --merged | egrep -v "(^\*|master)"); do branchnew=$(echo $k | sed -e "s/origin\///" | sed -e "s/remotes\///") echo branch-name: $branchnew git checkout $branchnew done git checkout master for k in $(git branch -ra --merged | egrep -v "(^\*|master)"); do branchnew=$(echo $k | sed -e "s/origin\///" | sed -e "s/remotes\///") echo branch-name: $branchnew git push origin --delete $branchnew done
为了避免意外地从主控以外的其他分支运行命令,我使用下面的bash脚本。 否则,运行git branch --merged | grep -v "\*" | xargs -n 1 git branch -d
git branch --merged | grep -v "\*" | xargs -n 1 git branch -d
git branch --merged | grep -v "\*" | xargs -n 1 git branch -d
从已经被合并的master的分支可以删除master分支。
#!/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
要删除已经合并到主分支的本地分支,我使用下面的别名( git config -e --global
):
cleanup = "!git branch --merged master | grep -v '^*\\|master' | xargs -n 1 git branch -D"
我正在使用git branch -D
来避免error: The branch 'some-branch' is not fully merged.
消息,而我目前的结帐不同于主分支。
Windoze友好的Python脚本(因为Wesnoth仓库中的git-sweep
窒息):
#!/usr/bin/env python # Remove merged git branches. Cross-platform way to execute: # # git branch --merged | grep -v master | xargs git branch -d # # Requires gitapi - https://bitbucket.org/haard/gitapi # License: Public Domain import gitapi repo = gitapi.Repo('.') output = repo.git_command('branch', '--merged').strip() for branch in output.split('\n'): branch = branch.strip() if branch.strip(' *') != 'master': print(repo.git_command('branch', '-d', branch).strip())
如果您正在使用分支模型(如HubFlow或GitFlow),则可以使用此命令删除合并的function分支:
git branch --merged | grep feature.* | grep -v "\*" | xargs -n 1 git branch -d
如果你想删除已经合并的地方分行,并删除他们的遥控器这里是我喜欢的一行:
git branch --merged | xargs -I_br -- sh -c 'git branch -d _br; git push origin --delete _br'
for b in $(git branch -a | grep -v "\(master\|remotes\)"); do \ git branch -D $b; done && git fetch -p
比方说,我有一个远程命名上游和一个起源(GitHub风格,我的叉子是起源,上游是上游)。
我不想删除任何主人,头,或任何上游。 我也不想删除开发分支,因为这是我们从中创buildPR的通用分支。
列出所有的远程分支,按合并后的分支进行过滤:
git branch -r
从列表中删除包含我知道在分支名称中的词的行我不想删除:
sed '/develop\|master\|HEAD\|upstream/d'
从引用名称中删除远程名称(origin / somebranch变成somerranch):
sed 's/.*\///'
使用xargs来调用一行代码:
xargs git push --delete origin
把它们一起pipe起来,你会得到:
git branch -r --merged | sed '/develop\|master\|HEAD\|upstream/d' | sed 's/.*\///' | xargs git push --delete origin
这将使我只有一些我曾经工作过的分支,但没有合并。 您可以逐一删除它们,因为不应该有太多。
find你不再想要的分支:
git branch -ar
说你find你想要删除的branch1,branch2和branch3:
git push --delete origin branch1 branch2 branch3
我的Bash脚本贡献是基于mmrobin的答案松散。
它需要一些有用的参数指定包括和排除,或检查/删除只有本地或远程分支,而不是两者。
#!/bin/bash # exclude branches regex, configure as "(branch1|branch2|etc)$" excludes_default="(master|next|ag/doc-updates)$" excludes="__NOTHING__" includes= merged="--merged" local=1 remote=1 while [ $# -gt 0 ]; do case "$1" in -i) shift; includes="$includes $1" ;; -e) shift; excludes="$1" ;; --no-local) local=0 ;; --no-remote) remote=0 ;; --all) merged= ;; *) echo "Unknown argument $1"; exit 1 ;; esac shift # next option done if [ "$includes" == "" ]; then includes=".*" else includes="($(echo $includes | sed -e 's/ /|/g'))" fi current_branch=$(git branch --no-color 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/\1/') if [ "$current_branch" != "master" ]; then echo "WARNING: You are on branch $current_branch, NOT master." fi echo -e "Fetching branches...\n" git remote update --prune remote_branches=$(git branch -r $merged | grep -v "/$current_branch$" | grep -v -E "$excludes" | grep -v -E "$excludes_default" | grep -E "$includes") local_branches=$(git branch $merged | grep -v "$current_branch$" | grep -v -E "$excludes" | grep -v -E "$excludes_default" | grep -E "$includes") if [ -z "$remote_branches" ] && [ -z "$local_branches" ]; then echo "No existing branches have been merged into $current_branch." else echo "This will remove the following branches:" if [ "$remote" == 1 -a -n "$remote_branches" ]; then echo "$remote_branches" fi if [ "$local" == 1 -a -n "$local_branches" ]; then echo "$local_branches" fi read -p "Continue? (y/n): " -n 1 choice echo if [ "$choice" == "y" ] || [ "$choice" == "Y" ]; then if [ "$remote" == 1 ]; then remotes=$(git remote) # Remove remote branches for remote in $remotes do branches=$(echo "$remote_branches" | grep "$remote/" | sed "s/$remote\/\(.*\)/:\1 /g" | tr -d '\n') git push $remote $branches done fi if [ "$local" == 1 ]; then # Remove local branches locals=$(echo "$local_branches" | sed 's/origin\///g' | tr -d '\n') if [ -z "$locals" ]; then echo "No branches removed." else git branch -d $(echo "$locals" | tr -d '\n') fi fi fi fi
如果您从本地计算机上删除,这是我的直接方式:
只需进入: C:\Repo\your-project\.git\refs\heads
每个分支是在这个文件夹下创build的文件,只是删除与您的分支名称匹配的文件。
在Windows上很难find一种方法。 我只是想通过这种方式,它确实救了我的Windows安装。