Secara sederhana, jika Anda akan naik ke pesawat tanpa koneksi internet ... sebelum berangkat Anda bisa melakukannya git fetch origin <master>. Itu akan mengambil semua perubahan ke komputer Anda, tetapi tetap terpisah dari pengembangan / ruang kerja lokal Anda.
Di pesawat, Anda bisa membuat perubahan pada ruang kerja lokal Anda dan kemudian menggabungkannya dengan apa yang telah Anda ambil dan menyelesaikan semua potensi konflik gabungan tanpa koneksi ke Internet. Dan kecuali seseorang telah membuat perubahan baru yang bertentangan pada repositori jarak jauh, maka begitu Anda tiba di tujuan, Anda akan melakukannya git push origin <branch>dan mengambil kopi Anda.
Dari tutorial Atlassian yang mengagumkan ini :
The git fetchperintah download komit, file, dan ref dari repositori jauh ke dalam repositori lokal Anda.
Mengambil adalah apa yang Anda lakukan ketika Anda ingin melihat apa yang telah dilakukan orang lain . Ini mirip dengan pembaruan SVN yang memungkinkan Anda melihat bagaimana sejarah pusat telah berkembang, tetapi itu tidak memaksa Anda untuk benar-benar menggabungkan perubahan ke dalam repositori Anda. Git mengisolasi mengambil konten sebagai dari konten lokal yang ada , itu sama sekali
tidak berpengaruh pada pekerjaan pengembangan lokal Anda . Konten yang diambil harus diperiksa secara eksplisit menggunakan git checkoutperintah. Ini membuat mengambil cara yang aman untuk meninjau komit sebelum mengintegrasikannya dengan repositori lokal Anda.
Saat mengunduh konten dari repositori jarak jauh, git pulldan git fetchperintah tersedia untuk menyelesaikan tugas. Anda dapat mempertimbangkan
git fetchversi 'aman' dari kedua perintah. Ini akan mengunduh konten jarak jauh, tetapi tidak memperbarui kondisi kerja repositori lokal Anda, membiarkan pekerjaan Anda saat ini tetap utuh. git pulladalah alternatif yang lebih agresif, ia akan mengunduh konten jarak jauh untuk cabang lokal aktif dan segera menjalankan git mergeuntuk membuat komit gabungan untuk konten jarak jauh yang baru. Jika Anda memiliki perubahan dalam proses yang tertunda ini akan menyebabkan konflik dan memulai aliran resolusi konflik gabungan.
Dengan git pull:
- Anda tidak mendapatkan isolasi.
- Ini memengaruhi perkembangan lokal Anda.
- Tidak perlu diperiksa secara eksplisit. Karena itu secara implisit melakukan a
git merge.
- Ini pada dasarnya TIDAK aman. Itu agresif.
- Tidak seperti yang
git fetchhanya memengaruhi Anda .git/refs/remotes, git pull akan memengaruhi Anda .git/refs/remotes dan .git/refs/heads/
Hmmm ... jadi jika saya tidak memperbarui copy pekerjaan git fetch, lalu di mana saya membuat perubahan? Di mana Git mengambil menyimpan komitmen baru?
Pertanyaan yang bagus Ini menempatkannya di suatu tempat yang terisolasi dari copy pekerjaan Anda. Tapi sekali lagi dimana? Ayo cari tahu.
Di direktori proyek Anda (yaitu, di mana Anda melakukan gitperintah Anda ) lakukan:
ls. Ini akan menampilkan file & direktori. Tidak ada yang keren, saya tahu.
Sekarang lakukan ls -a. Ini akan menunjukkan file dot , yaitu, file dimulai dengan .Anda kemudian akan dapat melihat sebuah direktori bernama: .git.
- Lakukan
cd .git. Ini jelas akan mengubah direktori Anda.
- Sekarang tiba bagian menyenangkan; lakukan
ls. Anda akan melihat daftar direktori. Kami sedang mencari refs. Lakukan cd refs.
- Sangat menarik untuk melihat apa yang ada di dalam semua direktori, tetapi mari kita fokus pada dua di antaranya.
headsdan remotes. Gunakan cduntuk memeriksa di dalamnya juga.
- Apa pun
git fetch yang Anda lakukan akan memperbarui item dalam /.git/refs/remotesdirektori. Itu tidak akan memperbarui apa pun di /.git/refs/headsdirektori.
- Apa
git pull pun yang pertama akan dilakukan git fetch, memperbarui item dalam /.git/refs/remotesdirektori, kemudian bergabung dengan lokal Anda dan kemudian mengubah kepala di dalam /.git/refs/headsdirektori.
Jawaban terkait yang sangat baik juga dapat ditemukan di Di mana 'git fetch' menempatkan dirinya? .
Juga, cari "Notasi garis miring " dari pos konvensi penamaan cabang Git . Ini membantu Anda lebih memahami bagaimana Git menempatkan berbagai hal di direktori yang berbeda.
Untuk melihat perbedaan yang sebenarnya
Kerjakan saja:
git fetch origin master
git checkout master
Jika master jarak jauh diperbarui Anda akan mendapatkan pesan seperti ini:
Your branch is behind 'origin/master' by 2 commits, and can be fast-forwarded.
(use "git pull" to update your local branch)
Jika Anda tidak fetchdan hanya melakukannya git checkout mastermaka git lokal Anda tidak akan tahu bahwa ada 2 komit yang ditambahkan. Dan itu hanya akan mengatakan:
Already on 'master'
Your branch is up to date with 'origin/master'.
Tapi itu sudah ketinggalan zaman dan salah. Itu karena git akan memberi Anda umpan balik hanya berdasarkan apa yang diketahuinya. Tidak menyadari komitmen baru yang belum ditarik ...
Apakah ada cara untuk melihat perubahan baru yang dibuat di remote saat bekerja di cabang secara lokal?
Beberapa IDE (mis. Xcode) super pintar dan menggunakan hasil dari a git fetchdan dapat memberi anotasi pada baris kode yang telah diubah di cabang jauh dari cabang kerja Anda saat ini. Jika garis itu telah diubah oleh perubahan lokal dan cabang jarak jauh, maka garis itu akan ditandai dengan warna merah. Ini bukan konflik gabungan. Ini potensi konflik penggabungan. Ini adalah headup yang bisa Anda gunakan untuk menyelesaikan konflik penggabungan di masa mendatang sebelum melakukannya git pulldari cabang jarak jauh.

Kiat menyenangkan:
Jika Anda mengambil cabang jarak jauh misal:
git fetch origin feature/123
Maka ini akan masuk ke direktori remote Anda. Itu masih belum tersedia untuk direktori lokal Anda. Namun, ini menyederhanakan checkout Anda ke cabang jauh dengan DWIM (Lakukan apa yang saya maksud):
git checkout feature/123
Anda tidak perlu lagi melakukan:
git checkout -b feature/123 origin/feature/123
Untuk lebih lanjut baca di sini