Saya sering memiliki setidaknya 3 cabang terpencil: master, pementasan dan produksi. Saya memiliki 3 cabang lokal yang melacak cabang-cabang terpencil itu.
Memperbarui semua cabang lokal saya membosankan:
git fetch --all
git rebase origin/master
git checkout staging
git rebase origin/staging
git checkout production
git rebase origin/production
Saya ingin bisa melakukan "git pull -all", tapi saya belum bisa membuatnya bekerja. Tampaknya melakukan "fetch - all", kemudian memperbarui (memajukan atau menggabungkan) cabang yang sedang bekerja, tetapi bukan cabang lokal lainnya.
Saya masih terjebak secara manual beralih ke setiap cabang lokal dan memperbarui.
Jawaban:
Perilaku yang Anda jelaskan
pull --all
persis seperti yang diharapkan, meskipun tidak selalu berguna. Opsi ini diteruskan ke git fetch, yang kemudian mengambil semua referensi dari semua remote, bukan hanya yang dibutuhkan;pull
kemudian menggabungkan (atau dalam kasus Anda, rebases) cabang tunggal yang sesuai.Jika Anda ingin memeriksa cabang lain, Anda harus memeriksanya. Dan ya, penggabungan (dan rebasing) benar - benar membutuhkan pohon kerja, sehingga mereka tidak dapat dilakukan tanpa memeriksa cabang lainnya. Anda dapat membungkus langkah-langkah yang dijelaskan ke dalam skrip / alias jika Anda mau, meskipun saya sarankan untuk bergabung dengan perintah
&&
sehingga jika salah satu dari mereka gagal, itu tidak akan mencoba untuk membajak.sumber
Saya menggunakan
sync
subcommand dari hub untuk mengotomatisasi ini. Saya milikialias git=hub
di saya.bash_profile
, jadi perintah yang saya ketik adalah:Ini memperbarui semua cabang lokal yang memiliki cabang upstream yang cocok. Dari halaman manual:
Ini juga menangani stashing / unstashing perubahan yang tidak dikomit pada cabang saat ini.
Saya dulu menggunakan alat serupa yang disebut git-up , tetapi tidak lagi dipertahankan, dan
git sync
melakukan hal yang persis sama.sumber
git config --global git-up.rebase.auto false
.Saya tahu pertanyaan ini hampir 3 tahun, tetapi saya bertanya pada diri sendiri pertanyaan yang sama dan tidak menemukan solusi yang sudah jadi. Jadi, saya membuat skrip shell perintah git kustom sendiri.
Ini dia,
git-ffwd-update
skrip melakukan yang berikut ...git remote update
untuk mengambil revs akhirgit remote show
untuk mendapatkan daftar cabang lokal yang melacak cabang jarak jauh (mis. cabang yang dapat digunakan dengangit pull
)git rev-list --count <REMOTE_BRANCH>..<LOCAL_BRANCH>
berapa banyak komit cabang lokal di belakang remote (dan di depan sebaliknya)git branch -f <LOCAL_BRANCH> -t <REMOTE_BRANCH>
skrip dapat disebut seperti:
Naskah lengkap, harus disimpan sebagai
git-ffwd-update
dan harus diPATH
.sumber
git branch
panggilan. Saya menghapus -l untuk mengubah panggilan menjadigit branch -f $LB -t $ARB >/dev/null;
dan sekarang skrip berfungsi sebagaimana mestinya.Tidak terlalu sulit untuk mengotomatisasi:
sumber
git rebase origin/$branch
kegit pull
, sehingga itu akan diambil dari cabang pelacakan yang sesuai (mungkin berasal dari asal) dan menggabungkan atau rebase seperti yang ditentukan oleh konfigurasi.fetch
. Telah diedit; fitur tambahan / perbaikan apa pun yang ada pada OP.pull
(atau memeriksabranch.<branch>.rebase
), sehingga Anda tidak sengaja rebase cabang yang disetel untuk menarik secara normal (bergabung).set -e
alih-alih|| exit 1
membuat juru bahasa keluar pada kesalahan pertama.Ini masih tidak otomatis, karena saya berharap ada opsi untuk - dan harus ada pengecekan untuk memastikan bahwa ini hanya dapat terjadi untuk pembaruan fast-forward (yang mengapa melakukan penarikan secara manual jauh lebih aman !!), tetapi selain peringatan Anda dapat:
untuk memperbarui posisi cabang lokal Anda tanpa harus memeriksanya.
Catatan: Anda akan kehilangan posisi cabang saat ini dan memindahkannya ke tempat asal cabang itu, yang berarti bahwa jika Anda perlu menggabungkan Anda akan kehilangan data!
sumber
git fetch origin other-branch:other-branch
Ada banyak jawaban di sini tetapi tidak ada yang digunakan
git-fetch
untuk memperbarui referensi lokal secara langsung, yang jauh lebih sederhana daripada memeriksa cabang, dan lebih aman daripadagit-update-ref
.Di sini kami gunakan
git-fetch
untuk memperbarui cabang tidak lancar dangit pull --ff-only
untuk cabang saat ini. Itu:dan ini dia:
Dari halaman manual untuk
git-fetch
:Dengan menentukan
git fetch <remote> <ref>:<ref>
(tanpa ada+
) kami mendapatkan pengambilan yang memperbarui referensi lokal hanya ketika itu dapat diteruskan dengan cepat.Catatan : ini mengasumsikan cabang lokal dan jauh dinamai sama (dan bahwa Anda ingin melacak semua cabang), itu harus benar-benar menggunakan informasi tentang cabang lokal yang Anda miliki dan apa yang diatur untuk dilacak.
sumber
c*n
langkah - langkah (bukan 1), di manac
ada sejumlah perintah yang diulang dann
jumlah cabang.git branch -r | grep -v ' -> ' | while read remotebranch
untukgit branch -r | grep -v ' -> ' | grep -f <(git branch | cut -c 3- | awk '{print "\\S*/"$0"$"}') | while read remotebranch
membatasi ke cabang-cabang saya sudah punya lokal. Saya juga menambahkangit fetch --prune
di awal untuk memperbarui daftar cabang jauh sebelum melakukan apa pun, yang menghindari beberapa peringatan.Masalah ini belum terpecahkan (belum), setidaknya tidak mudah / tanpa skrip: lihat posting ini di milis git oleh Junio C Hamano yang menjelaskan situasi dan memberikan panggilan untuk solusi sederhana.
Alasan utamanya adalah Anda tidak perlu ini:
Panggilan untuk solusi adalah untuk opsi atau skrip eksternal untuk memangkas cabang-cabang lokal yang mengikuti cabang-cabang pelacakan jarak jauh, daripada membuat mereka tetap up-to-date dengan penerusan cepat, seperti poster asli yang diminta.
Catatan: pada git 2.10 tidak ada solusi seperti itu. Perhatikan bahwa
git remote prune
sub-perintah, dangit fetch --prune
tentang menghapus cabang pelacakan jarak jauh untuk cabang yang tidak lagi ada di jarak jauh, bukan tentang menghapus cabang lokal yang melacak cabang pelacakan jarak jauh (yang cabang pelacakan jarak jauh adalah cabang hulu).sumber
Ada banyak jawaban yang bisa diterima di sini, tetapi beberapa pipa ledeng mungkin agak buram bagi yang belum tahu. Berikut adalah contoh yang jauh lebih sederhana yang dapat dengan mudah disesuaikan:
Jika Anda menambahkan
~/bin/git
ke AndaPATH
(dengan asumsi file tersebut~/bin/git/git-update-all
), Anda bisa menjalankan:sumber
Tambahkan skrip ini ke
.profile
di Mac OS X:sumber
Inilah jawaban yang bagus: Cara mengambil semua cabang git
sumber
git fetch
dangit pull
, bukan hanyagit pull
?origin/
awalanSebuah skrip yang saya tulis untuk GitBash saya . Selesaikan hal-hal berikut:
git checkout branch
git pull origin
** Saya menggunakan ini tetapi belum diuji secara menyeluruh, gunakan dengan risiko sendiri. Lihat contoh skrip ini dalam file .bash_alias di sini .
sumber
Jika Anda menggunakan Windows, Anda dapat menggunakan PyGitUp yang merupakan tiruan dari
git-up
untuk Python. Anda dapat menginstalnya menggunakan pip denganpip install --user git-up
atau melalui Scoop menggunakanscoop install git-up
[
sumber
Hanya memposting jawaban yang diperbarui.
git-up
tidak lagi dipertahankan dan jika Anda membaca dokumentasinya, mereka menyebutkan bahwa fungsinya sekarang tersedia di git .Anda juga dapat mengatur ini untuk setiap
git pull
per Git 2.9 (terima kasih @VonC silakan lihat jawabannya di sini )sumber
git-up
dokumentasi karena mereka tidak menyebutkan itugit-up
.git-up
:)Saya menemukan masalah yang sama dari pertanyaan ini ...
Bingung sendiri tentang hal itu, saya melakukan fungsi alias kecil di dalam
.bashrc
file saya :Bekerja untuk saya (:
sumber
Jika ref / head / master dapat diteruskan dengan cepat ke ref / remote / foo / master , output dari
harus mengembalikan id SHA1 yang merujuk ke / kepala / master poin. Dengan ini, Anda dapat menyusun skrip yang secara otomatis memperbarui semua cabang lokal yang tidak memiliki komitmen pengalihan yang diterapkan padanya.
Script shell kecil ini (saya menyebutnya git-can-ff ) menggambarkan bagaimana hal itu dapat dilakukan.
sumber
Untuk menyelesaikan jawaban oleh Matt Connolly, ini adalah cara yang lebih aman untuk memperbarui referensi cabang lokal yang dapat diteruskan dengan cepat, tanpa memeriksa cabang. Itu tidak memperbarui cabang yang tidak dapat diteruskan dengan cepat (yaitu yang telah menyimpang), dan itu tidak memperbarui cabang yang saat ini diperiksa (karena itu copy pekerjaan harus diperbarui juga).
sumber
Skrip yang sedikit berbeda yang hanya memajukan cabang yang namanya cocok dengan cabang hulu mereka. Ini juga memperbarui cabang saat ini jika fast-forward dimungkinkan.
Pastikan semua cabang hulu cabang Anda disetel dengan benar dengan menjalankan
git branch -vv
. Atur cabang hulu dengangit branch -u origin/yourbanchname
Salin-tempel ke file dan chmod 755:
sumber
Jalur cepat berikut meneruskan semua cabang yang memiliki cabang hulu jika mungkin, dan mencetak kesalahan jika tidak:
Bagaimana cara kerjanya?
Ini menggunakan format khusus dengan
git branch
perintah. Untuk setiap cabang yang memiliki cabang hulu, ia mencetak garis dengan pola berikut:Ini dapat disalurkan langsung ke
sh
(dengan asumsi bahwa nama-nama cabang terbentuk dengan baik). Abaikan| sh
untuk melihat apa yang dilakukannya.Peringatan
One-liner tidak akan menghubungi remote Anda. Terbitkan
git fetch
ataugit fetch --all
sebelum menjalankannya.Cabang yang keluar saat ini tidak akan diperbarui dengan pesan seperti
Untuk ini, Anda bisa menggunakan cara biasa
git pull --ff-only
.Alias
Tambahkan berikut ini ke Anda
.gitconfig
sehinggagit fft
melakukan perintah ini:Lihat juga
.gitconfig
. Alias adalah singkatan untuk "pelacakan maju cepat (cabang)".sumber
hub
soluction propsed oleh @ John untuk output yang lebih baik.git push
karena itu benar-benar berlawanan dari apa yang Anda harapkan. Apa rahasianyagit push
?git push
telah mengunggah semantik - Saya memiliki beberapa komit secara lokal yang ingin saya kirim ke hulu.git pull
memiliki semantik unduhan - Saya ingin mendapatkan beberapa komit jarak jauh hulu ke cabang lokal saya. Karena kita sedang berbicara tentang mengunduh komit baru dari jarak jauh ke lokal,git pull
adalah pilihan yang jelas. Tapi tidak, trik ini digunakangit push
. Bagaimana caragit push
menghasilkan perubahan jarak jauh ke cabang lokal saya ?!git push
juga dapat digunakan untuk memperbarui cabang lokal, selama ini adalah pembaruan maju cepat.Script dari @ larsmans, sedikit membaik:
Ini, setelah selesai, membuat copy pekerjaan diperiksa dari cabang yang sama seperti sebelum script dipanggil.
The
git pull
Versi:sumber
Sepertinya banyak orang lain yang menyumbangkan solusi serupa, tetapi saya pikir saya akan membagikan apa yang saya hasilkan dan mengundang orang lain untuk berkontribusi. Solusi ini memiliki keluaran penuh warna yang bagus, dengan anggun menangani direktori kerja Anda saat ini, dan cepat karena tidak melakukan checkout, dan membiarkan direktori kerja Anda tetap aktif. Juga, ini hanyalah skrip shell tanpa dependensi selain git. (hanya diuji pada OSX sejauh ini)
https://github.com/davestimpert/gitup
Maaf saya juga tampaknya telah datang dengan nama yang sama dengan alat lain di atas.
sumber
Ini dapat dilakukan menggunakan skrip di bawah ini ... Pertama-tama akan mengambil semua cabang dan checkout satu per satu dan memperbarui dengan sendirinya.
sumber
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:
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 && ...
=> 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 outputgit branch
,sed
ambil baris dengan a*
dan pindahkan ke akhir (sehingga cabang saat ini akan diperbarui terakhir). Kemudiantr
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
dengangit rebase
apa yang Anda inginkan.Akhirnya, Anda bisa memasukkannya ke bashrc Anda sebagai alias:
Atau jika Anda takut mengacaukan 'dan ", atau Anda lebih memilih untuk menjaga keterbacaan sintaksis di editor Anda, Anda dapat mendeklarasikannya sebagai fungsi:
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.sumber
&&
dengan mengaturset -e
di bagian atas skrip.Tidak, tidak bisa. Untuk fast-forwarding, saya hanya menulis alat kecil untuk melakukannya. https://github.com/changyuheng/git-fast-forward-all
Keuntungan alat ini:
hub sync
ini tidak mendukung beberapa remote.)sumber
git fetch . refspec
. Kata.
mengatakan untuk mengambil dari repositori saat ini bukan dari yang jauh.Mulai git 2.9:
git pull --rebase --autostash
Lihat https://git-scm.com/docs/git-rebase
sumber
Bahkan, dengan git
version 1.8.3.1
, ia berfungsi:Di cabang utama, Anda dapat memperbarui semua cabang lainnya. @Cascabel
Saya tidak tahu versi mana yang memecah / memperbaikinya, pada 2.17 (yang saya gunakan), ia bisa bekerja.
sumber