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
, sed
prendi la linea con a *
e spostala alla fine (in modo che il ramo corrente venga aggiornato per ultimo). Quindi tr
rimuovere 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, break
viene chiamato e il comando si ferma qui.
Certo, puoi sostituirlo git merge --ff-only
con git rebase
se è 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.