Pertanyaan Apa perbedaan antara 'git pull' dan 'git fetch'?


Catatan Moderator: Mengingat bahwa pertanyaan ini sudah ada enam puluh empat jawaban diposting ke sana, pertimbangkan apakah Anda atau tidak menyumbangkan sesuatu yang baru sebelum memposting yang lain.

Apa perbedaan antara git pull dan git fetch?


10125
2017-11-15 09:51


asal


Jawaban:


Dalam istilah yang paling sederhana, git pull apakah a git fetch diikuti oleh git merge.

Anda dapat melakukan git fetch kapan saja untuk memperbarui cabang pelacakan jarak jauh Anda di bawah refs/remotes/<remote>/.

Operasi ini tidak pernah mengubah cabang lokal Anda sendiri di bawah refs/heads, dan aman untuk dilakukan tanpa mengubah copy pekerjaan Anda. Saya bahkan pernah mendengar orang-orang berlarian git fetch secara berkala dalam tugas cron di latar belakang (meskipun saya tidak akan merekomendasikan melakukan hal ini).

SEBUAH git pull adalah apa yang akan Anda lakukan untuk membawa cabang lokal terbaru dengan versi jarak jauhnya, sambil memperbarui cabang pelacak jarak jauh Anda yang lain.

Dokumentasi Git: git pull


8455
2017-11-15 09:52



  • Ketika Anda menggunakan pull, Git mencoba untuk secara otomatis melakukan pekerjaan Anda untuk Anda. Ini adalah konteks yang sensitif, jadi Git akan menggabungkan semua commit yang ditarik ke dalam cabang yang sedang Anda kerjakan. pull  secara otomatis menggabungkan komit tanpa membiarkan Anda meninjau mereka terlebih dahulu. Jika Anda tidak mengelola cabang Anda dengan ketat, Anda mungkin sering mengalami konflik.

  • Ketika kamu fetch, Git mengumpulkan setiap commit dari cabang target yang tidak ada di cabang Anda saat ini dan menyimpannya di repositori lokal Anda. Namun, itu tidak menggabungkan mereka dengan cabang Anda saat ini. Ini sangat berguna jika Anda perlu menjaga repositori Anda tetap terbaru, tetapi sedang mengerjakan sesuatu yang mungkin rusak jika Anda memperbarui file Anda. Untuk mengintegrasikan commit ke dalam cabang master Anda, Anda gunakan merge.


1849
2017-08-18 08:53



Penting untuk membedakan filosofi desain git dengan filosofi alat kontrol sumber yang lebih tradisional seperti SVN.

Subversion dirancang dan dibangun dengan model klien / server. Ada satu repositori yaitu server, dan beberapa klien dapat mengambil kode dari server, mengerjakannya, lalu mengembalikannya ke server. Asumsinya adalah bahwa klien selalu dapat menghubungi server ketika perlu melakukan operasi.

Git dirancang untuk mendukung model yang lebih terdistribusi tanpa membutuhkan repositori sentral (meskipun Anda pasti bisa menggunakannya jika Anda suka). Juga git dirancang sedemikian rupa sehingga klien dan "server" tidak perlu online pada saat yang sama. Git dirancang agar orang-orang di tautan yang tidak dapat diandalkan dapat bertukar kode melalui email, bahkan. Anda dapat bekerja dengan benar-benar terputus dan membakar CD untuk bertukar kode melalui git.

Untuk mendukung model ini, git memelihara repositori lokal dengan kode Anda dan juga repositori lokal tambahan yang mencerminkan status repositori jarak jauh. Dengan menyimpan salinan repositori jarak jauh secara lokal, git dapat mengetahui perubahan yang diperlukan bahkan ketika repositori jauh tidak dapat dijangkau. Kemudian ketika Anda perlu mengirim perubahan ke orang lain, git dapat mentransfernya sebagai satu set perubahan dari titik waktu yang dikenal ke repositori jarak jauh.

  • git fetchadalah perintah yang mengatakan "bawa salinan lokal saya dari repositori remote up up to date."

  • git pull mengatakan "bawa perubahan di repositori jarak jauh di mana saya menyimpan kode saya sendiri."

