tutorial repositorio origin example español eliminar ejemplo comandos git github branch pull repository

repositorio - git push origin master



Eliminar sucursales locales de Git después de eliminarlas en el repositorio remoto (11)

Quiero tener mis repositorios locales y remotos siempre sincronizados en términos de sucursales.

Después de una revisión de Solicitud de extracción en GitHub, me fusiono y elimino mi rama allí (remota). ¿Cómo podría obtener esta información en mi repositorio local y hacer que Git también elimine mi versión local de la sucursal?


La manera rápida

git branch --merged | grep -v "/*" | xargs -n 1 git branch -d

Nota: si no master , esto tiene el potencial de eliminar la rama. Sigue leyendo para la "mejor manera".

Asegúrate de mantener el maestro

Puede asegurarse de que el master , o cualquier otra rama, no se elimine mediante grep ing para obtener más información. En ese caso irías:

git branch --merged | grep -v "/*" | grep -v "YOUR_BRANCH_TO_KEEP" | xargs -n 1 git branch -d

Entonces, si quisiéramos mantener el master , develop y staging por ejemplo, iríamos:

git branch --merged | grep -v "/*" | grep -Ev "(/*|master|develop|staging)" | xargs -n 1 git branch -d

Hacer esto un alias

Dado que es un poco largo, es posible que desee agregar un alias a su .zshrc o .bashrc . El mío se llama gbpurge (para git branches purge ):

alias gbpurge=''git branch --merged | grep -Ev "(/*|master|develop|staging)" | xargs -n 1 git branch -d''

A continuación, vuelva a cargar su .bashrc o .zshrc :

. ~/.bashrc

o

. ~/.zshrc


En el caso de que haya empujado y fusionado su rama para dominar, haga lo siguiente en git bash:

git branch -d branch_name_to_delete

Si se encuentra actualmente en esa rama, lo empujará de nuevo a la maestría. En este punto haz un tirón con

git pull


Escribí este delineador para enumerar todas las sucursales locales que no tienen la rama remota correspondiente:

