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 --all
es 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;pull
luego 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
&&
para que, en caso de que uno de ellos falle, no intente continuar.fuente
Utilizo el
sync
subcomando de hub para automatizar esto. Tengoalias git=hub
en 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 sync
hace 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-update
script hace lo siguiente ...git remote update
para buscar las últimas revolucionesgit remote show
para 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-update
y debe estar en elPATH
.fuente
git branch
llamada. 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/$branch
agit 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 -e
lugar de|| exit 1
hacer 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-branch
Aquí hay muchas respuestas, pero ninguna que se use
git-fetch
para 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-fetch
para actualizar ramas no actuales ygit pull --ff-only
para 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*n
pasos (en lugar de 1), dondec
hay un número de comandos repetidos yn
es el número de ramas.git branch -r | grep -v ' -> ' | while read remotebranch
agit branch -r | grep -v ' -> ' | grep -f <(git branch | cut -c 3- | awk '{print "\\S*/"$0"$"}') | while read remotebranch
limitarlo a las ramas que ya tengo localmente. También agregué ungit fetch --prune
al 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 prune
subcomando, ygit fetch --prune
se 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/git
a suPATH
(suponiendo que el archivo es~/bin/git/git-update-all
), puede ejecutar:fuente
Agregue este script a
.profile
en Mac OS X:fuente
Aquí hay una buena respuesta: cómo obtener todas las ramas git
fuente
git fetch
ygit pull
, en lugar de sologit pull
?origin/
prefijoUn guión que escribí para mi GitBash . Logra lo siguiente:
git checkout branch
git 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-up
Python. Puede instalarlo usando pip conpip install --user git-up
o a través de Scoop usandoscoop install git-up
[
fuente
Solo publicando una respuesta actualizada.
git-up
ya 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 pull
Git 2.9 también (gracias @VonC, consulte su respuesta aquí )fuente
git-up
documentació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
.bashrc
archivo: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/yourbanchname
Copie 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 branch
comando. 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| sh
para ver lo que está haciendo.Advertencias
El one-liner no contactará con sus controles remotos. Emita uno
git fetch
ogit fetch --all
antes 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
.gitconfig
para quegit fft
realice este comando:Ver también mi
.gitconfig
. El alias es una forma abreviada de "seguimiento rápido (ramas)".fuente
hub
solución propuesta por @John para obtener una mejor salida.git push
porque es totalmente opuesto a lo que esperarías. Cual es el secretogit push
?git push
tiene semántica de carga: tengo algunas confirmaciones locales que quiero enviar en sentido ascendente.git pull
tiene 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 pull
es la opción obvia. Pero no, este truco lo usagit push
. ¿Cómo segit push
traduce en cambios remotos a mi sucursal local?git push
tambié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 pull
versió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
,sed
tome la línea con a*
y muévala hasta el final (para que la rama actual se actualice por última vez). Luegotr
simplemente 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,break
se llama y el comando se detiene aquí.Por supuesto, puede reemplazar
git merge --ff-only
congit rebase
si 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 -e
en 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 sync
no 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 --autostash
Ver 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