Apa perbedaan antara git pull
dan git fetch
?
git
version-control
git-pull
git-fetch
pupeno
sumber
sumber
git fetch; git reset --hard origin/master
bagian dari alur kerja kami. Itu membuat perubahan lokal, membuat Anda tetap up to date dengan master TAPI memastikan Anda tidak hanya melakukan perubahan baru di atas perubahan saat ini dan membuat berantakan. Kami telah menggunakannya untuk sementara waktu dan pada dasarnya terasa jauh lebih aman dalam praktik. Pastikan untuk menambahkan / melakukan / simpanan pekerjaan apa pun yang sedang berjalan terlebih dahulu!Jawaban:
Secara sederhana,
git pull
apakahgit fetch
diikuti oleh agit merge
.Anda dapat melakukan
git fetch
kapan saja untuk memperbarui cabang pelacakan jarak jauh di bawahrefs/remotes/<remote>/
.Operasi ini tidak pernah mengubah salah satu cabang lokal Anda di bawah
refs/heads
, dan aman untuk dilakukan tanpa mengubah copy pekerjaan Anda. Saya bahkan pernah mendengar ada orang yang menjalankangit fetch
tugas cron secara berkala di latar belakang (walaupun saya tidak akan merekomendasikan hal ini).A
git pull
adalah apa yang akan Anda lakukan untuk memperbarui cabang lokal dengan versi jarak jauh, sekaligus memperbarui cabang pelacakan jarak jauh lainnya.Dokumentasi git - tarik git :
sumber
git pull
akan selalu bergabung ke cabang saat ini . Jadi Anda pilih cabang yang Anda ingin menarik dari , dan menariknya ke dalam cabang saat ini. The dari cabang dapat lokal atau remote; bahkan bisa berupa cabang jarak jauh yang bukan terdaftargit remote
(artinya Anda meneruskan URL digit pull
baris perintah)./home/alice/
dan lakukangit fetch /home/bob
, parameter apa yang harus saya sampaikan ke yang berikutnyagit merge
?pull
sebenarnya tidak dapat ditiru oleh nilaifetch
tambah amerge
. Saya baru saja mengambil perubahan di mana hanya penunjuk cabang jarak jauh berubah, danmerge
menolak untuk melakukan apa pun.pull
, di sisi lain, maju cepat cabang pelacakan saya.Ketika Anda menggunakan
pull
, Git mencoba melakukan pekerjaan Anda secara otomatis untuk Anda. Ini peka konteks , jadi Git akan menggabungkan komit yang ditarik ke dalam cabang tempat Anda bekerja saat ini. Menggabungkan komitpull
secara otomatis tanpa membiarkan Anda memeriksanya terlebih dahulu . Jika Anda tidak mengelola cabang dengan cermat, Anda mungkin sering mengalami konflik.Saat Anda
fetch
, Git mengumpulkan komit 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 memperbarui repositori Anda, tetapi sedang mengerjakan sesuatu yang mungkin rusak jika Anda memperbarui file Anda. Untuk mengintegrasikan komit ke cabang master Anda, Anda gunakanmerge
.sumber
git fetch
hanya memperbarui.git/
direktori Anda (AKA: repositori lokal) dan tidak ada di luar.git/
(AKA: working tree). Itu tidak mengubah cabang lokal Anda, dan itu tidak menyentuhmaster
baik. Menyentuhremotes/origin/master
meskipun (lihatgit branch -avv
). Jika Anda memiliki lebih banyak remote, cobagit remote update
. Ini adalahgit fetch
untuk semua remote di satu perintah..git/refs/remotes/origin/
..git
? Apa manfaat yang dimaksudkan dan apa yang harus saya lakukan setelah itu?Penting untuk membandingkan filosofi desain git dengan filosofi alat kontrol sumber yang lebih tradisional seperti SVN.
Subversion dirancang dan dibangun dengan model klien / server. Ada satu repositori yang merupakan server, dan beberapa klien dapat mengambil kode dari server, mengerjakannya, lalu mengkomitnya kembali ke server. Asumsinya adalah bahwa klien selalu dapat menghubungi server ketika perlu melakukan operasi.
Git dirancang untuk mendukung model yang lebih terdistribusi tanpa perlu repositori pusat (meskipun Anda tentu bisa menggunakannya jika mau). Juga git dirancang agar klien dan "server" tidak perlu online pada saat bersamaan. Git dirancang agar orang-orang di tautan yang tidak bisa diandalkan bisa bertukar kode melalui email, bahkan. Dimungkinkan untuk bekerja sepenuhnya terputus dan membakar CD untuk bertukar kode melalui git.
Untuk mendukung model ini, git mengelola repositori lokal dengan kode Anda dan juga repositori lokal tambahan yang mencerminkan keadaan repositori jarak jauh. Dengan menyimpan salinan repositori jarak jauh secara lokal, git dapat mengetahui perubahan yang diperlukan bahkan ketika repositori jarak 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 fetch
adalah perintah yang mengatakan "perbarui salinan lokal saya dari repositori jarak jauh."git pull
mengatakan "bawa perubahan di repositori jarak jauh ke tempat saya menyimpan kode saya sendiri."Biasanya
git pull
melakukan ini dengan melakukan agit fetch
untuk membuat salinan lokal repositori jarak jauh up to date, dan kemudian menggabungkan perubahan ke dalam repositori kode Anda sendiri dan mungkin juga copy pekerjaan Anda.Cara mengambilnya adalah dengan mengingat bahwa sering ada setidaknya tiga salinan proyek di workstation Anda. Satu salinan adalah repositori Anda sendiri dengan riwayat komit Anda sendiri. Salinan kedua adalah copy pekerjaan Anda di mana Anda mengedit dan membangun. Salinan ketiga adalah salinan "cached" lokal Anda dari repositori jarak jauh.
sumber
remoteName/
Git dari bawah ke atas adalah bacaan yang sangat bagus. Setelah Anda memahami bagaimana Git bekerja - dan ini sangat sederhana , sungguh - semuanya masuk akal.Berikut ini adalah gambar Oliver Steele tentang bagaimana semuanya cocok :
Jika ada minat yang cukup, saya kira saya dapat memperbarui gambar untuk ditambahkan
git clone
dangit merge
...sumber
git clone
dangit merge
akan sangat membantu!git merge
- ini harus dengan jelas menunjukkan bahwamerge
memanggil secara terpisah TIDAK sama dengan meneleponpull
karenapull
hanya menggabungkan dari jarak jauh dan mengabaikan komit lokal Anda di cabang lokal Anda yang melacak cabang jarak jauh yang ditarik.Satu kasus penggunaan
git fetch
adalah bahwa yang berikut ini akan memberi tahu Anda perubahan di cabang jarak jauh sejak penarikan terakhir Anda ... sehingga Anda dapat memeriksa sebelum melakukan penarikan yang sebenarnya, yang dapat mengubah file di cabang Anda saat ini dan copy pekerjaan.Lihat: https://git-scm.com/docs/git-diff tentang sintaks double dan triple-dot dalam perintah diff
sumber
git diff ..origin
?git diff ...origin
setara dengangit diff $(git-merge-base HEAD origin) origin
(lihatgit diff [--options] <commit>...<commit> [--] [<path>…]
bagian kernel.org/pub/software/scm/git/docs/git-diff.html#_description ), yang berbeda darigit diff origin
;git diff ...origin
secara konseptual perubahan yang dibuatorigin
sejak cabang saat ini bercabangorigin
, sementaragit diff origin
juga termasuk kebalikan dari perubahan yang dibuat di cabang saat ini sejak cabang itu bercabangorigin
.git diff origin/master
berfungsi, seperti yang disebutkan di bawah iniSaya perlu sedikit biaya untuk memahami apa bedanya, tetapi ini adalah penjelasan sederhana.
master
di localhost Anda adalah cabang.Ketika Anda mengkloning repositori Anda mengambil seluruh repositori untuk host lokal Anda. Ini berarti bahwa pada saat itu Anda memiliki pointer asal / master
HEAD
dan master menunjuk ke yang samaHEAD
.ketika Anda mulai bekerja dan melakukan komit Anda memajukan pointer master ke
HEAD
+ komit Anda. Tetapi pointer asal / master masih menunjuk ke apa itu ketika Anda dikloning.Jadi perbedaannya adalah:
git fetch
ia hanya akan mengambil semua perubahan di repositori jarak jauh ( GitHub ) dan memindahkan pointer asal / master keHEAD
. Sementara itu, master cabang lokal Anda akan terus menunjuk ke tempatnya.git pull
, itu pada dasarnya akan mengambil (seperti yang dijelaskan sebelumnya) dan menggabungkan setiap perubahan baru ke cabang master Anda dan memindahkan pointer keHEAD
.sumber
git fetch
benar-benar mengunduh perubahan pada repo jarak jauh ke repo lokal Anda, tetapi BUKAN melakukan itu - yaitu, mereka masih perlu ditambahkan / berkomitmen untuk repo lokal Anda.Terkadang representasi visual membantu.
sumber
git pull
sedang melompat-lompat pengambilan, yang tentu saja tidak akurat.Secara singkat
git fetch
mirip denganpull
tetapi tidak bergabung. yaitu mengambil pembaruan jarak jauh (refs
danobjects
) tetapi lokal Anda tetap sama (yaituorigin/master
diperbarui tetapimaster
tetap sama).git pull
menarik turun dari jarak jauh dan langsung menyatu.Lebih
git clone
klon repo.git rebase
menyimpan barang-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. Jadi,git pull -rebase
akan menarik perubahan jarak jauh, memundurkan cabang lokal Anda, memutar ulang perubahan Anda dari atas cabang Anda saat ini satu per satu sampai Anda mutakhir.Juga,
git branch -a
akan menunjukkan dengan tepat apa yang terjadi dengan semua cabang Anda - lokal dan jarak jauh.Posting blog ini bermanfaat:
Perbedaan antara tarikan git, git ambil dan git klon (dan git rebase) - Mike Pearce
dan selimut
git pull
,git fetch
,git clone
dangit rebase
.====
MEMPERBARUI
Saya pikir saya akan memperbarui ini untuk menunjukkan bagaimana Anda benar-benar menggunakannya dalam praktik.
Perbarui repo lokal Anda dari jarak jauh (tapi jangan gabung):
Setelah mengunduh pembaruan, mari kita lihat perbedaannya:
Jika Anda puas dengan pembaruan itu, gabungkan:
Catatan:
Pada langkah 2: Untuk informasi lebih lanjut tentang perbedaan antara local dan remote, lihat: Bagaimana cara membandingkan cabang git lokal dengan cabangnya yang jauh?
Pada langkah 3: Ini mungkin lebih akurat (mis. Pada repo yang cepat berubah) untuk melakukannya di
git rebase origin
sini. Lihat komentar @Justin Ohms di jawaban lain.Lihat juga: http://longair.net/blog/2009/04/16/git-fetch-and-merge/
sumber
git clone
. Saya memberi tip dalam tanda kutip, karena saya berasumsi itu akan berarti apa pun masternya dan apa yang seseorang "Unduh sebagai zip" dari github.comAnda akan menarik jika Anda ingin sejarah digabung, Anda akan mengambilnya jika Anda hanya 'ingin kodez' karena beberapa orang telah menandai beberapa artikel di sekitar sini.
sumber
git fetch
ia mengambil perubahan dari repositori dan memperbarui cabang jarak jauh lokal Anda. Itu tidak mempengaruhi cabang lokal Anda yang melacak cabang jauh lokal, jadi tidak mempengaruhi copy pekerjaan Anda. Sekarang, ketika Anda melakukanmerge
itu akan menggabungkan perubahan yang diambil dengan cabang lokal Anda.Anda dapat mengambil dari repositori jarak jauh, melihat perbedaannya lalu menarik atau menggabungkannya.
Ini adalah contoh untuk repositori jarak jauh yang disebut
origin
dan cabang yang disebutmaster
pelacakan cabang jarak jauhorigin/master
:sumber
Jawaban singkat dan mudah adalah yang
git pull
hanyagit fetch
diikuti olehgit merge
.Sangat penting untuk dicatat bahwa secara otomatis
git pull
akan menggabungkan apakah Anda suka atau tidak . Ini tentu saja dapat mengakibatkan penggabungan konflik. Katakanlah remote Anda adalahorigin
dan cabang Andamaster
. Jika Andagit diff origin/master
sebelum menarik, Anda harus memiliki beberapa ide tentang potensi konflik penggabungan dan dapat mempersiapkan cabang lokal Anda yang sesuai.Selain menarik dan mendorong, beberapa alur kerja melibatkan
git rebase
, seperti yang ini, yang saya kutip dari artikel terkait:Jika Anda menemukan diri Anda dalam situasi seperti itu, Anda mungkin tergoda
git pull --rebase
. Kecuali jika Anda benar-benar tahu apa yang Anda lakukan, saya akan menyarankan untuk tidak melakukannya. Peringatan ini dariman
halaman untukgit-pull
, versi2.3.5
:sumber
git pull --rebase
bukan hal yang benar dalam situasi yang diberikan, apakah benar jika dilakukan dalam dua langkah? Jika itu adalah hal yang benar untuk dilakukan, apa manfaat tambahan untuk melakukannya dalam dua langkah?rebase
saat Anda bekerja pada cabang lokal yang belum didorong. Jika Anda bekerja pada cabang yang ada di remote,rebase
dapat mengakibatkan beberapa masalah buruk sehingga Anda harus memilih yang biasamerge
.OK , berikut adalah beberapa informasi tentang
git pull
dangit fetch
, sehingga Anda dapat memahami perbedaan yang sebenarnya ... dalam beberapa kata sederhana, mengambil mendapat data terbaru, tetapi bukan perubahan kode dan tidak akan main-main dengan kode cabang lokal Anda saat ini, tetapi tarik get kode berubah dan menggabungkannya dengan cabang lokal Anda, baca terus untuk mendapatkan lebih detail tentang masing-masing:git fetch
Ini akan mengunduh semua referensi dan objek serta cabang baru ke Gudang lokal Anda ...
git pull
Ini akan menerapkan perubahan dari jarak jauh ke cabang saat ini di ...
Saya juga membuat visual di bawah ini untuk menunjukkan kepada Anda bagaimana
git fetch
dangit pull
bekerja bersama ...sumber
Representasi grafis interaktif ini sangat membantu dalam memahami git: http://ndpsoftware.com/git-cheatsheet.html
git fetch
cukup "unduh" perubahan dari jarak jauh ke repositori lokal Anda.git pull
mengunduh perubahan dan menggabungkannya ke cabang Anda saat ini. "Dalam mode standarnya,git pull
adalah singkatan untukgit fetch
diikuti olehgit merge FETCH_HEAD
."sumber
Bonus:
Dalam berbicara tentang menarik & mengambil jawaban di atas, saya ingin berbagi trik yang menarik,
git pull --rebase
Perintah di atas adalah perintah yang paling berguna dalam hidup git saya yang menghemat banyak waktu.
Sebelum mendorong komit baru Anda ke server, coba perintah ini dan itu akan secara otomatis menyinkronkan perubahan server terbaru (dengan mengambil + gabungan) dan akan menempatkan komit Anda di atas di log git. Tidak perlu khawatir tentang tarikan / penggabungan manual.
Temukan detailnya di: http://gitolite.com/git-pull--rebase
sumber
git pull
dangit pull --rebase
?Saya suka memiliki representasi visual dari situasi untuk memahami hal-hal ini. Mungkin pengembang lain juga ingin melihatnya, jadi inilah tambahan saya. Saya tidak sepenuhnya yakin bahwa semuanya benar, jadi silakan berkomentar jika Anda menemukan kesalahan.
Beberapa keuntungan utama karena memiliki mirror yang diambil dari remote adalah:
sumber
git pull
juga melakukan penggabungan, yaitu pergi ke copy pekerjaan?Saya telah berjuang dengan ini juga. Sebenarnya saya sampai di sini dengan pencarian google dari pertanyaan yang persis sama. Membaca semua jawaban ini akhirnya melukiskan gambar di kepala saya dan saya memutuskan untuk mencoba memahami keadaan 2 repositori dan 1 kotak pasir dan tindakan yang dilakukan dari waktu ke waktu sambil menonton versi mereka. Jadi inilah yang saya pikirkan. Harap perbaiki saya jika saya mengacau di mana saja.
Tiga repo dengan mengambil:
Tiga repo dengan tarikan
Ini membantu saya memahami mengapa pengambilan cukup penting.
sumber
Perbedaan antara Ambil GIT dan Tarik GIT dapat dijelaskan dengan skenario berikut: (Perlu diingat bahwa gambar berbicara lebih keras daripada kata-kata !, Saya telah memberikan representasi gambar)
Mari kita ambil contoh bahwa Anda sedang mengerjakan proyek dengan anggota tim Anda. Jadi mereka akan menjadi salah satu Cabang utama dari proyek dan semua kontributor harus membayarnya ke repositori lokal mereka sendiri dan kemudian bekerja di cabang lokal ini untuk memodifikasi / Menambahkan modul kemudian mendorong kembali ke cabang utama.
Jadi, Status Awal dari dua Cabang ketika Anda bercabang proyek utama pada repositori lokal Anda akan seperti ini- (
A
,B
danC
Modul sudah selesai dari proyek)Sekarang, Anda sudah mulai bekerja pada modul baru (misalkan
D
) dan ketika Anda telah menyelesaikanD
modul Anda ingin mendorongnya ke cabang utama, tetapi sementara itu yang terjadi adalah salah satu rekan tim Anda telah mengembangkan Modul baruE
,F
dan dimodifikasiC
.Jadi sekarang apa yang terjadi adalah bahwa repositori lokal Anda kurang di belakang kemajuan asli proyek dan dengan demikian mendorong perubahan Anda ke cabang utama dapat menyebabkan konflik dan dapat menyebabkan Modul Anda
D
tidak berfungsi.Untuk menghindari masalah-masalah seperti itu dan untuk bekerja secara paralel dengan kemajuan asli proyek mereka ada dua cara:
1. Git Fetch- Ini akan Mengunduh semua perubahan yang telah dilakukan pada proyek asal / cabang utama yang tidak ada di cabang lokal Anda. Dan akan menunggu perintah Git Merge untuk menerapkan perubahan yang telah diambil ke Repositori atau cabang Anda.
Jadi sekarang Anda dapat dengan hati-hati memonitor file sebelum menggabungkannya ke repositori Anda. Dan Anda juga dapat memodifikasi
D
jika diperlukan karena DimodifikasiC
.2. Git Pull - Ini akan memperbarui cabang lokal Anda dengan asal / cabang utama yaitu sebenarnya yang dilakukannya adalah kombinasi dari Git Fetch dan Git menggabungkan satu demi satu. Tetapi ini dapat Menyebabkan Konflik terjadi, jadi disarankan untuk menggunakan Git Pull dengan salinan bersih.
sumber
Kami hanya mengatakan:
Jika Anda menjalankan
git pull
, Anda tidak perlu menggabungkan data ke lokal. Jika Anda menjalankangit fetch
, itu berarti Anda harus menjalankangit merge
untuk mendapatkan kode terbaru ke mesin lokal Anda. Kalau tidak, kode mesin lokal tidak akan berubah tanpa penggabungan.Jadi di Git Gui, ketika Anda mengambil, Anda harus menggabungkan data. Ambil sendiri tidak akan membuat perubahan kode di lokal Anda. Anda dapat memeriksa bahwa ketika Anda memperbarui kode dengan mengambil sekali mengambil dan melihat; kode itu tidak akan berubah. Kemudian Anda menggabungkan ... Anda akan melihat kode yang diubah.
sumber
git pull == git fetch + git merge
:)git pull --rebase = git fetch + git rebase
git fetch
menarik kode dari server jarak jauh ke cabang pelacakan Anda di repositori lokal Anda. Jika remote bernamaorigin
(default) maka cabang tersebut akan berada dalamorigin/
, misalnyaorigin/master
,origin/mybranch-123
, dll Ini bukan cabang Anda saat ini, mereka adalah lokal salinan cabang-cabang dari server.git pull
tidakgit fetch
tetapi kemudian juga menggabungkan kode dari cabang pelacakan ke versi lokal Anda dari cabang itu. Jika Anda belum siap untuk perubahan itu,git fetch
pertama saja .sumber
git fetch
akan mengambil cabang jarak jauh sehingga Anda bisagit diff
ataugit merge
mereka dengan cabang saat ini.git pull
akan menjalankan pengambilan pada jarak jauh yang dilacak oleh cabang saat ini dan kemudian menggabungkan hasilnya. Anda dapat menggunakangit fetch
untuk melihat apakah ada pembaruan untuk cabang jarak jauh tanpa perlu menggabungkannya dengan cabang lokal Anda.sumber
Git Fetch
Anda mengunduh perubahan ke cabang lokal Anda dari asal hingga mengambil. Fetch meminta repo jarak jauh untuk semua komitmen yang dibuat orang lain tetapi Anda tidak memilikinya di repo lokal Anda. Ambil unduhan komit ini dan tambahkan ke repositori lokal.
Git Merge
Anda dapat menerapkan perubahan yang diunduh melalui pengambilan menggunakan perintah gabungan. Gabung akan mengambil komit yang diambil dari pengambilan dan mencoba menambahkannya ke cabang lokal Anda. Penggabungan akan menyimpan histori komit dari perubahan lokal Anda sehingga saat Anda berbagi cabang dengan push, Git akan tahu bagaimana orang lain dapat menggabungkan perubahan Anda.
Git Pull
Ambil dan gabungkan jalankan bersama cukup sering sehingga perintah yang menggabungkan keduanya, tarik, telah dibuat. Tarik mengambil dan kemudian menggabungkan untuk menambahkan komit yang diunduh ke cabang lokal Anda.
sumber
Satu-satunya perbedaan antara
git pull
dangit fetch
adalah:git pull
menarik dari cabang yang jauh dan menggabungkannya.git fetch
hanya mengambil dari cabang jarak jauh tetapi tidak bergabungyaitu git pull = git fetch + git merge ...
sumber
rm -rf
semuanya dan memulai dari awal. Bodoh Git, tolong biarkan saya mendapatkan yang terbaru sehingga saya dapat kembali bekerja?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 :
Dengan
git pull
:git merge
.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
.cd .git
. Ini jelas akan mengubah direktori Anda.ls
. Anda akan melihat daftar direktori. Kami sedang mencarirefs
. Lakukancd refs
.heads
danremotes
. Gunakancd
untuk memeriksa di dalamnya juga.git fetch
yang Anda lakukan akan memperbarui item dalam/.git/refs/remotes
direktori. Itu tidak akan memperbarui apa pun di/.git/refs/heads
direktori.git pull
pun yang pertama akan dilakukangit 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:
Jika master jarak jauh diperbarui Anda akan mendapatkan pesan seperti ini:
Jika Anda tidak
fetch
dan hanya melakukannyagit checkout master
maka git lokal Anda tidak akan tahu bahwa ada 2 komit yang ditambahkan. Dan itu hanya akan mengatakan: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 melakukannyagit pull
dari cabang jarak jauh.Kiat menyenangkan:
Jika Anda mengambil cabang jarak jauh misal:
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):
Anda tidak perlu lagi melakukan:
Untuk lebih lanjut baca di sini
sumber
Git memungkinkan komitmen yang lebih lama secara kronologis diterapkan setelah komitmen yang lebih baru. Karena itu, tindakan mentransfer komit antara repositori dibagi menjadi dua langkah:
Menyalin komitmen baru dari cabang jarak jauh untuk menyalin cabang jarak jauh ini di dalam repo lokal.
(operasi repo ke repo)
master@remote >> remote/origin/master@local
Mengintegrasikan komitmen baru ke cabang lokal
(operasi dalam-repo)
remote/origin/master@local >> master@local
Ada dua cara melakukan langkah 2. Anda bisa:
Dalam
git
terminologi, langkah 1 adalahgit fetch
, langkah 2 adalahgit merge
ataugit rebase
git pull
adalahgit fetch
dangit merge
sumber
Git mendapatkan cabang versi terbaru dari jarak jauh ke lokal menggunakan dua perintah:
git fetch: Git akan mendapatkan versi terbaru dari jarak jauh ke lokal, tetapi tidak secara otomatis bergabung.
git fetch origin master
git log -p master..origin/master
git merge origin/master
Perintah di atas berarti mengunduh versi terbaru dari cabang utama dari asal dari cabang master jarak jauh ke asal. Dan kemudian membandingkan cabang master lokal dan cabang master asal. Akhirnya, gabung.
git pull: Git akan mendapatkan versi terbaru dari jarak jauh dan bergabung ke lokal.
git pull origin master
Perintah di atas setara dengan
git fetch
dangit merge
. Dalam praktiknya,git fetch
mungkin lebih aman karena sebelum penggabungan kita dapat melihat perubahan dan memutuskan apakah akan bergabung.sumber
Untuk memahami hal ini, pertama-tama Anda perlu memahami bahwa git lokal Anda tidak hanya menyimpan repositori lokal Anda, tetapi juga memelihara salinan lokal repositori jarak jauh.
git fetch
membuat salinan lokal repositori jauh Anda terbarui. Misalnya, jika repositori jarak jauh Anda adalah GitHub - Anda mungkin ingin mengambil perubahan apa pun yang dibuat dalam repositori jarak jauh ke salinan lokal Anda dari repositori jauh itu. Ini akan memungkinkan Anda untuk melakukan operasi seperti membandingkan atau menggabungkan.git pull
di sisi lain akan membawa perubahan dalam repositori jarak jauh ke tempat Anda menyimpan kode Anda sendiri. Biasanya,git pull
akan melakukan yanggit fetch
pertama untuk membawa salinan lokal dari repositori jarak jauh, dan kemudian akan menggabungkan perubahan ke dalam repositori kode Anda sendiri dan mungkin juga copy pekerjaan Anda.sumber
git pull == (git fetch + git merge)
git fetch tidak berubah ke cabang lokal.
Jika Anda sudah memiliki repositori lokal dengan pengaturan jarak jauh untuk proyek yang diinginkan, Anda dapat mengambil semua cabang dan tag untuk jarak jauh yang ada menggunakan git fetch. ... Ambil tidak membuat perubahan apa pun pada cabang lokal, jadi Anda harus menggabungkan cabang jarak jauh dengan cabang lokal berpasangan untuk memasukkan perubahan yang baru diambil. dari github
sumber
Berusaha menjadi jelas dan sederhana.
Perintah git pull sebenarnya
shortcut
untuk pengambilan git diikuti oleh git merge atau perintah git rebase tergantung pada konfigurasi Anda. Anda dapat mengkonfigurasi repositori Git Anda sehingga git pull adalah pengambilan yang diikuti oleh rebase.sumber
Representasi Grafis sederhana untuk Pemula,
sini,
akan mengambil kode dari repositori dan rebase dengan lokal Anda ... di git pull ada kemungkinan komit baru dibuat.
tapi di,
git fetch
akan mengambil kode dari repositori dan kita perlu rebase secara manual dengan menggunakan
git rebase
misalnya: saya akan mengambil dari master server dan rebase di master lokal saya.
1) git pull (rebase akan dilakukan secara otomatis):
di sini asal adalah master repo jarak jauh Anda adalah cabang Anda
2) git fetch (perlu rebase secara manual):
itu akan mengambil perubahan server dari asal. dan itu akan berada di lokal Anda sampai Anda rebase sendiri. kita perlu memperbaiki konflik secara manual dengan memeriksa kode.
ini akan mengubah kode menjadi lokal. sebelum itu pastikan Anda berada di cabang kanan.
sumber
Sebenarnya Git menyimpan salinan kode Anda sendiri dan repositori jarak jauh.
Perintah ini
git fetch
membuat salinan lokal Anda mutakhir dengan mendapatkan data dari repositori jarak jauh. Alasan kami membutuhkan ini adalah karena orang lain mungkin telah membuat beberapa perubahan pada kode dan Anda ingin menjaga diri Anda diperbarui.Perintah
git pull
membawa perubahan di repositori jarak jauh ke tempat Anda menyimpan kode Anda sendiri. Biasanya,git pull
lakukan ini dengan melakukan 'git fetch' terlebih dahulu untuk membawa salinan lokal repositori jarak jauh, dan kemudian menggabungkan perubahan ke dalam repositori kode Anda sendiri dan mungkin juga copy pekerjaan Anda.sumber