Puis-je supprimer toutes les succursales locales sauf celle actuelle?

95

Je souhaite supprimer toutes les branches répertoriées dans la sortie de ...

$ git branch

... mais en gardant la branche actuelle, en une seule étape . Est-ce possible? Si c'est le cas, comment?

sensorario
la source

Réponses:

66

Sur la base de la réponse @pankijs, j'ai créé deux alias 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"

À ajouter dans ~/.gitconfig


Et, comme @torek l'a souligné:

Notez que les minuscules -dne suppriment pas une branche "non entièrement fusionnée" (voir la documentation). L'utilisation -D supprimera ces branches , même si cela entraîne la «perte» des commits; utilisez ceci avec beaucoup de précaution , car cela supprime également les reflogs de branche, de sorte que le truc habituel de "récupération après suppression accidentelle" ne fonctionne pas non plus.

En gros, n'utilisez jamais la -forceversion si vous n'êtes pas sûr à 300% de ne rien perdre d'important. Parce que c'est perdu pour toujours .

Vadorequest
la source
2
Les commits dans une branche supprimée doivent encore être dans le reflog pendant un certain temps.
CaptRespect
En effet, les commits resteraient dans reflog. Mais pas la branche elle-même. Je n'essaierais pas, mais je suppose que vous trouverez peut-être vos commits, mais revenez à l'état de la succursale? J'en doute. Cherry-pick peut être utilisé pour récupérer les commits dans une branche supprimée, mais vous ne pourrez pas restaurer la branche elle-même.
Vadorequest
1
@Vadorequest vous pouvez recréer la branche pointant un certain commit en faisantgit branch branchname commitid
pqnet
@pqnet Je ne savais pas que cela recréerait toute l'histoire de cette branche, merci, bon à savoir!
Vadorequest
1
@Vadorequest puisque les objets de validation sont immuables (et indexés comme des hachages), chaque modification nécessite la création d'un nouvel objet (avec un hachage différent)
pqnet
180
$ git branch | grep -v "master" | xargs git branch -D 

supprimera toutes les branches sauf master (remplacez master par la branche que vous souhaitez conserver, mais ensuite cela supprimera master)

pankijs
la source
30
Si vous souhaitez conserver la branche actuelle , utilisez grep -v ^*.
Schwern
2
De nombreuses sources me montrent ce script, mais quand je l'exécute, il me dit toujours que les branches ne sont pas trouvées :(
tucq88
1
ce n'est pas exact, cela ne supprimera pas une branche appelée master-copy, par exemple
mvallebr
2
Modifiez l'expression régulière si nécessaire, par exemplegrep -v "^ *master$"
Brad Koch
8
Si vous souhaitez conserver deux branches, utilisez grep -v "master\|my-other-branch".
Derek Soike
18

d'abord (passez à la branche que vous souhaitez conserver> ex : master ):

git checkout master

deuxième ( assurez- vous que vous êtes sur master )

git branch -D $(git branch)
KhogaEslam
la source
3
très rapide et facile. Pourquoi ce n'est pas voté?
princebillyGK
1
C'est la réponse la plus simple et la meilleure pour moi.
Saleh Enam Shohag le
1
Si vous utilisez PowerShell, utilisez git branch -D $(git branch).Trim().
NatoBoram
13

git branch -d(ou -D) autorise plusieurs noms de branche, mais il est un peu délicat de fournir automatiquement "toutes les branches locales à l'exception de celle sur laquelle je suis maintenant" sans écrire au moins un peu de code.

La "meilleure" méthode (formellement correcte) est d'utiliser git for-each-refpour obtenir les noms de branche:

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

mais il est encore plus difficile de savoir sur quelle branche vous vous trouvez ( git symbolic-ref HEADest la méthode "formellement correcte" pour cela, si vous voulez écrire un script sophistiqué).

Plus commodément, vous pouvez utiliser git branch, qui imprime les noms de vos branches locales précédés de deux espaces ou (pour la branche actuelle) d'un astérisque *. Alors, exécutez ceci à travers quelque chose pour supprimer la *version et il vous reste des noms de branche séparés par des espaces, que vous pouvez ensuite passer à git branch -d:

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

ou:

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