Biasanya git pull melakukan ini dengan melakukan git fetch untuk membawa salinan lokal dari repositori remote up-to-date, dan kemudian menggabungkan perubahan ke dalam repositori kode Anda sendiri dan mungkin copy pekerjaan Anda.

Yang diambil adalah untuk diingat bahwa sering ada setidaknya tiga salinan dari sebuah proyek di workstation Anda. Satu salinan adalah repositori Anda sendiri dengan sejarah komitmen Anda sendiri. Salinan kedua adalah copy pekerjaan Anda di mana Anda sedang mengedit dan membangun. Salinan ketiga adalah salinan "cache" lokal Anda dari repositori jarak jauh.


1007
2018-03-31 18:43



Disini adalah Gambaran Oliver Steele tentang bagaimana semua itu cocok bersama:

enter image description here

Jika ada minat yang cukup, saya kira saya bisa memperbarui gambar untuk ditambahkan git clone dan git merge...


660
2018-06-09 13:30



Satu kasus penggunaan git fetch adalah bahwa hal berikut akan memberi tahu Anda perubahan apa pun di cabang jarak jauh sejak tarikan terakhir Anda ... sehingga Anda dapat memeriksa sebelum melakukan tarikan yang sebenarnya, yang dapat mengubah file di cabang dan copy pekerjaan Anda saat ini.

git fetch
git diff ...origin

427
2018-05-07 19:23



Biayanya sedikit untuk memahami apa bedanya, tetapi ini adalah penjelasan sederhana. master di localhost Anda adalah cabang.

Ketika Anda mengkloning repositori Anda mengambil seluruh repositori ke host lokal Anda. Ini berarti bahwa pada saat itu Anda memiliki pointer asal / master HEAD dan guru menunjuk ke hal yang sama HEAD.

ketika Anda mulai bekerja dan melakukan commit Anda memajukan pointer master HEAD + komitmen Anda. Tapi pointer asal / master masih menunjuk ke apa itu ketika Anda dikloning.

Jadi perbedaannya adalah:

  • Jika Anda melakukan git fetch itu hanya akan mengambil semua perubahan dalam repositori jarak jauh (GitHub) dan memindahkan pointer asal / master ke HEAD. Sementara itu, master cabang lokal Anda akan terus menunjuk ke tempatnya.
  • Jika Anda melakukan git pull, pada dasarnya akan mengambil (seperti yang dijelaskan sebelumnya) dan menggabungkan setiap perubahan baru ke cabang master Anda dan memindahkan pointer ke HEAD.

341
2018-05-11 18:37



Terkadang representasi visual membantu.

enter image description here


179
2018-01-25 17:28



Secara singkat

git fetch mirip dengan pull tetapi tidak menyatu. yaitu mengambil pembaruan jarak jauh (refs dan objects) tetapi lokal Anda tetap sama (mis. origin/master diperbarui tetapi master tetap sama).

git pull menarik turun dari remote dan langsung menyatu.

Lebih

git clone klon repo.

git rebase menghemat barang dari cabang Anda saat ini yang tidak ada di cabang hulu ke area sementara. Cabang Anda sekarang sama dengan sebelum Anda memulai perubahan Anda. Begitu, git pull -rebase akan menarik perubahan jarak jauh, memundurkan cabang lokal Anda, memutar ulang perubahan Anda di atas cabang Anda saat ini satu per satu hingga Anda diperbarui.

Juga, git branch -a akan menunjukkan dengan tepat apa yang terjadi dengan semua cabang Anda - lokal dan jarak jauh.

Entri blog ini berguna:

Perbedaan antara git pull, git fetch dan git clone (dan git rebase) - Mike Pearce

