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:
git fetch --all && for branch in $(git branch | sed '/*/{$q;h;d};$G' | tr -d '*') ; do git checkout $branch && git merge --ff-only || break ; done
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 && \
for branch in $(git branch | sed '/*/{$q;h;d};$G' | tr -d '*')
do git checkout $branch && \
git merge --ff-only || break
done
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 de git branch
, sed
tome la línea con a *
y muévala hasta el final (para que la rama actual se actualice por última vez). Luego tr
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
con git rebase
si es lo que desea.
Finalmente, puedes ponerlo en tu bashrc como un alias:
alias git-pull-all='git fetch --all && for branch in $(git branch | sed '\''/*/{$q;h;d};$G'\'' | tr -d "*") ; do git checkout $branch && git merge --ff-only || break ; done'
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:
git-pull-all()
{
git fetch --all && for branch in $(git branch | sed '/*/{$q;h;d};$G' | tr -d '*') ; do git checkout $branch && git merge --ff-only || break ; done
}
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.