我想删除
输出中列出的所有分支$ git branch
但保持当前分支,一步。那可能吗?如果是这样,怎么样?
答案 0 :(得分:134)
$ git branch | grep -v "master" | xargs git branch -D
将删除除master之外的所有分支,用要保留的分支替换master(将删除master)
答案 1 :(得分:46)
根据@pankijs的回答,我制作了两个git别名:
render() {
const { input: { value, onChange }, callback, async, ...rest } = this.props;
if (async) {
return (
<Select.Async
onChange={(val) => {
onChange(val);
callback(val);
}}
value={value}
{...rest}
/>
);
}
return (
<Select
onChange={(val) => {
onChange(val);
callback(val);
}}
value={value}
{...rest}
/>
);
}
要添加到[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"
而且,正如@torek指出的那样:
请注意,小写
~/.gitconfig
不会删除&#34;非完全合并&#34;分支(参见文档)。使用-d
会删除此类分支,即使这会导致提交失败&#34 ;; 小心使用,因为这会删除分支reflog,以便通常&#34;从意外删除中恢复&#34;东西也不起作用。
基本上,如果您不是300%确定您不会失去任何重要的东西,请不要使用-D
版本。因为它已经永远。
答案 2 :(得分:12)
git branch -d
(或-D
)允许多个分支机构名称,但自动提供&#34;所有本地分支机构(不包括我现在正在进行的分支机构)&#34有点棘手34;没有编写至少一点代码。
&#34; best&#34; (形式上正确)方法是使用git for-each-ref
来获取分支名称:
git for-each-ref --format '%(refname:short)' refs/heads
但是,如果你想写一个分支,你就更难找出你所在的分支(git symbolic-ref HEAD
是#34;正式的正确#34;方法花哨的剧本)。
更方便的是,您可以使用git branch
打印您的本地分支名称前面有两个空格,或者(对于当前分支)打印一个星号*
。因此,运行此操作以删除*
版本,然后您将使用以空格分隔的分支名称,然后将其传递给git branch -d
:
git branch -d $(git branch | grep -v '^*')
或:
git branch | grep -v '^*' | xargs git branch -d
请注意,小写-d
不会删除&#34;非完全合并&#34;分支(参见文档)。使用-D
将删除此类分支,即使这会导致提交变为&#34;丢失&#34 ;;请谨慎使用它,因为这会删除分支reflogs,以便通常&#34;从意外删除恢复&#34;东西也不起作用。
答案 3 :(得分:8)
删除所有合并的分支(当前-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。
答案 4 :(得分:3)
首先(切换到您要保留的分支> ex : master ):
git checkout master
秒(确保确保您在主控上)
git branch -D $(git branch)
答案 5 :(得分:2)
我曾经为我的Windows环境创建了这个构造。也许它会帮助别人。 在执行期间,主分支和当前分支不会被删除。无论如何,所有其他合并的分支都将被删除。
@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
答案 6 :(得分:2)
删除除特定分支以外的所有分支:
Foo.objects.first().bar.all()
删除除 develop 和 master
以外的所有本地分支机构git branch | grep -v "branch name" | xargs git branch -D
答案 7 :(得分:2)
假设# The problem: Serialize a [psobject]-wrapped array (0, 0):
PS> ConvertTo-Json -InputObject (New-Object int[] 2)
# Note the extra object with the "count" (element count) and "value" property (elements)
{
"value": [
0,
0
],
"Count": 2
}
# Remove the ETS definitions for System.Array
Remove-TypeData System.Array
# Rerun the command:
PS> ConvertTo-Json -InputObject (New-Object int[] 2)
# OK
[
0,
0
]
显示以PS> $arr = New-Object int[] 2; ConvertTo-Json -InputObject $arr
# Note the extra object with the "count" (element count) and "value" property (elements)
{
"value": [
0,
0
],
"Count": 2
}
# $arr.psobject.BaseObject bypasses the [psobject] wrapper
PS> ConvertTo-Json -InputObject $arr.psobject.BaseObject
# OK
[
0,
0
]
为前缀的当前分支;使用Powershell,以下一个划线员将删除所有不以git branch
开头的分支。
*
*
=哪里对象
git branch | ? { $_ -lt "*" } | % { git branch -D $_.Trim() }
= Foreach对象
答案 8 :(得分:2)
之所以使用它,是因为我对不想删除的内容更具选择性。下面的命令删除除master,develop和当前分支以外的所有分支。
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
答案 9 :(得分:1)
在本地删除所有合并的分支:
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
答案 10 :(得分:0)
恕我直言,删除当地分支机构最安全的方法是:
git branch -av | grep "\[gone\]" | awk '{print $1}' | xargs git branch -d
此外,您可以找到与此主题相关的更多信息Delete all local git branches
答案 11 :(得分:0)
对于Windows,在Powershell中使用:
git branch | %{ $_.Trim() } | ?{ $_ -ne 'master' } | %{ git branch -D $_ }
答案 12 :(得分:0)
所以我在这里看到很多硬编码的分支名称...而且我认为这里的答案更准确地回答了问题的“当前分支”部分,同时使其保持单行且易于被像我这样的bash新手使用。只是将信用归于到期,答案显然也基于@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功能才能使sub命令在某些命令行上运行)
答案 13 :(得分:0)
要删除当前分支以外的所有分支,请执行以下步骤:
git branch | grep -v $(git rev-parse --abbrev-ref HEAD) | xargs git branch -D
答案 14 :(得分:0)
最简单的:
示例:
git branch -d branch1 && git branch -d branch2 && git branch -d branch3 && git branch -d branch4 && git branch -d branch5 && ...
这对我有用,我发现将许多分支一起删除非常容易,而且我还会收到每个分支的消息,这些分支被删除了,而那些分支没有被删除的错误消息。
答案 15 :(得分:0)
假设您要删除所有除了主分支和当前功能分支(我们称之为“团队/功能/开发分支名称”),我想把它浓缩为:
查看分支:
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
是非条件。根据 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
错误,我确实不得不手动删除这些时髦的单引号充斥着的分支。