git ganti versi lokal dengan versi jarak jauh

148

Bagaimana saya bisa memberitahu git untuk mengabaikan file lokal saya dan mengambil yang dari cabang jarak jauh saya tanpa mencoba untuk menggabungkan dan menyebabkan konflik?

irama
sumber
1
Lihat SO jawab " perintah git untuk membuat satu cabang seperti yang lain " untuk semua cara yang mungkin saat ini untuk mensimulasikangit merge -s their .
VonC
Akan sangat membantu jika Anda bisa memberikan lebih banyak detail. Apakah Anda ingin mengadopsi konten semua file dari cabang jarak jauh, atau hanya beberapa file (yaitu menyimpan beberapa versi / perubahan lokal)? Apakah Anda memiliki riwayat lokal yang ingin Anda simpan? (Ini mungkin penting jika ada cabang atau repositori lain yang telah memasukkan sejarah lokal Anda.) Jika Anda ingin menyimpan sejarah lokal Anda, apa yang Anda rencanakan untuk dilakukan nanti? (Anda dapat meninggalkan tag yang menunjuk ke sejarah lokal dan setel ulang cabang Anda ke apa yang dimiliki jarak jauh, atau Anda mungkin ingin "menggabungkannya").
Chris Johnsen

Jawaban:

169

Ini adalah solusi teraman:

git stash

Sekarang Anda dapat melakukan apa pun yang Anda inginkan tanpa takut akan konflik.

Misalnya:

git checkout origin/master

Jika Anda ingin menyertakan perubahan jarak jauh di cabang master yang dapat Anda lakukan:

git reset --hard origin/master

Ini akan membuat Anda bercabang "master" untuk menunjuk ke "asal / master".

Olivier Verdier
sumber
90
Mungkin perlu menunjukkan bahwa ini akan melepaskan KEPALA - penanya mungkin lebih memilih untuk tetap di cabang dengangit stash; git fetch origin; git reset --hard origin/master
Mark Longair
10
Saya pikir komentar Mark Longair adalah jawaban aktual untuk pertanyaan ini
itu adalah jawaban paling berguna bagi saya +1
Andres
Bagaimana cara kembali ke negara sebelum git stash? git stash listkosong.
Leo
Saya ingin memeluk Anda
Ugur Kazdal
45

Saya mengerti pertanyaannya seperti ini: Anda ingin sepenuhnya mengganti konten dari satu file (atau pilihan) dari hulu. Anda tidak ingin memengaruhi indeks secara langsung (jadi Anda harus melalui add + commit seperti biasa).

Lakukan saja

git checkout remote/branch -- a/file b/another/file

Jika Anda ingin melakukan ini untuk subtrees yang luas dan alih-alih ingin memengaruhi indeks, gunakan secara langsung

git read-tree remote/branch:subdir/

Anda kemudian dapat (secara opsional) memperbarui copy pekerjaan Anda dengan melakukan

git checkout-index -u --force
lihat
sumber
2
Inilah yang saya inginkan. Terima kasih.
AutonomousApps
11

Pemahaman saya adalah bahwa, misalnya, Anda salah menyimpan file yang telah Anda perbarui hanya untuk tujuan pengujian. Kemudian, ketika Anda menjalankan "git status" file tersebut muncul sebagai "Dimodifikasi" dan Anda mengucapkan beberapa kata-kata buruk. Anda hanya ingin versi lama kembali dan terus bekerja secara normal.

Dalam skenario itu, Anda bisa menjalankan perintah berikut:

git checkout -- path/filename
Almir Campos
sumber
10

Saya akan checkout file jarak jauh dari "master" (repositori remote / asal) seperti ini:

git checkout master <FileWithPath>

Contoh: komponen master checkout git / indexTest.html

Birol Efe
sumber
Bagi saya bekerja seperti ini "git checkout remote / origin / master <my-file>"
saravanakumar
4

Gunakan opsi -satau --strategydikombinasikan dengan -Xopsi. Dalam pertanyaan spesifik Anda, Anda ingin menyimpan semua file jarak jauh dan mengganti file lokal dengan nama yang sama.

Ganti konflik dengan versi jarak jauh

git merge -s recursive -Xtheirs upstream/master  

akan menggunakan versi repo jarak jauh dari semua file yang bertentangan.

Ganti konflik dengan versi lokal

git merge -s recursive -Xours upstream/master

akan menggunakan versi repo lokal dari semua file yang bertentangan.

csi
sumber