Non puoi farlo con un solo comando git ma puoi automatizzarlo con una riga bash.
Per aggiornare in sicurezza tutti i rami con una riga, ecco cosa faccio:
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
Se non è possibile avanzare rapidamente di un ramo o riscontrare un errore, si arresterà e ti lascerà in quel ramo in modo da poter riprendere il controllo e unirli manualmente.
Se tutti i rami possono essere fatti avanzare rapidamente, finirà con il ramo in cui ti trovavi attualmente, lasciandoti dove eri prima di aggiornare.
spiegazioni:
Per una migliore leggibilità, può essere suddiviso su più righe:
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 && ... => Recupera tutti i riferimenti da tutti i telecomandi e continua con il comando successivo se non si sono verificati errori.
git branch | sed '/*/{$q;h;d};$G' | tr -d '*'=> Dall'output di git branch, sedprendi la linea con a *e spostala alla fine (in modo che il ramo corrente venga aggiornato per ultimo). Quindi trrimuovere semplicemente il *.
for branch in $(...) ; do git checkout $branch && git merge --ff-only || break ; done=> Per ogni nome di ramo ottenuto dal comando precedente, controlla questo ramo e prova a unire con un avanzamento veloce. Se fallisce, breakviene chiamato e il comando si ferma qui.
Certo, puoi sostituirlo git merge --ff-onlycon git rebasese è quello che vuoi.
Infine, puoi inserirlo nel tuo bashrc come 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 se hai paura di fare casini con 'e ", o semplicemente preferisci mantenere la leggibilità sintattica nel tuo editor, puoi dichiararlo come una funzione:
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
}
Bonus:
Per coloro a cui piacerebbe la spiegazione da sed '/*/{$q;h;d};$G'parte:
/*/=> Cerca la riga con a *.
{$q => Se è nell'ultima riga, esci (non è necessario fare nulla perché il ramo corrente è già l'ultimo nell'elenco).
;h;d} => In caso contrario, memorizzare la riga nel buffer di mantenimento ed eliminarla nella posizione corrente dell'elenco.
;$G => Quando raggiunge l'ultima riga, aggiungi il contenuto del buffer di conservazione.