¿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?




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 .


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)


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)

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.


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í .


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

6

Para Windows, en Powershell use:

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

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

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


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

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


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)


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

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


para imprimir el gonemarcador que debe usar -vv(detallado dos veces), mientras -aque no lo ayudará (también enumera las ramas remotas)
pqnet
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.