¿Puedo eliminar todas las sucursales locales excepto la actual?

95

Quiero eliminar todas las ramas que se enumeran en la salida de ...

$ git branch

... pero manteniendo la rama actual, en un solo paso . ¿Es eso posible? ¿Si es así, cómo?

sensorario
fuente

Respuestas:

66

Basado en la respuesta de @pankijs, hice dos alias de 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"

Para ser añadido ~/.gitconfig


Y, como señaló @torek:

Tenga en cuenta que las minúsculas -dno eliminarán una rama "no fusionada completamente" (consulte la documentación). El uso -D eliminará dichas ramas , incluso si esto hace que las confirmaciones se "pierdan"; utilícelo con mucho cuidado , ya que también borra los reflogs de la rama, por lo que las cosas habituales de "recuperación de borrado accidental" tampoco funcionan.

Básicamente, nunca uses la -forceversión si no estás 300% seguro de que no perderás nada importante. Porque está perdido para siempre .

Vadorequest
fuente
2
los commits a una rama eliminada aún deberían estar en el reflog por un tiempo.
CaptRespect
De hecho, las confirmaciones permanecerían en reflog. Pero no la rama en sí. No lo probaría, pero supongo que puede encontrar sus confirmaciones, pero ¿volver al estado de la rama? Lo dudo Cherry-pick podría usarse para recuperar confirmaciones en una rama eliminada, pero no podrá restaurar la rama en sí.
Vadorequest
1
@Vadorequest puede volver a crear la rama que apunta a una determinada confirmación haciendogit branch branchname commitid
pqnet
@pqnet No sabía que iba a recrear todo el historial de esa rama, gracias, ¡es bueno saberlo!
Vadorequest
1
@Vadorequest dado que los objetos de confirmación son inmutables (e indexados como hashes), cada edición requiere la creación de un nuevo objeto (con un hash diferente)
pqnet
180
$ git branch | grep -v "master" | xargs git branch -D 

eliminará todas las ramas excepto la maestra (reemplace la maestra con la rama que desea conservar, pero luego eliminará la maestra)

pankijs
fuente
30
Si desea mantener el uso de rama actualgrep -v ^* .
Schwern
2
Muchas fuentes me muestran este script, pero cuando lo ejecuto siempre me dicen que las ramas no se encuentran :(
tucq88
1
esto no es exacto, no eliminará una rama llamada master-copy, por ejemplo
mvallebr
2
Modifique la expresión regular según sea necesario, por ejemplogrep -v "^ *master$"
Brad Koch
8
Si desea mantener dos ramas, utilice grep -v "master\|my-other-branch".
Derek Soike
18

primero (cambie a la rama que desea mantener> ex : master ):

git checkout master

segundo ( asegúrate de estar en maestro )

git branch -D $(git branch)
KhogaEslam
fuente
3
muy rápido y fácil. ¿Por qué esto no se vota a favor?
princebillyGK
1
Es la mejor y más simple respuesta para mí.
Saleh Enam Shohag
1
Si usa PowerShell, use git branch -D $(git branch).Trim().
NatoBoram
13

git branch -d (o -D ) permite varios nombres de sucursales, pero es un poco complicado proporcionar automáticamente "todas las sucursales locales, excepto la que tengo ahora" sin escribir al menos un poco de código.

El método "mejor" (formalmente correcto) es utilizar git for-each-refpara obtener los nombres de las ramas:

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

pero luego es aún más difícil averiguar en qué rama estás ( git symbolic-ref HEADes el método "formalmente correcto" para esto, si quieres escribir un script elegante).

Más convenientemente, puede usar git branch, que imprime los nombres de sus sucursales locales precedidos por dos espacios o (para la sucursal actual) por un asterisco *. Entonces, ejecute esto a través de algo para eliminar la *versión y quedará con nombres de rama separados por espacios, que luego puede pasar a git branch -d:

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

o:

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

Tenga en cuenta que las minúsculas -dno eliminarán una rama "no fusionada completamente" (consulte la documentación). El uso -Deliminará dichas ramas, incluso si esto hace que las confirmaciones se "pierdan"; utilícelo con mucho cuidado, ya que también borra los reflogs de la rama, por lo que las cosas habituales de "recuperación de borrado accidental" tampoco funcionan.

torek
fuente
Debería serlo git branch -D $(git branch | grep -v '^*'), si desea eliminar las ramas que se han fusionado.
Pratik Singhal
@PratikSinghal: eso elimina todas las demás ramas, no solo las ramas que Git considera "fusionadas". Rara vez es una buena idea. Ya señalé ambos elementos en mi respuesta.
torek
12

Para eliminar todas las ramas fusionadas (excepto la actual -v ‘*’):

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

también hice ese comando para la limpieza completa del repositorio:

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

tomado de aquí .

Stepan Suvorov
fuente
1
Esto solo elimina las ramas fusionadas.
Pratik Singhal
7

Elimina todas las ramas excepto una rama específica :

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

Eliminar todas las ramas locales excepto desarrollar y master

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

Para Windows, en Powershell use:

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

Una vez creé esta construcción para mi entorno Windows. Quizás ayude a alguien más. Durante la ejecución, el maestro y la rama actual no se eliminan . Todas las demás ramas fusionadas se eliminarán independientemente.

@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
fuente
3

Para eliminar todas las ramas excepto la rama actual en un solo paso:

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

Dan Dye
fuente
2

Elimine todas las ramas fusionadas localmente:

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

Elimina todas las ramas excepto una rama específica :

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

Eliminar todas las ramas locales excepto desarrollar y master

git branch | grep -v "develop" | grep -v "master" | xargs git branch -D
Asad Manzoor
fuente
2

Suponiendo que git branchmuestra la rama actual con el prefijo *; Al usar Powershell, el siguiente trazador de líneas eliminará todas las ramas que no comiencen con *.

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

? = Dónde-Objeto

% = Objeto Foreach

Aaron
fuente
1

Veo un montón de nombres de rama codificados aquí ... Y creo que mi respuesta aquí es más precisa para la parte de la "rama actual" de la pregunta mientras la mantengo en una sola línea y legible para los novatos como yo. Solo para colocar el crédito donde se debe, la respuesta obviamente también se basa en la respuesta de @ pankijs.

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

y también tengo un alias en una línea en mi .bash_aliases en Debian.

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

(Aunque creo que algunas funciones de bash deben habilitarse para que el subcomando se ejecute en algunas líneas de comando)

AnuladoWarp
fuente
1

Utilizo esto porque puedo ser más selectivo en lo que no quiero eliminar. Este comando a continuación elimina todas las ramas excepto master, desarrollar y la rama actual.

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

Así que puse esto en mi ~/.zshrc

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

alias cleanup_branches=delete_branches
Justin Rice
fuente
0

En mi humilde opinión, la forma más segura de eliminar sucursales locales es:

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

Además, para obtener más información relacionada con este tema, puede encontrar Eliminar todas las ramas de git locales

elbik
fuente
para imprimir el gonemarcador que debe usar -vv(detallado dos veces), mientras -aque no lo ayudará (también enumera las ramas remotas)
pqnet