Bagaimana cara menarik file dari jarak jauh tanpa menimpa file lokal?

113

Saya mencoba menyiapkan repo git baru ke repo jarak jauh yang sudah ada sebelumnya.

Saya ingin file lokal saya menimpa repo jarak jauh, tetapi git mengatakan bahwa pertama-tama saya harus menarik file jarak jauh itu dan menggabungkannya.

Apakah ada cara untuk menarik tetapi memastikan bahwa file lokal tidak ditimpa oleh remote?

Joe Isaacson
sumber

Jawaban:

182

Ya, dan tidak ...

Saya mengerti bahwa Anda ingin salinan lokal Anda untuk "menimpa" apa yang ada di remote, tapi, oh, man, jika seseorang telah memodifikasi file di repo jarak jauh dengan cara yang berbeda , dan Anda mengabaikan perubahan mereka dan mencoba untuk "memaksa" perubahan Anda sendiri tanpa melihat kemungkinan konflik, yah, saya menangis untuk Anda (dan rekan kerja Anda) ;-)

Namun demikian, sangat mudah untuk melakukan "hal yang benar ..."

Langkah 1:

git stash

di repo lokal Anda. Itu akan menyimpan pembaruan lokal Anda ke dalam simpanan, kemudian mengembalikan file Anda yang dimodifikasi kembali ke status pra-edit.

Langkah 2:

git pull

untuk mendapatkan versi yang dimodifikasi. Sekarang, mudah-mudahan, itu tidak akan mendapatkan versi baru dari file yang Anda khawatirkan. Jika tidak, maka langkah selanjutnya akan bekerja dengan lancar. Jika tidak , maka Anda punya beberapa pekerjaan yang harus dilakukan, dan Anda akan senang Anda lakukan.

Langkah 3:

git stash pop

Itu akan menggabungkan versi modifikasi yang Anda simpan di Langkah 1 dengan versi yang baru saja Anda tarik di Langkah 2. Jika semuanya berjalan lancar, Anda akan siap!

Sebaliknya, jika ada konflik nyata antara apa yang Anda tarik di Langkah 2 dan modifikasi Anda (karena ada orang lain yang mengedit untuk sementara), Anda akan mengetahuinya dan diberitahu untuk menyelesaikannya. Lakukan.

Segala sesuatunya akan berjalan jauh lebih baik dengan cara ini - ini mungkin akan menyimpan perubahan Anda tanpa ada upaya nyata di pihak Anda, sambil mengingatkan Anda tentang masalah serius dan serius.

Bob Gilmore
sumber
5
mengapa tidak hanya git commitperubahan lokal sebelumnya git pull?
Don Cheadle
10
Kadang-kadang saya dalam posisi di mana saya tidak ingin memasukkan kode, tetapi saya ingin menyimpannya di mesin lokal saya, kumpulan perintah ini sangat membantu untuk ini.
Vargan
3
Ini tidak berguna jika Anda memiliki banyak file, beberapa di antaranya ingin Anda timpa dan beberapa tidak ingin Anda timpa. Apakah tidak ada cara untuk memberi tahu GIT mengabaikan file saat ditarik? Mengapa .gitignore hanya berfungsi untuk mendorong, saya sama sekali tidak mengerti keputusan desain itu ...
Bobak Hashemi
25

Anda dapat menyimpan perubahan lokal Anda terlebih dahulu, lalu menarik, lalu meletuskan simpanan.

git stash
git pull origin master
git stash pop

Apa pun yang menimpa perubahan dari jarak jauh akan mengalami konflik yang harus Anda selesaikan secara manual.

Ryan Bigg
sumber
4
Saya telah melakukan perubahan ini secara lokal sehingga dikatakan "tidak ada perubahan lokal yang perlu disimpan"
Joe Isaacson
Saya pikir, ini adalah strategi terbaik.
Jimmy Obonyo Abor
13

Jadi Anda telah berkomitmen terhadap perubahan lokal Anda ke repositori lokal Anda. Kemudian untuk mendapatkan perubahan jarak jauh ke repositori lokal Anda tanpa membuat perubahan pada file lokal Anda, Anda dapat menggunakan git fetch. Sebenarnya git pulladalah operasi dua langkah: non-destruktif git fetchdiikuti oleh a git merge. Lihat Apa perbedaan antara 'git pull' dan 'git fetch'? untuk diskusi lebih lanjut.

Contoh rinci:

Misalkan repositori Anda seperti ini (Anda telah membuat perubahan test2:

* ed0bcb2 - (HEAD, master) test2
* 4942854 - (origin/master, origin/HEAD) first

Dan originrepositori seperti ini (orang lain telah berkomitmen test1):

* 5437ca5 - (HEAD, master) test1
* 4942854 - first

Pada titik ini, git akan mengeluh dan meminta Anda untuk menariknya terlebih dahulu jika Anda mencoba mendorong test2ke repositori jarak jauh. Jika Anda ingin melihat apa itu test1 tanpa mengubah repositori lokal Anda, jalankan ini:

$ git fetch

Repositori lokal hasil Anda akan seperti ini:

* ed0bcb2 - (HEAD, master) test2 
| * 5437ca5 - (origin/master, origin/HEAD) test1 
|/  
* 4942854 - first 

Sekarang Anda memiliki perubahan jarak jauh di cabang lain, dan Anda tetap menyimpan file lokal Anda.

Lalu apa selanjutnya? Anda dapat melakukan git merge, yang akan memiliki efek yang sama seperti git pull(jika digabungkan dengan sebelumnya git fetch), atau, seperti yang saya inginkan, lakukan a git rebase origin/masteruntuk menerapkan perubahan Anda di atas origin/master, yang memberi Anda riwayat yang lebih bersih.

Penghe Geng
sumber
terima kasih telah menjelaskan git pull sebagai git fetch / git merge dua langkah
cdabel