Подтвердить что ты не робот

Можно ли удалить все локальные ветки, кроме текущего?

Я хочу удалить все ветки, которые перечислены в выходных данных...

$ git branch

... но сохраняя текущую ветку, за один шаг. Это возможно? Если так, то как?

4b9b3361

Ответ 1

Основываясь на ответе @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%, что не потеряете ничего важного. Потому что это потеряно навсегда.

Ответ 2

$ git branch | grep -v "master" | xargs git branch -D 

удалит все ветки, кроме главной (замените главную ветвь, которую хотите сохранить, но затем удалите главную)

Ответ 3

git branch -d (или -D) допускает несколько имен ветвей, но немного сложно использовать "все локальные ветки, кроме того, на котором я сейчас включен", не записывая хотя бы немного кода.

"Лучший" (формально правильный) метод заключается в использовании git for-each-ref для получения имен ветвей:

git for-each-ref --format '%(refname:short)' refs/heads

но тогда еще сложнее определить, в какую ветвь вы находитесь (git symbolic-ref HEAD - это "формально правильный" метод для этого, если вы хотите написать fancy script).

Более удобно использовать git branch, который печатает имена локальных ветвей, которым предшествуют два пробела или (для текущей ветки) звездочкой *. Итак, запустите это через что-то, чтобы удалить версию *, и вы останетесь с именами ветвей, разделенных пробелами, которые затем можно передать в git branch -d:

git branch -d $(git branch | grep -v '^*')

или

git branch | grep -v '^*' | xargs git branch -d

Обратите внимание, что строчный -D не удаляет ветвь "не полностью объединенная" (см. документацию). Использование -D приведет к удалению таких ветвей, даже если это приводит к тому, что коммит становится "потерянным"; используйте это с особой осторожностью, так как это также удаляет фальшивые ветки, так что обычное "восстановление после случайного удаления" тоже не работает.

Ответ 4

Чтобы удалить все объединенные ветки (кроме текущей -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"

взяты отсюда

Ответ 5

Удалить все ветки, кроме определенной:

git branch | grep -v "branch name" | xargs git branch -D

Удалите все локальные ветки, кроме как разработать и освоить

git branch | grep -v "develop" | grep -v "master" | xargs git branch -D

Ответ 6

Удалить все объединенные ветки локально:

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

Ответ 7

Однажды я создал эту конструкцию для своей среды 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

Ответ 8

Для Windows в Powershell используйте:

git branch | %{ $_.Trim() } | ?{ $_ -ne 'master' } | %{ git branch -D $_ }

Ответ 9

Предполагая, что git branch показывает текущую ветвь с префиксом *; Используя Powershell, следующий вкладыш удалит все ветки, которые не начинаются с *.

git branch | ? { $_ -lt "*" } | % { git branch -D $_.Trim() }

? = Где-Объект

% = Foreach-Object

Ответ 10

сначала (переключитесь на ветку, которую хотите сохранить> ex: master):

git checkout master

второй (убедитесь, что sure вы являетесь мастером)

git branch -D $(git branch)

Ответ 11

ИМХО, самый безопасный способ удаления локальных веток это:

git branch -av | grep "\[gone\]" | awk '{print $1}' | xargs git branch -d

Кроме того, больше информации, связанной с этой темой, вы можете найти Удалить все локальные ветки Git