Notez que les minuscules -dne suppriment pas une branche "non entièrement fusionnée" (voir la documentation). L'utilisation -Dsupprimera ces branches, même si cela entraîne la «perte» des commits; utilisez ceci avec beaucoup de précaution, car cela supprime également les reflogs de branche, de sorte que le truc habituel de "récupération après suppression accidentelle" ne fonctionne pas non plus.

Torek
la source
Cela devrait être le git branch -D $(git branch | grep -v '^*')cas si vous souhaitez supprimer les branches qui ont fusionné.
Pratik Singhal
@PratikSinghal: cela supprime toutes les autres branches, pas seulement les branches que Git considère comme "fusionnées". C'est rarement une bonne idée. J'ai déjà souligné ces deux éléments dans ma réponse.
torek
12

Pour supprimer toutes les branches fusionnées (sauf la version actuelle -v ‘*’):

git branch --merged | grep -v '*' | xargs git branch -D

aussi j'ai fait une telle commande pour le nettoyage complet du repo:

alias git-clean="git branch  | grep -v '*' | grep -v 'master' | xargs git branch -D  && git reset --hard && git clean -d -x -f"

pris d' ici .

Stépan Souvorov
la source
1
Cela supprime uniquement les branches fusionnées.
Pratik Singhal
10

Supprimez toutes les branches sauf une branche spécifique :

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

Supprimez toutes les branches locales à l'exception de develop et master

git branch | grep -v "develop" | grep -v "master" | xargs git branch -D
Asad Manzoor
la source
6

Pour Windows, dans Powershell, utilisez:

git branch | %{ $_.Trim() } | ?{ $_ -ne 'master' } | %{ git branch -D $_ }
Robert Corvus
la source
4

Supprimer toutes les branches fusionnées localement:

git branch -D `git branch --merged | grep -v \* | xargs`

Supprimez toutes les branches sauf une branche spécifique :

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

Supprimez toutes les branches locales à l'exception de develop et master

git branch | grep -v "develop" | grep -v "master" | xargs git branch -D
Asad Manzoor
la source
3

J'ai déjà créé cette construction pour mon environnement Windows. Cela aidera peut-être quelqu'un d'autre. Pendant l'exécution, la branche maître et actuelle ne sont pas supprimées . Toutes les autres branches fusionnées seront supprimées malgré tout.

@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
George Maharis
la source
3

Pour supprimer toutes les branches à l'exception de la branche actuelle en une seule étape:

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

Dan Dye
la source
2

En supposant que git branchmontre la branche actuelle préfixée par *; En utilisant Powershell, la ligne suivante supprimera toutes les branches qui ne commencent pas par *.

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

? = Où-Objet

% = Foreach-Object

Aaron
la source
1

Je vois donc beaucoup de noms de branches codés en dur ici ... Et je pense que ma réponse ici est plus précise à la partie "branche actuelle" de la question tout en la gardant sur une seule ligne et lisible pour les débutants comme moi. Juste pour donner du crédit là où c'est dû, la réponse est plutôt évidemment basée sur la réponse de @ pankijs.

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

et je l'ai aliasée sur une ligne dans mon .bash_aliases dans debian aussi.

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

(Bien que je pense que certaines fonctionnalités de bash doivent être activées pour que la sous-commande s'exécute sur certaines lignes de commande)

NullifiedWarp
la source
1

J'utilise ceci parce que j'arrive à être plus sélectif dans ce que je ne veux pas supprimer. Cette commande ci-dessous supprime toutes les branches sauf master, develop et la branche actuelle.

BRANCHES=$(git branch | egrep -v "(master|develop|\*)" | xargs git branch -D)
echo $BRANCHES

Alors je mets ça dans mon ~/.zshrc

delete_branches() {
  BRANCHES=$(git branch | egrep -v "(master|develop|\*)" | xargs git branch -D)
  echo $BRANCHES
}

alias cleanup_branches=delete_branches
Justin Rice
la source
0

À mon humble avis, le moyen le plus sûr de supprimer les succursales locales est:

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

En outre, plus d'informations liées à ce sujet, vous pouvez trouver Supprimer toutes les branches git locales

elbik
la source
pour imprimer le gonemarqueur que vous devez utiliser -vv(verbeux deux fois), mais -ane vous aidera pas (il répertorie également les branches distantes)
pqnet