diff -u <(git branch|sed ''s/..//'') <(git branch -r|sed ''s/..origin////'')|tail -n +4|sed -n "s/^-//p" -

Una vez hecho esto, eliminar estas sucursales locales es fácil con xargs :

diff -u <(git branch|sed ''s/..//'') <(git branch -r|sed ''s/..origin////'')|tail -n +4|sed -n "s/^-//p" -|xargs -r git branch -d


Esto debería funcionar para evitar eliminar las ramas maestra y de desarrollo con la solución aceptada:

git branch --merged | egrep -v "^/*|master|development" | xargs -n 1 git branch -d


La respuesta elegida tiene el potencial de eliminar maestro. Conserve el siguiente ejemplo práctico.

Tenía dos ramas de características, hemen_README y hemen_BASEBOX, que se fusionaron para desarrollar, y luego se fusionaron en master. Las ramas de características hemen_README y hemen_BASEBOX se eliminaron de forma remota, pero aún se mostraban localmente. También no estoy en maestro localmente, sino en desarrollo.

En ese caso

hemen@hemen-MXC061:~/data/projects/vagrant-webdev$ git branch -v -a * develop 671ad6c Merged in hemen_README (pull request #1) hemen_BASEBOX a535c0f added global exec paths to puppet manifest hemen_README ba87489 Updated Readme with considerable details master 8980894 [behind 7] Initial Vagrantfile, works for vagrant up. Also initial .gitignore remotes/origin/develop 671ad6c Merged in hemen_README (pull request #1) remotes/origin/hemen_BASEBOX a535c0f added global exec paths to puppet manifest remotes/origin/hemen_README ba87489 Updated Readme with considerable details remotes/origin/master 2f093ce Merged in develop (pull request #3)

Entonces, si ejecuto el comando parcial anterior

hemen@hemen-MXC061:~/data/projects/vagrant-webdev$ git branch --merged | grep -v "/*" hemen_BASEBOX hemen_README master

Tenga en cuenta que también muestra el maestro, que eventualmente será eliminado.

En cualquier caso, pude hacerlo. Estoy compartiendo mi registro de sesión con usted sobre cómo lo logré.

hemen@hemen-MXC061:~/data/projects/vagrant-webdev$ git remote prune origin --dry-run Pruning origin URL: [email protected]:hemenkapadiapublic/vagrant-webdev.git * [would prune] origin/hemen_BASEBOX * [would prune] origin/hemen_README hemen@hemen-MXC061:~/data/projects/vagrant-webdev$ git remote prune origin Pruning origin URL: [email protected]:hemenkapadiapublic/vagrant-webdev.git * [pruned] origin/hemen_BASEBOX * [pruned] origin/hemen_README

Acabo de comprobar que se podarán y luego lo podaré. mirando comando de rama a continuación hemos cuidado de controles remotos

hemen@hemen-MXC061:~/data/projects/vagrant-webdev$ git branch -v -a * develop 671ad6c Merged in hemen_README (pull request #1) hemen_BASEBOX a535c0f added global exec paths to puppet manifest hemen_README ba87489 Updated Readme with considerable details master 8980894 [behind 7] Initial Vagrantfile, works for vagrant up. Also initial .gitignore remotes/origin/develop 671ad6c Merged in hemen_README (pull request #1) remotes/origin/master 2f093ce Merged in develop (pull request #3)

Ahora adelante y elimine las sucursales locales

hemen@hemen-MXC061:~/data/projects/vagrant-webdev$ git branch -d hemen_BASEBOX Deleted branch hemen_BASEBOX (was a535c0f). hemen@hemen-MXC061:~/data/projects/vagrant-webdev$ git branch -d hemen_README Deleted branch hemen_README (was ba87489).

Bien ahora las ramas son como se desea.

hemen@hemen-MXC061:~/data/projects/vagrant-webdev$ git branch -v -a * develop 671ad6c Merged in hemen_README (pull request #1) master 8980894 [behind 7] Initial Vagrantfile, works for vagrant up. Also initial .gitignore remotes/origin/develop 671ad6c Merged in hemen_README (pull request #1) remotes/origin/master 2f093ce Merged in develop (pull request #3)


Nada de esto estaba funcionando para mí. Puedes ver mi otra respuesta aquí: https://.com/a/34969726/550454

Pero esencialmente, ahora tengo esto en mi ~/.gitconfig :

[alias] prune-branches = !git remote prune origin && git branch -vv | grep '': gone]'' | awk ''{print $1}'' | xargs -r git branch -d


Para las personas que usan powershell, esto es el equivalente a la respuesta above :

git branch -vv | Select-String -Pattern '': gone]'' | ForEach-Object{($_ -split "/s+")[1]} | %{ git branch -D $_ }

  1. Filtra todas las ramas marcadas como desaparecidas
  2. Llamada git branch -D en cada una de las ramas encontradas

Solo hago eso para eliminar las sucursales locales fusionadas:

git branch -d $(git branch --merged)

y en caso de que quiera eliminar los rastreos inexistentes también:

git pull --prune


Solución muy simple: elimine su repositorio local y clone el remoto nuevamente. Puede que no parezca muy elegante, pero es simple y comprenderás exactamente lo que estás haciendo sin leer páginas man :-).


Utilizo el mismo flujo con GitHub y no encontré las respuestas anteriores que me satisfagan, ya que git branch --merged enumera las ramas que se fusionaron, pero no todas se eliminaron de forma remota en mi caso. Entonces, esto funcionó para mí:

git fetch --all -p; git branch -vv | grep ": gone]" | awk ''{ print $1 }'' | xargs -n 1 git branch -d

dónde:

  • git fetch --all -p : actualiza el estado de las sucursales locales
  • git branch -vv : lista el estado de las sucursales locales
  • grep ": gone]" : filtros eliminados
  • awk ''{ print $1 }'' : extrae sus nombres
  • xargs -n 1 git branch -d : pasa el nombre al comando delete

Nota: si lo prefiere, puede usar -D en lugar de -d, lo que aplica la eliminación.

Por ejemplo:

someUsr@someHost:~/repo$ git branch -a basic-testing integration-for-tests * master origin playground-for-tests test-services remotes/origin/HEAD -> origin/master remotes/origin/basic-testing remotes/origin/master remotes/origin/test-services someUsr@someHost:~/repo$ git fetch --all -p; git branch -vv | grep ": gone]" | awk ''{ print $1 }'' | xargs -n 1 git branch -d Fetching origin Deleted branch integration-for-tests (was fbc609a). Deleted branch playground-for-tests (was 584b900). someUsr@someHost:~/repo$ git branch -a basic-testing * master origin test-services remotes/origin/HEAD -> origin/master remotes/origin/basic-testing remotes/origin/master remotes/origin/test-services

Referencia:

http://git-scm.com/book/en/v2/Git-Branching-Remote-Branches


tratar:

git pull --prune

que borra su rama local, si se borra su rama remota correspondiente.

Actualizado:

La declaración anterior no es tan correcta.

De hecho, ejecutar git pull --prune solo git pull --prune las ramas de seguimiento remoto como

remotes/origin/fff remotes/origin/dev remotes/origin/master

Luego, puede ejecutar git branch -r para verificar las ramas de seguimiento remoto que quedan en su máquina. Supongamos que las ramas de la izquierda son:

origin/dev origin/master

lo que significa que el origin/fff la sucursal origin/fff se elimina.

Entonces, después de ejecutar git pull --prune , simplemente ejecuta:

git branch --merged | grep -vFf <(git branch -r | cut -d''/'' -f2-)

puedes encontrar todas las sucursales locales que:

  1. ya no tiene ramas remotas correspodientes;
  2. se puede eliminar de forma segura.

luego, <the command above> | xargs git branch -d <the command above> | xargs git branch -d puede eliminarlos a todos.