Чи можу я видалити всі локальні гілки, крім поточної?


95

Я хочу видалити всі гілки, які перераховані у вихідних даних ...

$ git branch

... але збереження поточної гілки в один крок . Це можливо? Якщо так, то як?




Відповіді:


66

На основі відповіді @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
коміти у видаленій гілці ще деякий час все ще повинні бути в перегляді.
CaptRespect

Дійсно, коміти залишалися б переробленими. Але не сама гілка. Я б не спробував, але, мабуть, ви можете знайти свої комітети, але повернутися до штату філії? Я сумніваюся. Cherry-pick можна використовувати для отримання комітів у видаленій гілці, але ви не зможете відновити саму гілку.
Vadorequest

1
@Vadorequest ви можете заново створити гілку, вказуючи певний git branch branchname commitid
коміт,

@pqnet Я не знав, що це відтворить всю історію цієї галузі, дякую, приємно знати!
Vadorequest

1
@Vadorequest, оскільки об'єкти коміту незмінні (і індексуються як хеші), кожне редагування вимагає створення нового об'єкта (з іншим хешем)
pqnet,

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

видалить всі гілки, крім master (замініть master на гілку, яку ви хочете зберегти, але потім видалить master)


30
Якщо ви хочете зберегти поточне використання гілки grep -v ^*.
Schwern

2
Багато джерел показують мені цей сценарій, але коли я запускаю його, завжди кажу мені, що гілок не знайдено :(
tucq88

1
це не точно, це не призведе до видалення гілки під назвою master-copy, наприклад
mvallebr

2
Тоді підготуйте регулярний вираз, наприклад, наприкладgrep -v "^ *master$"
Бред Кох,

8
Якщо ви хочете зберегти дві гілки, використовуйте grep -v "master\|my-other-branch".
Дерек Сойке,

18

спочатку (перейдіть до гілки, яку ви хочете зберегти> ex : master ):

git checkout master

друге (переконайтеся, що ви на магістратурі )

git branch -D $(git branch)

3
дуже швидко і просто. Чому це не отримує голосу?
princebillyGK

1
Для мене це найпростіша і найкраща відповідь.
Салех Енам Шохаг,

1
Якщо ви використовуєте PowerShell, використовуйте git branch -D $(git branch).Trim().
NatoBoram

13

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 '^*'), якщо ви хочете видалити ті гілки, які об’єдналися.
Пратік Сінгхал

@PratikSinghal: що видаляє всі інші гілки, а не лише гілки, які Git вважає "об'єднаними". Це рідко буває хорошою ідеєю. Я вже вказав на ці два пункти у своїй відповіді.
Торек

12

Щоб видалити всі об’єднані гілки (крім поточної -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"

взято звідси .


1
Це лише видаляє об’єднані гілки.
Пратік Сінгхал

10

Видалити всі гілки, крім певної гілки :

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

Видаліть усі локальні гілки, окрім розробки та освоєння

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


4

Видалити всі об’єднані гілки локально:

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

3

Одного разу я створив цю конструкцію для мого середовища 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

3

Щоб видалити всі гілки, крім поточної, за один крок:

git branch | grep -v $(git rev-parse --abbrev-ref HEAD) | xargs git branch -D


2

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

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

? = Де-Об'єкт

% = Foreach-Об'єкт


1

Тож я бачу тут безліч твердо закодованих назв гілок ... І я думаю, що моя відповідь тут є більш точною до "поточної гілки" частини запитання, зберігаючи її в одному рядку та читабельною для новачків, таких як я. Просто щоб розмістити кредит там, де це потрібно, відповідь досить очевидно також базується на відповіді @ pankijs.

git branch | grep -v $(git branch --show-current) | xargs git branch -d

і у мене це псевдонім на одному рядку в моїх .bash_aliases також у debian.

alias gitbclean='git branch | grep -v $(git branch --show-current) | xargs git branch -d'

(Хоча я думаю, що деякі функції bash повинні бути активовані, щоб допоміжна команда працювала в деяких командних рядках)


1

Я використовую це, тому що стаю більш вибірковим у тому, що не хочу видаляти. Ця команда нижче видаляє кожну гілку, окрім майстра, розробки та поточної гілки.

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

0

ІМХО, найбезпечнішим способом видалення місцевих гілок є:

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

Крім того, більше інформації, пов’язаної з цією темою, ви можете знайти Видалити всі локальні гітки git


для друку goneмаркера, який ви повинні використати -vv(детально двічі), в той час як вам -aне допоможе (він також містить перелік віддалених гілок)
pqnet
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.