Vous ne pouvez pas le faire avec une seule commande git mais vous pouvez l'automatiser avec une seule ligne bash.
Pour mettre à jour en toute sécurité toutes les branches avec une seule ligne, voici ce que je fais:
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
S'il ne peut pas avancer rapidement une branche ou rencontrer une erreur, il s'arrêtera et vous laissera dans cette branche afin que vous puissiez reprendre le contrôle et fusionner manuellement.
Si toutes les branches peuvent être transférées rapidement, cela se terminera avec la branche dans laquelle vous vous trouviez actuellement, vous laissant où vous étiez avant la mise à jour.
Explications:
Pour une meilleure lisibilité, il peut être réparti sur plusieurs lignes:
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 && ...
=> Récupère toutes les références de toutes les télécommandes et continue avec la commande suivante s'il n'y a pas eu d'erreur.
git branch | sed '/*/{$q;h;d};$G' | tr -d '*'
=> A partir de la sortie de git branch
, sed
prenez la ligne avec a *
et déplacez-la à la fin (pour que la branche courante soit mise à jour en dernier). tr
Retirez ensuite simplement le *
.
for branch in $(...) ; do git checkout $branch && git merge --ff-only || break ; done
=> Pour chaque nom de branche obtenu à partir de la commande précédente, extrayez cette branche et essayez de fusionner avec une avance rapide. S'il échoue, il break
est appelé et la commande s'arrête ici.
Bien sûr, vous pouvez remplacer git merge --ff-only
avec git rebase
si elle est ce que vous voulez.
Enfin, vous pouvez le mettre dans votre bashrc comme 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'
Ou si vous avez peur de vous tromper avec les 'et ", ou si vous préférez simplement garder la lisibilité syntaxique dans votre éditeur, vous pouvez le déclarer comme une fonction:
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
}
Prime:
Pour ceux qui voudraient l'explication de la sed '/*/{$q;h;d};$G'
partie:
/*/
=> Recherchez la ligne avec un *
.
{$q
=> S'il est dans la dernière ligne, quittez (nous n'avons rien à faire car la branche courante est déjà la dernière de la liste).
;h;d}
=> Sinon, stockez la ligne dans le tampon de maintien et supprimez-la à la position actuelle de la liste.
;$G
=> Quand il atteint la dernière ligne, ajoutez le contenu du tampon de maintien.