我想删除在输出中列出的所有分支
$ git branch
Run Code Online (Sandbox Code Playgroud)
但保持现有的分支,一步到位.那可能吗?如果是这样,怎么样?
pan*_*ijs 151
$ git branch | grep -v "master" | xargs git branch -D
Run Code Online (Sandbox Code Playgroud)
将删除除master之外的所有分支,用要保留的分支替换master(将删除master)
Vad*_*est 59
根据@pankijs的回答,我做了两个git别名:
[alias]
# Delete all local branches but master and the current one, only if they are fully merged with master.
br-delete-useless = "!f(){\
git branch | grep -v "master" | grep -v ^* | xargs git branch -d;\
}; f"
# Delete all local branches but master and the current one.
br-delete-useless-force = "!f(){\
git branch | grep -v "master" | grep -v ^* | xargs git branch -D;\
}; f"
Run Code Online (Sandbox Code Playgroud)
要加入 ~/.gitconfig
并且,正如@torek所指出的那样:
请注意,小写
-d不会删除"非完全合并"分支(请参阅文档).使用-D将删除这样的分支,即使这导致提交变得"丢失"; 请谨慎使用它,因为这样也会删除分支reflog,因此通常的"从意外删除中恢复"的东西也不起作用.
基本上,-force如果你不是300%肯定你不会丢失任何重要的东西,永远不要使用该版本.因为它永远失去了.
Kho*_*lam 53
首先(切换到您要保留的分支 > ex : master):
git checkout master
Run Code Online (Sandbox Code Playgroud)
第二(确保你在master 上)
git branch -D $(git branch)
Run Code Online (Sandbox Code Playgroud)
tor*_*rek 13
git branch -d(或-D)允许多个分支名称,但是在不编写至少一点代码的情况下自动提供"除了我现在的那个之外的所有本地分支"有点棘手.
"最佳"(形式上正确的)方法是git for-each-ref用于获取分支名称:
git for-each-ref --format '%(refname:short)' refs/heads
Run Code Online (Sandbox Code Playgroud)
但是git symbolic-ref HEAD,如果你想编写一个花哨的脚本,那就更难找出你所在的分支(对于这种情况,这是"正式正确"的方法).
更方便的是,您可以使用git branch,它打印您的本地分支名称前面有两个空格或(对于当前分支)用星号打印*.因此,通过某些操作来删除*版本,并留下以空格分隔的分支名称,然后您可以将其传递给git branch -d:
git branch -d $(git branch | grep -v '^*')
Run Code Online (Sandbox Code Playgroud)
要么:
git branch | grep -v '^*' | xargs git branch -d
Run Code Online (Sandbox Code Playgroud)
请注意,小写-d不会删除"非完全合并"分支(请参阅文档).使用-D将删除这样的分支,即使这导致提交变得"丢失"; 请谨慎使用它,因为这样也会删除分支reflog,因此通常的"从意外删除中恢复"的东西也不起作用.
Dan*_*Dye 13
一步删除除当前分支外的所有分支:
git branch | grep -v $(git rev-parse --abbrev-ref HEAD) | xargs git branch -D
Ste*_*rov 11
要删除所有合并的分支(当前除外-v ‘*’):
git branch --merged | grep -v '*' | xargs git branch -D
Run Code Online (Sandbox Code Playgroud)
我也为repo完成清理做了这样的命令:
alias git-clean="git branch | grep -v '*' | grep -v 'master' | xargs git branch -D && git reset --hard && git clean -d -x -f"
Run Code Online (Sandbox Code Playgroud)
取自这里.
对于 Windows,在 Powershell 中使用:
git branch | %{ $_.Trim() } | ?{ $_ -ne 'master' } | %{ git branch -D $_ }
Run Code Online (Sandbox Code Playgroud)
删除除特定分支外的所有分支:
git branch | grep -v "branch name" | xargs git branch -D
Run Code Online (Sandbox Code Playgroud)
删除所有本地分支(开发和掌握者除外)
git branch | grep -v "develop" | grep -v "master" | xargs git branch -D
Run Code Online (Sandbox Code Playgroud)
假设您寻求删除除master 分支和当前功能分支(让其称为“team/features/dev-branch-name”)之外的所有分支,我想将其浓缩为:
查看分支:
git branch | grep -v -Fx "$(git branch --show-current)\|master"
Run Code Online (Sandbox Code Playgroud)
我看到一些答案表明grep -v "develop" | grep -v "master",但这是一个AND条件,即“给我所有其中没有“develop”的分支名称,并找到其中没有“master”的分支名称”。就我个人而言,我一直在寻找OR条件。
请注意避免意外删除 dev 分支:虽然这看起来很棒(由于没有对分支名称进行硬编码),但请注意,当您与删除命令一起运行此命令时,您可能无法在正确的分支上检出。如果您当前签出的分支是 master ,那么上面将列出除 master only之外的所有分支,而您的意图是列出除 master和dev 分支之外的所有分支。
因此,我认为最好通过实际写出您想要保留的分支的名称来确保万无一失:
git branch | grep -v -Fx 'team/features/dev-branch-name\|master'
Run Code Online (Sandbox Code Playgroud)
这样做的好处是您不需要在特定分支上签出即可正确列出它。
一旦您成功看到要删除的分支,请通过发出以下命令来删除它们:
git branch | grep -v -Fx 'team/features/dev-branch-name\|master' | xargs git branch -D
Run Code Online (Sandbox Code Playgroud)
以上仅坚持删除本地分支。要也删除远程分支(例如,在编辑/修剪通过存储库克隆的情况下您想要执行此操作),请使用:
git branch -r | grep -v -Fx 'team/features/dev-branch-name\|master' | cut -d'/' -f 2- | xargs -L 1 git push origin --delete
Run Code Online (Sandbox Code Playgroud)
这里发生的几件事-r是:列出所有远程分支(如果您已经删除了所有必要的本地分支,那么只剩下远程分支,您需要专门查询这些分支)。-Fx获取所有精确匹配并且-v是 NOT 条件。根据cut的手册页, tocut -d'/' -f 2-表示将结果除以“/”,然后取字段 2 直到行尾 (-f 2-)。如果您希望通过管道team/features/dev-branch-name而不是origin/team/features/dev-branch-nameto ,这非常有用xargs。如果你不这样做cut -d'/' -f 2-,那么你就会说“git push origin --delete origin/branch而不是” git push origin --delete branch。前者不起作用。一次一行向命令提供左侧输入的-L 1指示。xargsgit push
即使有了上述内容,如果您有包含单引号 ( ') 标记的远程分支,它也不会成功。为此,您可以尝试:
git branch -r | grep -v "'" | cut -d'/' -f 2- | xargs -L 1 git push origin --delete
Run Code Online (Sandbox Code Playgroud)
由于错误,我确实不得不手动删除这些时髦的单引号千疮百孔的分支fatal: invalid spec。
在本地删除所有合并的分支:
git branch -D `git branch --merged | grep -v \* | xargs`
Run Code Online (Sandbox Code Playgroud)
删除除特定分支之外的所有分支:
git branch | grep -v "branch name" | xargs git branch -D
Run Code Online (Sandbox Code Playgroud)
删除除develop和master之外的所有本地分支
git branch | grep -v "develop" | grep -v "master" | xargs git branch -D
Run Code Online (Sandbox Code Playgroud)
我使用它是因为我对不想删除的内容更有选择性。下面的命令删除除 master、develop 和当前分支之外的所有分支。
BRANCHES=$(git branch | egrep -v "(master|develop|\*)" | xargs git branch -D)
echo $BRANCHES
Run Code Online (Sandbox Code Playgroud)
所以我把这个放在我的 ~/.zshrc
delete_branches() {
BRANCHES=$(git branch | egrep -v "(master|develop|\*)" | xargs git branch -D)
echo $BRANCHES
}
alias cleanup_branches=delete_branches
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
37276 次 |
| 最近记录: |