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 fetch
perintah 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 checkout
perintah. Ini membuat mengambil cara yang aman untuk meninjau komit sebelum mengintegrasikannya dengan repositori lokal Anda.
Saat mengunduh konten dari repositori jarak jauh, git pull
dan git fetch
perintah tersedia untuk menyelesaikan tugas. Anda dapat mempertimbangkan
git fetch
versi '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 pull
adalah alternatif yang lebih agresif, ia akan mengunduh konten jarak jauh untuk cabang lokal aktif dan segera menjalankan git merge
untuk 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 fetch
hanya 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 git
perintah 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.
heads
dan remotes
. Gunakan cd
untuk memeriksa di dalamnya juga.
- Apa pun
git fetch
yang Anda lakukan akan memperbarui item dalam /.git/refs/remotes
direktori. Itu tidak akan memperbarui apa pun di /.git/refs/heads
direktori.
- Apa
git pull
pun yang pertama akan dilakukan git fetch
, memperbarui item dalam /.git/refs/remotes
direktori, kemudian bergabung dengan lokal Anda dan kemudian mengubah kepala di dalam /.git/refs/heads
direktori.
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 fetch
dan hanya melakukannya git checkout master
maka 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 fetch
dan 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 pull
dari 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