Tengo muchas ramas Git. ¿Cómo elimino ramas que ya se han fusionado? ¿Hay alguna manera fácil de eliminarlos todos en lugar de eliminarlos uno por uno?
git
github
version-control
branch
feature-branch
Nyambaa
fuente
fuente
git branch -D
elimina cualquier rama, ya sea que se haya fusionado o no.master
cada rama. Sin embargo, su cliente local seguirá enumerando las ramas antiguas si ejecutagit branch -a
; usegit fetch --prune
para eliminarlos (según esta respuesta ).git delete-merged --doit origin
ogit delete-merged --doit --local
rm -fr work && git clone http://example.com/work.git
Con los años se ha convertido en la forma más fácil de salir de un aprieto con git.Respuestas:
ACTUALIZAR:
Puede agregar otras ramas para excluirlas como master y dev si su flujo de trabajo las tiene como un posible antepasado. Por lo general, me ramifico de una etiqueta "sprint-start" y master, dev y qa no son ancestros.
Primero, enumere todas las ramas que se fusionaron en remoto.
Es posible que vea algunas ramas que no desea eliminar. Podemos agregar algunos argumentos para omitir ramas importantes que no queremos eliminar como master o desarrollo. El siguiente comando omitirá la rama maestra y todo lo que tenga dev.
Si desea omitir, puede agregarlo al comando egrep de la siguiente manera. La rama
skip_branch_name
no se eliminará.Para eliminar todas las sucursales locales que ya están fusionadas en la sucursal actualmente desprotegida:
Puede ver que master y dev están excluidos en caso de que sean ancestros.
Puede eliminar una sucursal local fusionada con:
Si no está fusionado, use:
Para eliminarlo del uso remoto:
Una vez que elimine la rama del control remoto, puede podar para deshacerse de las ramas de seguimiento remoto con:
o pode ramas de seguimiento remoto individuales, como sugiere la otra respuesta, con:
Espero que esto ayude.
fuente
git branch --merged | %{$_.trim()} | ?{$_ -notmatch 'develop' -and $_ -notmatch 'master'} | %{git branch -d $_}
fatal: branch name required
si no tiene ramas que deberían eliminarse. Para evitar eso, puede pasar-r
paraxargs
que no se ejecutegit branch -d
si el stdin está vacío. (Esta es una extensión GNU xargs, de acuerdo con la página del manual).Para eliminar todas las ramas en el control remoto que ya están fusionadas:
En versiones más recientes de Git
ACTUALIZACIÓN (por @oliver; ya que no cabe en el comentario, pero ya hay suficientes respuestas) : si está en la rama ABC, entonces ABC aparecerá en los resultados de
git branch -r --merged
porque la rama no está especificada, por lo que la rama se predetermina a la rama actual, y una rama siempre califica como fusionado consigo mismo (¡porque no hay diferencias entre una rama y sí mismo!).Entonces, especifique la rama:
O primer checkout master:
fuente
dev
así que tuve que cambiar eso| grep origin
despuésgrep -v master
para evitar empujar ramas de otros controles remotos al origen. Recomiendo encarecidamente probar la salida de antemano, usandogit branch -r --merged | grep -v master | grep origin | sed 's/origin\//:/' | xargs -n 1 echo
develop
rama también.git branch -r --merged | grep -v master | grep -v develop | sed 's/origin\///' | xargs -n 1 git push --delete origin
. Ahora esto resultó ser mi alias.-r
argumento, que no he visto mencionado en ningún otro lado. Se da por sentado que solo vale la pena realizar algunas tareas de limpieza en las sucursales locales. Pero los controles remotos también están llenos de basura.myFeatureBranch
ella se borraráorigin/myFeatureBranch
. Probablemente es mejorgit checkout master
primero.Solo extendiendo un poco la respuesta de Adam:
Agregue esto a su configuración de Git ejecutando
git config -e --global
Y luego puede eliminar todas las ramas locales fusionadas haciendo un simple
git cleanup
.fuente
git branch --merged master
ya que desea ver lo que se ha fusionado en la rama maestra, no actualmente desprotegida?develop
odev
como en este caso, el comando fallará confatal: malformed object name
que es mejor tener un dominio genérico y tiene la responsabilidad de ejecutarlo-r
axargs
evitará errores innecesarios (branch name required
) al ejecutar este alias varias veces o cuando no quede ninguna rama para eliminar. Mi alias se ve así:cleanup = "!git branch --merged | grep -v -P '^\\*|master|develop' | xargs -n1 -r git branch -d"
Esto también funciona para eliminar todas las ramas fusionadas excepto la maestra.
fuente
master
contenga. Intentagrep -v ^master$
por el medio.| grep -v '^\*'
de evitar eliminar la rama actual si no estás en mastergrep -v '^ master$'
. Si lo escribe usted mismo y se pierde uno, lo eliminarámaster
si no está en él.git branch
que enumerará cada nombre de rama en una nueva línea con dos espacios a la izquierda si no es la rama actualmente desprotegida. Básicamente, ha garantizado que cualquiera que ejecute este comando eliminará su rama maestra a menos que sea la rama actualmente desprotegida.Deberá excluir las ramas
master
&develop
de esos comandos.Git local claro:
Git remoto claro:
Sincronizar registro local de sucursales remotas:
fuente
git config --global --add fetch.prune true
para podar automáticamente al buscar o tirar.git branch -r --merged | grep -v '\*\|master\|develop' | grep '^\s*origin/' | sed 's/origin\///' | tr "\n" " " | xargs git push --delete origin
Para aquellos de ustedes que están en Windows y prefieren los scripts de PowerShell, aquí hay uno que elimina las ramas locales fusionadas:
fuente
git branch --merged | ?{-not ($_ -like "*master")} | %{git branch -d $_.trim()}
for /f "usebackq" %B in (``git branch --merged^|findstr /v /c:"* " /c:"master"``) do @git branch -d %B
(suspiro, reemplace las comillas dobles por simples, no estoy seguro de cómo formatear un literal que contenga comillas inversas)He usado la respuesta de Adam por años. Dicho esto, hay algunos casos en los que no se comportó como esperaba:
1 y 2 fueron fáciles de abordar, con solo un cambio en la expresión regular. 3 depende del contexto de lo que desee (es decir, solo elimine las ramas que no se han fusionado en el maestro o en su rama actual). 4 tiene el potencial de ser desastroso (aunque recuperable con
git reflog
), si accidentalmente ejecutó esto en estado HEAD separado.Finalmente, quería que todo esto estuviera en una línea que no requiriera un script separado (Bash | Ruby | Python).
TL; DR
Cree un "barrido" de alias de git que acepte una marca opcional
-f
:e invocarlo con:
o:
La respuesta larga y detallada
Fue más fácil para mí crear un ejemplo de repositorio de git con algunas ramas y se compromete a probar el comportamiento correcto:
Crea un nuevo repositorio de git con un solo commit
Crea algunas ramas nuevas
Comportamiento deseado: seleccione todas las ramas fusionadas excepto: maestro, desarrollo o actual
La expresión regular original pierde las ramas "maestra" y "no maestra":
Con la expresión regular actualizada (que ahora excluye "desarrollar" en lugar de "dev"):
Cambie a la sucursal foo, realice una nueva confirmación, luego revise una nueva rama, foobar, basada en foo:
Mi rama actual es foobar, y si vuelvo a ejecutar el comando anterior para enumerar las ramas que quiero eliminar, la rama "foo" se incluye aunque no se haya fusionado en master:
Sin embargo, si ejecuto el mismo comando en master, la rama "foo" no está incluida:
Y esto se debe simplemente a que el valor
git branch --merged
predeterminado es HEAD de la rama actual si no se especifica lo contrario. Al menos para mi flujo de trabajo, no quiero eliminar sucursales locales a menos que se hayan fusionado con master, por lo que prefiero la siguiente variante:Estado HEAD separado
Confiar en el comportamiento predeterminado de
git branch --merged
tiene consecuencias aún más significativas en el estado HEAD separado:Esto habría eliminado la rama en la que estaba, "foobar" junto con "foo", lo que casi seguro no es el resultado deseado. Con nuestro comando revisado, sin embargo:
Una línea, incluida la eliminación real
Todo envuelto en un "barrido" de alias git:
El alias acepta una
-f
bandera opcional . El comportamiento predeterminado es eliminar solo las ramas que se han fusionado en el maestro, pero el-f
indicador eliminará las ramas que se han fusionado en la rama actual.fuente
git config
atómico?!f(){ git branch ...
. Es una declaración de función, ¿verdad? ¿Por qué no comenzar directamente congit branch ...
?git checkout master && git branch -d `git branch --merged` && git checkout -
Excepto que eliminaríadevelop
, pero podría ser un enfoque más simple.Git Sweep hace un gran trabajo en esto.
fuente
Usando Git versión 2.5.0:
fuente
master
rama por cierto!master
.git branch -d $(git branch --merged | grep -v master)
Puede agregar el commit a la opción - fusionada. De esta manera, puede asegurarse de eliminar solo las ramas que están fusionadas, es decir, el origen / maestro
El siguiente comando eliminará las ramas fusionadas de su origen.
Puede probar qué ramas se eliminarán reemplazando el origen de git push: eliminar con eco
fuente
Utilizo el siguiente script de Ruby para eliminar mis ramas locales y remotas ya fusionadas. Si lo estoy haciendo para un repositorio con múltiples controles remotos y solo quiero eliminar de uno, solo agrego una instrucción select a la lista de controles remotos para obtener solo los controles remotos que quiero.
fuente
\/
al comienzo de la declaración de rechazo para laremote_branches
línea. ¿Es eso un error tipográfico o sirve para un propósito?b.split(/\//)
ahora veo la líneaCómo eliminar ramas fusionadas en la consola de PowerShell
Si desea excluir el nombre maestro o cualquier otro nombre de rama, puede canalizar con PowerShell Select-String de esta manera y pasar el resultado a
git branch -d
:fuente
* master
:)La respuesta de kuboon no borró las ramas que tienen la palabra master en el nombre de la rama. Lo siguiente mejora en su respuesta:
Por supuesto, no elimina la rama "maestra" en sí :)
fuente
No hay ningún comando en Git que lo haga automáticamente. Pero puede escribir un script que use comandos Git para darle lo que necesita. Esto podría hacerse de muchas maneras dependiendo del modelo de ramificación que esté utilizando.
Si necesita saber si una rama se ha fusionado con el maestro, el siguiente comando no generará ningún resultado si myTopicBranch se ha fusionado (es decir, puede eliminarlo)
Puede usar el comando de rama Git y analizar todas las ramas en Bash y hacer un
for
bucle sobre todas las ramas. En este bucle, verifica con el comando anterior si puede eliminar la rama o no.fuente
git branch --merged | grep -Ev '^(. master|\*)' | xargs -n 1 git branch -d
eliminará todas las sucursales locales, excepto la sucursal desprotegida actual y / omaster
.Aquí hay un artículo útil para aquellos que buscan comprender estos comandos: Git Clean: Eliminar ramas ya fusionadas, por Steven Harman .
fuente
Nota : No estoy satisfecho con las respuestas anteriores (no funciona en todos los sistemas, no funciona en remoto, no especifica la rama combinada, no filtra exactamente). Entonces, agrego mi propia respuesta.
Hay dos casos principales:
Local
Desea eliminar sucursales locales que ya están fusionadas con otra sucursal local . Durante la eliminación, desea mantener algunas ramas importantes, como master, desarrollo, etc.
Notas :
git branch output --format
".." es eliminar espacios en blanco y permitir una coincidencia grep exactagrep -E
se usa en lugar deegrep
, por lo que funciona también en sistemas sin egrep (es decir, git para windows).grep -E -v '^master$|^feature/develop$'
es especificar sucursales locales que no quiero eliminarxargs -n 1 git branch -d
: realiza la eliminación de sucursales locales (no funcionará para las remotas)Remoto
Desea eliminar ramas remotas que ya están fusionadas con otra rama remota . Durante la eliminación, desea mantener algunas ramas importantes, como HEAD, master, releases, etc.
Notas :
-r
opción y proporcionamos el nombre completo de la sucursal :origin/master
grep -E -v '^*HEAD$|^*/master$|^*release'
es hacer coincidir las ramas remotas que no queremos eliminar.cut -d/ -f2-
: elimina el prefijo 'origin /' innecesario que, de lo contrario, elgit branch
comando imprime .xargs -n 1 git push --delete origin
: realiza la eliminación de ramas remotas.fuente
Si está en Windows, puede usar Windows Powershell o Powershell 7 con Out-GridView para tener una buena lista de ramas y seleccionar con el mouse cuál desea eliminar:
después de hacer clic en Aceptar, Powershell pasará los nombres de estas ramas al
git branch -d
comando y los eliminaráfuente
Puedes usar la
git-del-br
herramienta .Puedes instalarlo
pip
usandoPD: Soy el autor de la herramienta. Cualquier sugerencia / comentario son bienvenidos.
fuente
Si desea eliminar todas las sucursales locales que ya están fusionadas en la sucursal en la que se encuentra actualmente, se me ocurrió un comando seguro para hacerlo, basado en respuestas anteriores:
Este comando no afectará su rama actual o su rama maestra. También le dirá qué está haciendo antes de hacerlo, utilizando el indicador -t de xargs.
fuente
Versión alias de la respuesta actualizada de Adam :
Además, consulte esta respuesta para obtener consejos útiles sobre cómo escapar de los alias complejos.
fuente
Utilizo un esquema de nomenclatura git-flow esque, por lo que esto funciona de manera muy segura para mí:
Básicamente busca confirmaciones fusionadas que comienzan con una cadena
fix/
ofeature/
.fuente
Pruebe el siguiente comando:
Al usar
git rev-parse
obtendrá el nombre actual de la sucursal para excluirlo. Si recibió el error, eso significa que no hay sucursales locales para eliminar.Para hacer lo mismo con las ramas remotas (cambie
origin
con su nombre remoto), intente:En caso de tener múltiples controles remotos, agregue
grep origin |
antescut
para filtrar solo elorigin
.Si el comando anterior falla, intente eliminar primero las ramas combinadas de seguimiento remoto:
Luego
git fetch
el control remoto nuevamente y use elgit push -vd
comando anterior nuevamente.Si lo usa con frecuencia, considere agregar como alias en su
~/.gitconfig
archivo.En caso de que haya eliminado algunas ramas por error, use
git reflog
para encontrar los commits perdidos.fuente
¡Basado en algunas de estas respuestas, hice mi propio script Bash para hacerlo también !
Utiliza
git branch --merged
ygit branch -d
para eliminar las ramas que se han fusionado y le solicita cada una de las ramas antes de eliminar.fuente
La consulta a continuación funciona para mí
y esto filtrará cualquier rama dada en la tubería grep.
Funciona bien sobre http clone, pero no tan bien para la conexión ssh.
fuente
A partir de 2018.07
Agregue esto a la
[alias]
sección de su~/.gitconfig
:Ahora puede llamar
git sweep
para realizar la limpieza necesaria.fuente
En Windows con git bash instalado egrep -v no funcionará
donde
grep -E -v
es equivalente deegrep -v
Utilizar
-d
para eliminar ya fusionado ramas o-D
quitar sin combinar ramasfuente
He estado usando el siguiente método para eliminar ramas locales y remotas fusionadas en un cmd.
Tengo lo siguiente en mi
bashrc
archivo:fuente original
Esto no elimina la rama maestra, pero elimina las ramas locales y remotas fusionadas . Una vez que tenga esto en su archivo rc, simplemente ejecute
rmb
, se le mostrará una lista de ramas fusionadas que se limpiarán y se le pedirá confirmación sobre la acción. También puede modificar el código para no solicitar confirmación, pero probablemente sea bueno mantenerlo.fuente
Escriba un script en el que Git compruebe todas las ramas que se han fusionado para dominar.
Entonces hazlo
git checkout master
.Finalmente, elimine las ramas fusionadas.
fuente
La solución aceptada es bastante buena, pero tiene el problema de que también elimina las sucursales locales que aún no se fusionaron en un control remoto.
Si miras el resultado, verás algo como
Ramas
bla
yissue_248
son ramas locales que se eliminarían en silencio.Pero también puede ver la palabra
[gone]
, que indica ramas que habían sido empujadas a un control remoto (que ahora está desaparecido) y, por lo tanto, denotan que las ramas se pueden eliminar.Por lo tanto, la respuesta original se puede cambiar a (dividir en varias líneas para una longitud de línea más corta)
para proteger las ramas aún no fusionadas. Tampoco es necesario el grepping para master para protegerlo, ya que tiene un control remoto en origen y no aparece como desaparecido.
fuente
Para mí
git branch --merged
no muestra ramas que se fusionaron a través de GitHub PR. No estoy seguro de los motivos, pero uso la siguiente línea para eliminar todas las ramas locales que no tienen una rama de seguimiento remoto :Explicación:
git branch --format "%(refname:short)"
da una lista de sucursales localesgit branch -r | grep -v HEAD | cut -d/ -f2-
da una lista de ramas remotas, filtrandoHEAD
diff <(...) <(...)
da una diferencia de salida de dos comandos entre paréntesisgrep '<'
filtra las ramas que existen en la primera lista, pero no en la segundacut -c 3-
da línea a partir del 3er carácter, eliminando así el prefijo<
xargs git branch -D
se ejecutagit branch -D
contra cada nombre de ramaAlternativamente, puede evitar
grep -v '<'
así:fuente