【发布时间】:2015-04-18 18:51:42
【问题描述】:
我想删除在...的输出中列出的所有分支
$ git branch
...但保持当前分支,一步完成。那可能吗?如果有,怎么做?
【问题讨论】:
标签: git git-branch
我想删除在...的输出中列出的所有分支
$ git branch
...但保持当前分支,一步完成。那可能吗?如果有,怎么做?
【问题讨论】:
标签: git git-branch
$ git branch | grep -v "master" | xargs git branch -D
将删除除master之外的所有分支(将master替换为您要保留的分支,但随后它将删除master)
【讨论】:
grep -v ^*.
master-copy的分支
grep -v "^ *master$"
grep -v "master\|my-other-branch"。
根据@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"
待补充~/.gitconfig
而且,正如@torek 指出的那样:
请注意,小写
-d不会删除“未完全合并”的分支(请参阅文档)。使用-D将删除此类分支,即使这会导致提交“丢失”; 请谨慎使用,因为这也会删除分支引用日志,因此通常的“从意外删除中恢复”的内容也不起作用。
基本上,如果您不能 300% 确定自己不会丢失任何重要的东西,则永远不要使用 -force 版本。因为它已经永远丢失了。
【讨论】:
git branch branchname commitid重新创建指向某个提交的分支
first(切换到你要保留的分支>ex:master):
git checkout master
第二(确保确定你是master)
git branch -D $(git branch)
【讨论】:
git branch -D $(git branch).Trim()。
$(git branch) 放在引号里吗?这不起作用:错误:找不到分支'$(git'。错误:找不到分支'分支)'。
git branch -D `git branch`
删除除特定分支之外的所有分支:
git branch | grep -v "branch name" | xargs git branch -D
删除所有本地分支,除了 develop 和 master
git branch | grep -v "develop" | grep -v "master" | xargs git branch -D
【讨论】:
对于 Windows,在 Powershell 中使用:
git branch | %{ $_.Trim() } | ?{ $_ -ne 'master' } | %{ git branch -D $_ }
【讨论】:
一步删除当前分支以外的所有分支:
git branch | grep -v $(git rev-parse --abbrev-ref HEAD) | xargs git branch -D
【讨论】:
git branch -d(或-D)允许多个分支名称,但在不编写至少一点代码的情况下自动提供“所有本地分支,不包括我现在使用的分支”有点棘手。
“最佳”(形式上正确)的方法是使用git for-each-ref 来获取分支名称:
git for-each-ref --format '%(refname:short)' refs/heads
但随后更难确定您在哪个分支上(git symbolic-ref HEAD 是“正式正确”的方法,如果您想编写一个花哨的脚本)。
更方便的是,您可以使用git branch,它会打印您的本地分支名称,前面有两个空格,或者(对于当前分支)使用星号*。因此,运行此程序以删除 * 版本,然后您将获得以空格分隔的分支名称,然后您可以将其传递给 git branch -d:
git branch -d $(git branch | grep -v '^*')
或:
git branch | grep -v '^*' | xargs git branch -d
请注意,小写 -d 不会删除“未完全合并”的分支(请参阅文档)。使用-D 将删除此类分支,即使这会导致提交“丢失”;使用它时要非常小心,因为这也会删除分支引用日志,因此通常的“从意外删除中恢复”的东西也不起作用。
【讨论】:
git branch -D $(git branch | grep -v '^*')。
删除所有合并的分支(当前-v ‘*’除外):
git branch --merged | grep -v '*' | xargs git branch -D
我也做了这样的命令来完成 repo 清理:
alias git-clean="git branch | grep -v '*' | grep -v 'master' | xargs git branch -D && git reset --hard && git clean -d -x -f"
取自here。
【讨论】:
在本地删除所有合并的分支:
git branch -D `git branch --merged | grep -v \* | xargs`
删除除特定分支之外的所有分支:
git branch | grep -v "branch name" | xargs git branch -D
删除所有本地分支,除了 develop 和 master
git branch | grep -v "develop" | grep -v "master" | xargs git branch -D
【讨论】:
我使用它是因为我可以更有选择性地选择不想删除的内容。下面这个命令会删除除 master、develop 和 current 分支之外的所有分支。
BRANCHES=$(git branch | egrep -v "(master|develop|\*)" | xargs git branch -D)
echo $BRANCHES
所以我把它放在我的~/.zshrc
delete_branches() {
BRANCHES=$(git branch | egrep -v "(master|develop|\*)" | xargs git branch -D)
echo $BRANCHES
}
alias cleanup_branches=delete_branches
【讨论】:
我曾经为我的 Windows 环境创建了这个结构。也许它会帮助别人。 在执行期间,master 和 current 分支不会被删除。无论如何,所有其他合并的分支都将被删除。
@echo off
cd PATH_TO_YOUR_REPO
REM -- Variable declerations
set "textFile=tempBranchInfo.txt"
set "branchToKeep=master"
set "branchToReplaceWith="
git branch --merged > %textFile%
REM -- remove "master" from list to keep the branch
for /f "delims=" %%i in ('type "%textFile%" ^& break ^> "%textFile%" ') do (
set "line=%%i"
setlocal enabledelayedexpansion
>>"%textFile%" echo(!line:%branchToKeep%=%branchToReplaceWith%!
endlocal
)
REM -- execute branch delete commands
for /f "delims=" %%a in (%textFile%) do (
git branch -D %%a
)
REM -- remove temp-file with branch information inside
DEL %textFile%
REM -- show local branches after the cleaning
echo Local branches:
git branch
pause
exit
【讨论】:
假设git branch显示当前分支以*为前缀;使用Powershell下面一行将删除所有不以*开头的分支。
git branch | ? { $_ -lt "*" } | % { git branch -D $_.Trim() }
? = Where-Object
% = Foreach-对象
【讨论】:
假设您试图删除所有除了主分支和当前功能分支(我们称之为'team/features/dev-branch-name'),我'想把它浓缩成一句话:
查看分支:
git branch | grep -v -Fx "$(git branch --show-current)\|master"
我看到一些答案建议 grep -v "develop" | grep -v "master",但这是一个 AND 条件,即“给我所有没有“开发”的分支名称,找到那些没有“主人”在他们身上”。就个人而言,我一直在寻找 OR 条件。
注意避免意外删除 dev 分支: 虽然这看起来很棒(由于分支名称没有硬编码),但请注意,当您同时运行它时,您可能不会在正确的分支上签出一个删除命令。如果您当前签出的分支是 master,那么上面将列出除 master only 之外的所有分支,而您的意图是列出除 master 和 dev 分支之外的所有分支。
因此,我认为最好通过实际写出您想要保留的分支的名称来做到这一点:
git branch | grep -v -Fx 'team/features/dev-branch-name\|master'
这样做的好处是您无需在特定分支上签出即可正确列出。
成功查看要删除的分支后, 通过发出删除它们:
git branch | grep -v -Fx 'team/features/dev-branch-name\|master' | xargs git branch -D
以上仅坚持删除本地分支。 要删除远程分支(例如,在编辑/修剪克隆的 repo 等情况下,您希望这样做),请使用:
git branch -r | grep -v -Fx 'team/features/dev-branch-name\|master' | cut -d'/' -f 2- | xargs -L 1 git push origin --delete
这里发生了几件事:-r 是列出所有远程分支(如果您已经删除了所有必要的本地分支,那么只剩下远程分支,您需要专门查询这些分支)。 -Fx 获得所有完全匹配,-v 是一个 NOT 条件。根据cut 的手册页,cut -d'/' -f 2- 表示用“/”划分结果,然后取字段 2 直到行尾 (-f 2-)。如果您希望通过管道将team/features/dev-branch-name 而非origin/team/features/dev-branch-name 传送到xargs,这将非常有用。
如果您不使用cut -d'/' -f 2-,那么您会说git push origin --delete origin/branch 而不是git push origin --delete branch。前者不起作用。 -L 1 告诉 xargs 提供左侧输入到 git push 命令一次一行。
即使使用上述方法,如果您有包含单引号 (') 标记的远程分支,它也不会成功。为此,您可以尝试:
git branch -r | grep -v "'" | cut -d'/' -f 2- | xargs -L 1 git push origin --delete
由于fatal: invalid spec 错误,我不得不手动删除这些时髦的单引号分支。
【讨论】:
所以我在这里看到了很多硬编码的分支名称......而且我认为我在这里的回答更准确地反映了问题的“当前分支”部分,同时保持单行并且对于像我这样的新手来说是可读的。只是为了将功劳归于应有的位置,答案显然也基于@pankijs的答案。
git branch | grep -v $(git branch --show-current) | xargs git branch -d
我在 debian 的 .bash_aliases 中的一行上也有它的别名。
alias gitbclean='git branch | grep -v $(git branch --show-current) | xargs git branch -d'
(虽然我认为子命令需要启用一些 bash 功能才能在某些命令行上运行)
【讨论】:
恕我直言,删除本地分支机构的最安全方法是:
git branch -av | grep "\[gone\]" | awk '{print $1}' | xargs git branch -d
此外,您可以找到与此主题相关的更多信息Delete all local git branches
【讨论】:
gone 标记,您应该使用-vv(详细两次),而-a 对您没有帮助(它还列出了远程分支)
最简单的以上所有方法:
示例:
git branch -d branch1 && git branch -d branch2 && git branch -d branch3 && git branch -d branch4 && git branch -d branch5 && ...这对我有用,我发现一起删除许多分支非常容易,我还会收到每个被删除的分支的消息,以及那些未能删除的分支的错误消息。
【讨论】: