我想删除在...的输出中列出的所有分支。
$ git branch
...但是一步一步地保持当前分支。那可能吗?如果是这样,怎么办?
我想删除在...的输出中列出的所有分支。
$ git branch
...但是一步一步地保持当前分支。那可能吗?如果是这样,怎么办?
Answers:
基于@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
会删除这些分支,即使这会导致提交“丢失”;请谨慎使用,因为这也会删除分支引用日志,因此通常的“从意外删除中恢复”的方法也不起作用。
基本上,-force
如果您不确定300%不会丢失任何重要内容,请不要使用该版本。因为它永远消失了。
git branch branchname commitid
$ 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"
。
首先(切换到要保留的分支> ex:master):
git checkout master
第二(确保您掌握掌握)
git branch -D $(git branch)
git branch -D $(git branch).Trim()
。
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
我也做了这样的命令来回购完整清理:
alias git-clean="git branch | grep -v '*' | grep -v 'master' | xargs git branch -D && git reset --hard && git clean -d -x -f"
从这里带走的。
删除除特定分支之外的所有分支:
git branch | grep -v "branch name" | xargs git branch -D
删除所有本地分支(开发和掌握除外)
git branch | grep -v "develop" | grep -v "master" | xargs git branch -D
在本地删除所有合并的分支:
git branch -D `git branch --merged | grep -v \* | xargs`
删除除特定分支之外的所有分支:
git branch | grep -v "branch name" | xargs git branch -D
删除所有本地分支(开发和掌握除外)
git branch | grep -v "develop" | grep -v "master" | xargs git branch -D
我曾经为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
因此,我在这里看到很多硬编码的分支名称...而且我认为这里的答案更准确地回答了问题的“当前分支”部分,同时使它保持单行且对像我这样的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命令在某些命令行上运行)
我之所以使用它,是因为我对不想删除的内容更具选择性。以下命令删除除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
恕我直言,删除本地分支机构最安全的方法是:
git branch -av | grep "\[gone\]" | awk '{print $1}' | xargs git branch -d
另外,有关此主题的更多信息,您可以找到删除所有本地git分支
gone
您应该使用的标记-vv
(详细两次),但-a
对您没有帮助(它还会列出远程分支)