Saya terbiasa menjalankan git pull dan perintah lain dari dalam cabang yang saya kerjakan. Tetapi saya telah menyiapkan server pengembangan yang dikerjakan beberapa orang, jadi saya tidak ingin berpindah cabang saat melakukannya. Jika saya ingin memperbarui cabang yang ada di server dev dari repositori github yang kita semua gunakan, apa cara yang tepat untuk melakukannya? Jika saya menjalankan perintah 'git pull github branchname' apakah itu hanya akan menarik cabang ke cabang saat ini?
Semua contoh git yang saya temukan sepertinya menunjukkan bahwa Anda menjalankan 'checkout branchname' terlebih dahulu, kemudian lakukan penarikan. Saya mencoba untuk menghindari itu. Seperti yang saya katakan, ini adalah cabang yang sudah ada dan saya hanya ingin memperbarui ke versi terbaru.
git fetch
harus melakukan apa yang kamu inginkan.git fetch
akan memperbarui salinan lokal dari cabang jarak jauh, tetapi tidak setiap cabang lokal, bahkan jika ada yang diatur untuk melacak cabang jarak jauh tertentu. Mungkin atau mungkin tidak apa yang diinginkan. (Sunting: secara default, bagaimanapun. Dimungkinkan untuk memanggilnya dengan argumen untuk membuatnya berperilaku berbeda, tetapi dalam kasus itu, argumen harus benar-benar ditunjukkan.)Jawaban:
Saya mencari hal yang sama dan akhirnya menemukan jawaban yang berhasil untuk saya di pos stackoverflow lain: Gabungkan, perbarui, dan tarik cabang Git tanpa menggunakan pembayaran
Pada dasarnya:
git fetch <remote> <srcBranch>:<destBranch>
sumber
pull
memiliki parameter bahwafetch
tidak:-s <strategy>
,-Xsubtree=...
yang merupakan penting bagi saya, jadi ini bukan pengganti yang setara. Saya memiliki masalah yang dijelaskan di sini: congruityservice.com/blog/… tetapi dalam kasus saya, saya tidak ingin melakukan pembayaran sama sekali.git pull <remote> <srcBranch>:<destBranch>
.git fetch . origin/master:master
Saya memiliki masalah yang sama dengan keharusan untuk melakukan atau menyimpan perubahan fitur saat ini, checkout cabang master , lakukan
pull
perintah, dapatkan semuanya dari jarak jauh kemaster
ruang kerja lokal , lalu beralih lagi ke cabang fitur dan lakukan arebase
untuk memperbaruinya menguasai.Untuk menyelesaikan semua ini, pertahankan ruang kerja di cabang fitur dan hindari semua peralihan, saya melakukan ini:
git fetch origin master:master
git rebase master
Dan itu melakukan trik dengan baik.
sumber
feature
dan SEMUA yang ingin Anda lakukan adalah memperbarui lokal Andamaster
agar sejalan dengan asal, TANPA menyentuhfeature
, lakukan sajagit fetch origin master:master
... dan seolah-olah Anda melakukannya stash-checkoutMaster-pull-checkoutFeature-stashPop!git merge origin/master
Jika Anda ingin tip cabang lokal diarahkan kembali setelahnya
git fetch
, Anda memerlukan beberapa langkah tambahan.Lebih konkret, misalkan github repo memiliki cabang
D
,B
,C
, danmaster
(alasan untuk ini aneh cabang-nama-set akan jelas sebentar lagi). Anda berada di hostdevhost
dan Anda berada di repo di manaorigin
repo github. Anda lakukangit fetch
, yang membawa lebih dari semua benda dan updateorigin/D
,origin/B
,origin/C
, danorigin/master
. Sejauh ini baik. Tapi sekarang Anda mengatakan Anda ingin sesuatu terjadi, padadevhost
, untuk lokal cabangD
,B
,C
, dan / ataumaster
?Saya memiliki pertanyaan yang jelas (bagi saya) ini:
B
) memiliki komit yang tidak dimiliki repo jarak jauh (github)? Haruskah mereka digabungkan, di-rebased, atau ...?C
) Dan direktori kerja dan / atau indeks diubah tetapi tidak dikomit?A
) dan / atau cabang dihapus (D
)?Jika jawaban untuk (1) adalah "karena
devhost
sebenarnya bukan untuk pengembangan, melainkan cermin lokal yang hanya menyimpan salinan repo github yang tersedia secara lokal sehingga semua pengembang aktual kami dapat membacanya dengan cepat daripada membaca perlahan dari github ", maka Anda menginginkan repo" mirror "daripada" normal ". Seharusnya tidak memiliki direktori kerja, dan mungkin juga tidak boleh menerima dorongan, dalam hal ini pertanyaan yang tersisa akan hilang begitu saja.Jika ada jawaban lain, (2-4) menjadi bermasalah.
Bagaimanapun, berikut adalah cara untuk menangani pembaruan referensi lokal berdasarkan referensi jarak jauh (setelah berjalan
git fetch -p
misalnya):Apa yang ada di
... code here ...
bagian ini tergantung pada jawaban atas pertanyaan (2-4).sumber
Menggunakan
sebagai gantinya. Ini memperbarui referensi dan objek jarak jauh di repo Anda, tetapi meninggalkan cabang lokal, HEAD dan worktree saja.
sumber
EDIT: Gunakan 'git pull' Ini akan mengambil semua cabang dari repo dan Juga memperbarui ke terbaru jika cabang keluar pada sistem lokal hanya untuk cabang saat ini. Catatan: git pull sama dengan fetch + merge yang mengambil semua cabang tetapi hanya menggabungkan cabang saat ini.
sumber
pull
melakukan pengambilan (yang, ya, mengambil semuanya dari jarak jauh) tetapi kemudian hanya menggabungkan cabang saat ini .