Git pull tanpa checkout?

133

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.

Diana Saunders
sumber
6
git fetchharus melakukan apa yang kamu inginkan.
Brad
11
git fetchakan 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.)
2
Saya tidak begitu mengerti ... apakah semua orang menggunakan repositori lokal yang sama di server dev? Itukah alasan Anda tidak ingin berpindah cabang? Mengapa tidak semua orang membuat klon pribadi mereka sendiri yang dapat mereka kerjakan? Lihat juga git: memperbarui cabang lokal tanpa memeriksanya? .

Jawaban:

221

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>

koral
sumber
Apakah ada cara untuk menggunakan cabang upstream daripada menentukan cabang sumber?
cambunctious
Sayangnya, tetapi pullmemiliki parameter bahwa fetchtidak: -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.
Andry
2
Mengingat pertanyaannya adalah tentang tarikan, tampaknya jawabannya seharusnya git pull <remote> <srcBranch>:<destBranch>.
J Woodchuck
Jika komit sudah ada di repositori lokal Anda:git fetch . origin/master:master
Evan
74

Saya memiliki masalah yang sama dengan keharusan untuk melakukan atau menyimpan perubahan fitur saat ini, checkout cabang master , lakukan pullperintah, dapatkan semuanya dari jarak jauh ke masterruang kerja lokal , lalu beralih lagi ke cabang fitur dan lakukan a rebaseuntuk 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.

Marcin TP Łuczyński
sumber
19
Ini adalah saran yang bagus tetapi mengubur lede: sesuai jawaban di bawah, jika Anda aktif featuredan SEMUA yang ingin Anda lakukan adalah memperbarui lokal Anda masteragar sejalan dengan asal, TANPA menyentuh feature, lakukan saja git fetch origin master:master... dan seolah-olah Anda melakukannya stash-checkoutMaster-pull-checkoutFeature-stashPop!
Btown
7
Untuk menggabungkan master asal ke cabang lokal Anda, Anda tidak perlu menarik master lokal. Anda dapat menggunakan git merge origin/master
Dan
-1

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, dan master(alasan untuk ini aneh cabang-nama-set akan jelas sebentar lagi). Anda berada di host devhostdan Anda berada di repo di mana originrepo github. Anda lakukan git fetch, yang membawa lebih dari semua benda dan update origin/D, origin/B, origin/C, dan origin/master. Sejauh ini baik. Tapi sekarang Anda mengatakan Anda ingin sesuatu terjadi, pada devhost, untuk lokal cabang D, B, C, dan / atau master?

Saya memiliki pertanyaan yang jelas (bagi saya) ini:

  1. Mengapa Anda ingin tips dari semua cabang diperbarui?
  2. Bagaimana jika beberapa cabang (misalnya, B) memiliki komit yang tidak dimiliki repo jarak jauh (github)? Haruskah mereka digabungkan, di-rebased, atau ...?
  3. Bagaimana jika Anda berada di beberapa cabang (mis., C) Dan direktori kerja dan / atau indeks diubah tetapi tidak dikomit?
  4. Bagaimana jika repo jarak jauh memiliki cabang baru yang ditambahkan ( A) dan / atau cabang dihapus ( D)?

Jika jawaban untuk (1) adalah "karena devhostsebenarnya 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 -pmisalnya):

for ref in $(git for-each-ref refs/remotes/origin/ --format '%(refname)'); do
    local=${ref#refs/remotes/origin/}
    ... code here ...
done

Apa yang ada di ... code here ...bagian ini tergantung pada jawaban atas pertanyaan (2-4).

torek
sumber
-5

Menggunakan

git fetch

sebagai gantinya. Ini memperbarui referensi dan objek jarak jauh di repo Anda, tetapi meninggalkan cabang lokal, HEAD dan worktree saja.

SzG
sumber
17
Tetapi itu tidak memperbarui cabang lokal dari server pengembangannya ... itu hanya menyegarkan cabang "asal" di folder git itu, yang sesuai dengan repo github penanya.
ANeves
1
Atau, jika Anda menginginkan versi saya dari masalah: Saya ingin menggabungkan cabang kerja saya dengan "master", dan bukan dengan "origin / master of ssh: // bla bla bla". Melakukan pengambilan akan memperbarui asal / master, tetapi tidak akan memperbarui master.
ANeves
-6

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.

Anuj Aneja
sumber
6
Lebih baik dikatakan: pullmelakukan pengambilan (yang, ya, mengambil semuanya dari jarak jauh) tetapi kemudian hanya menggabungkan cabang saat ini .
torek
Tidak ada pelanggaran yang dimaksudkan dengan downvote saya, saya tahu bahwa apa yang Anda katakan itu benar dan faktual, dan OP memang meminta konfirmasi tentang apa yang dilakukan tarikan (dan Anda telah memberinya penjelasan itu), tetapi itu tidak membahas inti dari apa yang dia cari: Apakah ada cara untuk memperbarui salah satu cabang lokal Anda ke komit terbaru di cabang jarak jauh yang terkait tanpa harus memeriksa cabang terlebih dahulu.
Gurce