A menudo tengo al menos 3 sucursales remotas: maestra, puesta en escena y producción. Tengo 3 sucursales locales que rastrean esas sucursales remotas.
Actualizar todas mis sucursales locales es tedioso:
git fetch --all
git rebase origin/master
git checkout staging
git rebase origin/staging
git checkout production
git rebase origin/production
Me encantaría poder hacer un "git pull-all", pero no he podido hacerlo funcionar. Parece hacer una "búsqueda --todos", luego actualiza (adelanta o combina) la rama de trabajo actual, pero no las otras ramas locales.
Todavía estoy atascado cambiando manualmente a cada rama local y actualizando.

Respuestas:
El comportamiento que describe
pull --alles exactamente el esperado, aunque no necesariamente útil. La opción se pasa a git fetch, que luego obtiene todas las referencias de todos los controles remotos, en lugar de solo la necesaria;pullluego fusiona (o en su caso, vuelve a crear) la rama individual apropiada.Si desea ver otras sucursales, tendrá que revisarlas. Y sí, la fusión (y el rebase) requieren absolutamente un árbol de trabajo, por lo que no se pueden hacer sin verificar las otras ramas. Si lo desea, puede resumir sus pasos descritos en un guión / alias, aunque sugeriría unir los comandos
&¶ que, en caso de que uno de ellos falle, no intente continuar.fuente
Utilizo el
syncsubcomando de hub para automatizar esto. Tengoalias git=huben mi.bash_profile, así que el comando que escribo es:Esto actualiza todas las sucursales locales que tienen una rama ascendente coincidente. Desde la página del manual:
También maneja los cambios no confirmados de ocultación / desactivación en la rama actual.
Solía usar una herramienta similar llamada git-up , pero ya no se mantiene y
git synchace casi exactamente lo mismo.fuente
git config --global git-up.rebase.auto false.Sé que esta pregunta tiene casi 3 años, pero me hice la misma pregunta y no encontré ninguna solución preparada. Entonces, creé un script de shell de comando git personalizado.
Aquí va, el
git-ffwd-updatescript hace lo siguiente ...git remote updatepara buscar las últimas revolucionesgit remote showpara obtener una lista de sucursales locales que rastrean una sucursal remota (por ejemplo, sucursales que se pueden usar congit pull)git rev-list --count <REMOTE_BRANCH>..<LOCAL_BRANCH>cuántos commit está la rama local detrás del remoto (y viceversa)git branch -f <LOCAL_BRANCH> -t <REMOTE_BRANCH>el script se puede llamar así:
El script completo debe guardarse como
git-ffwd-updatey debe estar en elPATH.fuente
git branchllamada. Eliminé -l para cambiar la llamadagit branch -f $LB -t $ARB >/dev/null;y ahora el script funciona como debería.No es tan difícil automatizar:
fuente
git rebase origin/$branchagit pull, de modo que se obtenga de la rama de seguimiento adecuada (presumiblemente en el origen) y se combine o rebase según lo determine la configuración.fetch. Han editado; características / correcciones adicionales, lo que sea que dependa del OP.pull(o verificarbranch.<branch>.rebase), para no volver a crear accidentalmente una rama que está configurada para extraer normalmente (fusionar).set -elugar de|| exit 1hacer que el intérprete salga en el primer error.Esto todavía no es automático, ya que desearía que hubiera una opción, y debería haber alguna verificación para asegurarse de que esto solo pueda suceder para las actualizaciones de avance rápido (¡¡por eso es que hacer un tirón manualmente es mucho más seguro !!), pero aparte de las advertencias puedes:
para actualizar la posición de su sucursal local sin tener que verificarlo.
Nota: perderá su posición de sucursal actual y la moverá a donde está la sucursal del origen, lo que significa que si necesita fusionarse, ¡perderá datos!
fuente
git fetch origin other-branch:other-branchAquí hay muchas respuestas, pero ninguna que se use
git-fetchpara actualizar el árbitro local directamente, lo cual es mucho más simple que retirar sucursales y más seguro quegit-update-ref.Aquí usamos
git-fetchpara actualizar ramas no actuales ygit pull --ff-onlypara la rama actual. Eso:Y aquí está:
Desde la página de manual para
git-fetch:Al especificar
git fetch <remote> <ref>:<ref>(sin ningún+) obtenemos una búsqueda que actualiza la referencia local solo cuando se puede reenviar rápidamente.Nota : esto supone que las ramas locales y remotas tienen el mismo nombre (y que desea rastrear todas las ramas), realmente debería usar información sobre qué ramas locales tiene y qué están configuradas para rastrear.
fuente
c*npasos (en lugar de 1), dondechay un número de comandos repetidos ynes el número de ramas.git branch -r | grep -v ' -> ' | while read remotebranchagit branch -r | grep -v ' -> ' | grep -f <(git branch | cut -c 3- | awk '{print "\\S*/"$0"$"}') | while read remotebranchlimitarlo a las ramas que ya tengo localmente. También agregué ungit fetch --pruneal principio para actualizar la lista de ramas remotas antes de hacer algo, lo que evita algunas advertencias.Este problema no está resuelto (todavía), al menos no fácilmente / sin secuencias de comandos: vea esta publicación en la lista de correo git de Junio C Hamano explicando la situación y solicitando una solución simple.
El razonamiento principal es que no debería necesitar esto:
La llamada para una solución era para una opción o script externo para podar las sucursales locales que siguen ahora las sucursales de seguimiento remoto, en lugar de mantenerlas actualizadas mediante el avance rápido, como se solicitó en el póster original.
Nota: a partir de git 2.10 no existe tal solución. Tenga en cuenta que el
git remote prunesubcomando, ygit fetch --prunese trata de eliminar la bifurcación de seguimiento remoto para la bifurcación que ya no existe en la remota, no se trata de eliminar la bifurcación local que rastrea la bifurcación de seguimiento remoto (para la cual la bifurcación de seguimiento remoto es la bifurcación ascendente).fuente
Aquí hay muchas respuestas aceptables, pero algunas de las tuberías pueden ser un poco opacas para los no iniciados. Aquí hay un ejemplo mucho más simple que se puede personalizar fácilmente:
Si agrega
~/bin/gita suPATH(suponiendo que el archivo es~/bin/git/git-update-all), puede ejecutar:fuente
Agregue este script a
.profileen Mac OS X:fuente
Aquí hay una buena respuesta: cómo obtener todas las ramas git
fuente
git fetchygit pull, en lugar de sologit pull?origin/prefijoUn guión que escribí para mi GitBash . Logra lo siguiente:
git checkout branchgit pull origin** Lo uso pero no lo he probado completamente, uso bajo su propio riesgo. Vea un ejemplo de este script en un archivo .bash_alias aquí .
fuente
Si está en Windows, puede usar PyGitUp, que es un clon de
git-upPython. Puede instalarlo usando pip conpip install --user git-upo a través de Scoop usandoscoop install git-up[![4]](https://i.stack.imgur.com/7AjEC.png)
fuente
Solo publicando una respuesta actualizada.
git-upya no se mantiene y si lee la documentación, mencionan que la funcionalidad ahora está disponible en git .También puede configurar esto para cada
git pullGit 2.9 también (gracias @VonC, consulte su respuesta aquí )fuente
git-updocumentación porque no mencionan esogit-up.git-up:)Me encontré con el mismo problema de esta pregunta ...
Preguntándome al respecto, hice una pequeña función de alias dentro de mi
.bashrcarchivo:Trabajó para mi (:
fuente
Si las referencias / cabezas / maestro se pueden reenviar rápidamente a referencias / controles remotos / foo / maestro , la salida de
debería devolver la identificación SHA1 a la que hace referencia las referencias / cabezas / puntos maestros . Con esto, puede armar una secuencia de comandos que actualice automáticamente todas las sucursales locales a las que no se les han aplicado confirmaciones de desvío.
Este pequeño script de shell (lo llamé git-can-ff ) ilustra cómo se puede hacer.
fuente
Para completar la respuesta de Matt Connolly, esta es una forma más segura de actualizar las referencias de sucursales locales que pueden reenviarse rápidamente, sin consultar la sucursal. No actualiza las ramas que no pueden reenviarse rápidamente (es decir, que han divergido), y no actualiza la rama que está actualmente desprotegida (porque entonces la copia de trabajo también debe actualizarse).
fuente
Un script ligeramente diferente que solo adelanta rápidamente las ramas cuyos nombres coinciden con su rama ascendente. También actualiza la rama actual si es posible el avance rápido.
Asegúrese de que todas las ramas aguas arriba de sus ramas estén configuradas correctamente al ejecutarlas
git branch -vv. Establecer la rama aguas arriba congit branch -u origin/yourbanchnameCopie y pegue en un archivo y chmod 755:
fuente
El siguiente one-liner avanza rápidamente todas las ramas que tienen una rama ascendente si es posible, e imprime un error de lo contrario:
¿Como funciona?
Utiliza un formato personalizado con el
git branchcomando. Para cada rama que tiene una rama ascendente, imprime una línea con el siguiente patrón:Esto se puede canalizar directamente
sh(suponiendo que los nombres de las ramas estén bien formados). Omitir el| shpara ver lo que está haciendo.Advertencias
El one-liner no contactará con sus controles remotos. Emita uno
git fetchogit fetch --allantes de ejecutarlo.La rama actualmente desprotegida no se actualizará con un mensaje como
Para esto, puede recurrir a regular
git pull --ff-only.Alias
Agregue lo siguiente a su
.gitconfigpara quegit fftrealice este comando:Ver también mi
.gitconfig. El alias es una forma abreviada de "seguimiento rápido (ramas)".fuente
hubsolución propuesta por @John para obtener una mejor salida.git pushporque es totalmente opuesto a lo que esperarías. Cual es el secretogit push?git pushtiene semántica de carga: tengo algunas confirmaciones locales que quiero enviar en sentido ascendente.git pulltiene semántica de descarga: quiero obtener algunas confirmaciones remotas ascendentes en mi sucursal local. Como estamos hablando de descargar nuevos commits desde el remoto al local,git pulles la opción obvia. Pero no, este truco lo usagit push. ¿Cómo segit pushtraduce en cambios remotos a mi sucursal local?git pushtambién se puede usar para actualizar sucursales locales, siempre que sea una actualización rápida.El script de @larsmans, un poco mejorado:
Esto, después de que termina, deja la copia de trabajo desprotegida de la misma rama que estaba antes de que se llamara al script.
La
git pullversión:fuente
Parece que muchos otros han aportado soluciones similares, pero pensé en compartir lo que se me ocurrió e invitar a otros a contribuir. Esta solución tiene una salida agradable y colorida, maneja con gracia su directorio de trabajo actual, y es rápido porque no hace ningún pago y deja su directorio de trabajo intacto. Además, es solo un script de shell sin dependencias distintas de git. (Solo probado en OSX hasta ahora)
https://github.com/davestimpert/gitup
Lo siento, también parece que se me ocurrió el mismo nombre que la otra herramienta anterior.
fuente
Se puede hacer usando el siguiente script ... Primero buscará todas las ramas y pagará una por una y se actualizará solo.
fuente
No puede hacerlo con un solo comando git, pero puede automatizarlo con una línea bash.
Para actualizar de forma segura todas las ramas con una línea, esto es lo que hago:
Si no puede avanzar rápidamente una rama o encontrar un error, se detendrá y lo dejará en esa rama para que pueda recuperar el control y fusionarse manualmente.
Si todas las ramas se pueden reenviar rápidamente, finalizará con la rama en la que se encontraba actualmente, dejándolo donde estaba antes de la actualización.
Explicaciones:
Para una mejor legibilidad, se puede dividir en varias líneas:
git fetch --all && ...=> Obtiene todas las referencias de todos los controles remotos y continúa con el siguiente comando si no ha habido ningún error.git branch | sed '/*/{$q;h;d};$G' | tr -d '*'=> Desde la salida degit branch,sedtome la línea con a*y muévala hasta el final (para que la rama actual se actualice por última vez). Luegotrsimplemente quite el*.for branch in $(...) ; do git checkout $branch && git merge --ff-only || break ; done=> Para cada nombre de rama obtenido del comando anterior, desproteja esta rama e intente fusionarse con un avance rápido. Si falla,breakse llama y el comando se detiene aquí.Por supuesto, puede reemplazar
git merge --ff-onlycongit rebasesi es lo que desea.Finalmente, puedes ponerlo en tu bashrc como un alias:
O si tiene miedo de equivocarse con 'y', o simplemente prefiere mantener la legibilidad sintáctica en su editor, puede declararlo como una función:
Prima:
Para aquellos que deseen la explicación por
sed '/*/{$q;h;d};$G'parte:/*/=> Busque la línea con a*.{$q=> Si está en la última línea, salga (no necesitamos hacer nada porque la rama actual ya es la última en la lista).;h;d}=> De lo contrario, almacene la línea en el búfer de retención y elimínela en la posición actual de la lista.;$G=> Cuando llegue a la última línea, agregue el contenido del búfer de retención.fuente
&&colocandoset -een la parte superior de la secuencia de comandos.No, no puede. Para el avance rápido, acabo de escribir una pequeña herramienta para hacerlo. https://github.com/changyuheng/git-fast-forward-all
Ventajas de esta herramienta:
hub syncno admite múltiples controles remotos por el momento).fuente
git fetch . refspec. El.dice buscar desde el repositorio actual en lugar de desde el remoto.A partir de git 2.9:
git pull --rebase --autostashVer https://git-scm.com/docs/git-rebase
fuente
De hecho, con git
version 1.8.3.1, funciona:En la rama maestra, puede actualizar todas las demás ramas. @Cascabel
No sé qué versión romperlo / arreglarlo, en 2.17 (que uso), puede funcionar.
fuente