dan selimut git pull, git fetch, git clone dan git rebase.

====

MEMPERBARUI

Saya pikir saya akan memperbarui ini untuk menunjukkan bagaimana Anda benar-benar menggunakan ini dalam praktek.

  1. Perbarui repo lokal Anda dari jarak jauh (tetapi jangan gabungkan):

    git fetch

  2. Setelah mengunduh pembaruan, mari kita lihat perbedaannya:

    git diff master asal / master

  3. Jika Anda senang dengan pembaruan tersebut, maka gabungkan:

    git pull

Catatan:

Pada langkah 2: Untuk lebih lanjut tentang diff antara lokal dan remote, lihat: bandingkan cabang git lokal dengan cabang jarak jauh?

Pada langkah 3: Ini mungkin lebih akurat (misalnya pada repo yang cepat berubah) untuk melakukan a git rebase origin sini. Lihat komentar @Justin Ohms dalam jawaban lain.

Lihat juga: http://longair.net/blog/2009/04/16/git-fetch-and-merge/ 


165
2018-04-13 17:31



git-pull - Ambil dari dan bergabung dengan repositori lain atau cabang lokal
RINGKASAN

git tarik ...
DESKRIPSI

Jalankan git-fetch dengan parameter yang diberikan, dan panggil git-merge untuk menggabungkan
diambil kepala (s) ke dalam cabang saat ini. Dengan --rebase, panggil git-rebase
bukannya git-merge.

Perhatikan bahwa Anda dapat menggunakan. (direktori saat ini) sebagai <repositori> untuk menarik
dari repositori lokal - ini berguna ketika menggabungkan cabang lokal
ke dalam cabang saat ini.

Perhatikan juga bahwa opsi dimaksudkan untuk git-pull sendiri dan penggabungan git yang mendasarinya
harus diberikan sebelum opsi yang dimaksudkan untuk git-fetch.

Anda akan menarik jika Anda ingin sejarah bergabung, Anda akan mengambil jika Anda hanya ingin kodez karena beberapa orang telah menandai beberapa artikel di sini.


155
2017-11-15 09:52



Anda dapat mengambil dari repositori jarak jauh, melihat perbedaan dan kemudian menarik atau menggabungkan.

Ini adalah contoh untuk repositori jarak jauh yang disebut origin dan cabang yang disebut master melacak cabang jarak jauh origin/master:

git checkout master                                                  
git fetch                                        
git diff origin/master
git rebase origin master

143
2018-03-21 11:07



Jawaban singkat dan mudah adalah itu git pull adalah secara sederhana git fetch diikuti oleh git merge.

Sangat penting untuk dicatat bahwa git pull akan secara otomatis menggabungkan apakah Anda suka atau tidak. Ini bisa, tentu saja, menghasilkan gabungan konflik. Katakanlah remote Anda origin dan cabang Anda master. Jika kamu git diff origin/master sebelum menarik, Anda harus memiliki beberapa ide potensi konflik gabungan dan bisa mempersiapkan cabang lokal Anda sesuai.

Selain menarik dan mendorong, beberapa alur kerja melibatkan git rebase, seperti yang ini, yang saya parase dari artikel terkait:

git pull origin master
git checkout foo-branch
git rebase master
git push origin foo-branch

Jika Anda berada dalam situasi seperti itu, Anda mungkin tergoda untuk melakukannya git pull --rebase. Kecuali Anda benar-benar tahu apa yang Anda lakukan, saya akan menyarankan hal itu. Peringatan ini berasal dari man halaman untuk git-pull, versi 2.3.5:

Ini adalah mode operasi yang berpotensi bahaya. Ini menulis ulang   sejarah, yang tidak menjadi pertanda baik ketika Anda menerbitkan sejarah itu   sudah. Jangan gunakan opsi ini kecuali Anda telah membaca git-rebase (1)   hati-hati.


132
2018-05-15 20:53