delete create git git-branch

git - create - ¿Puedo eliminar todas las sucursales locales excepto la actual?



git pull (11)

Quiero eliminar todas las ramas que figuran en la salida de ...

$ git branch

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


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

Para ser agregado en ~/.gitconfig

Y, como señaló @torek:

Tenga en cuenta que -d minúsculas no eliminará una rama "no totalmente fusionada" (consulte la documentación). El uso de -D eliminará dichas ramas , incluso si esto hace que los compromisos se "pierdan"; use esto con mucho cuidado , ya que esto también elimina los reflogs de rama, de modo que las cosas habituales de "recuperarse de una eliminación accidental" tampoco funcionan.

Básicamente, nunca use la versión -force si no está 300% seguro de que no perderá nada importante. Porque se pierde para siempre .


Eliminar todas las ramas excepto una rama específica :

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

Eliminar todas las sucursales locales excepto desarrollar y dominar

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


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

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

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


Para Windows, en Powershell use:

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


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

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

También hice tal 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 here .


Suponiendo que git branch muestra la rama actual con el prefijo * ; Usando Powershell, el siguiente delineador eliminará todas las ramas que no comienzan con * .

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

? = Dónde-Objeto

% = Foreach-Object


Una vez creé esta construcción para mi entorno de 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


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

git checkout master

segundo ( asegúrate de que estás en master )

git branch -D $(git branch)


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

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

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

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

Más convenientemente, puede usar git branch , que imprime los nombres de sus sucursales locales precedidos por dos espacios o (para la rama actual) por un asterisco * . Entonces, ejecute esto 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 -d minúsculas no eliminará una rama "no totalmente fusionada" (consulte la documentación). El uso de -D eliminará dichas ramas, incluso si esto hace que los compromisos se "pierdan"; use esto con mucho cuidado, ya que esto también elimina los reflogs de rama, de modo que las cosas habituales de "recuperarse de una eliminación accidental" tampoco funcionan.


Eliminar todas las sucursales fusionadas localmente:

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

Eliminar todas las ramas excepto una rama específica :

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

Eliminar todas las sucursales locales excepto desarrollar y dominar

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


$ 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)