Anda tidak dapat melakukannya dengan hanya satu perintah git tetapi Anda dapat mengotomatiskannya dengan satu garis bash.
Untuk memperbarui semua cabang dengan satu baris dengan aman, inilah yang saya lakukan:
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
Jika tidak bisa memajukan satu cabang atau menemukan kesalahan, itu akan berhenti dan meninggalkan Anda di cabang itu sehingga Anda dapat mengambil kembali kontrol dan menggabungkan secara manual.
Jika semua cabang dapat diteruskan dengan cepat, cabang itu akan berakhir dengan cabang tempat Anda berada saat ini, membuat Anda tetap berada di tempat sebelum memperbarui.
Penjelasan:
Untuk keterbacaan yang lebih baik, dapat dibagi menjadi beberapa baris:
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 && ...
=> Mengambil semua referensi dari semua remote dan melanjutkan dengan perintah berikutnya jika tidak ada kesalahan.
git branch | sed '/*/{$q;h;d};$G' | tr -d '*'
=> Dari output git branch
, sed
ambil baris dengan a *
dan pindahkan ke akhir (sehingga cabang saat ini akan diperbarui terakhir). Kemudian tr
cukup hapus *
.
for branch in $(...) ; do git checkout $branch && git merge --ff-only || break ; done
=> Untuk setiap nama cabang yang diperoleh dari perintah sebelumnya, checkout cabang ini dan cobalah untuk bergabung dengan fast-forward. Jika gagal, break
dipanggil dan perintah berhenti di sini.
Tentu saja, Anda dapat menggantinya git merge --ff-only
dengan git rebase
apa yang Anda inginkan.
Akhirnya, Anda bisa memasukkannya ke bashrc Anda sebagai 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'
Atau jika Anda takut mengacaukan 'dan ", atau Anda lebih memilih untuk menjaga keterbacaan sintaksis di editor Anda, Anda dapat mendeklarasikannya sebagai fungsi:
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:
Bagi yang ingin penjelasan pada sed '/*/{$q;h;d};$G'
bagian:
/*/
=> Cari baris dengan a *
.
{$q
=> Jika ada di baris terakhir, keluar (kita tidak perlu melakukan apa-apa karena cabang saat ini sudah yang terakhir dalam daftar).
;h;d}
=> Kalau tidak, simpan baris di buffer terus dan hapus di posisi daftar saat ini.
;$G
=> Ketika mencapai baris terakhir, tambahkan konten buffer penahan.