Atasi konflik menggunakan perubahan jarak jauh saat menarik dari jarak jauh Git

297

Saya mencoba untuk menarik kode dari repo GitHub saya ke server saya, tetapi tarikannya terus gagal karena menggabungkan konflik. Saya tidak ingin menyimpan perubahan apa pun yang mungkin terjadi pada server lokal saya sejak penarikan terakhir.

Jadi adakah cara saya bisa memaksa Git untuk menimpa dengan versi apa pun di GitHub, daripada mengganggu saya tentang konflik?

David Tuite
sumber
4
@ nvm: Tidak. Ini tentang konflik gabungan nyata, bukan file yang tidak terlacak yang akan ditimpa.
Cascabel

Jawaban:

491

Jika Anda benar-benar ingin membuang komit yang Anda buat secara lokal, yaitu tidak pernah memilikinya dalam sejarah, Anda tidak akan bertanya cara menarik - tarikan berarti bergabung, dan Anda tidak perlu bergabung. Yang perlu Anda lakukan adalah ini:

# fetch from the default remote, origin
git fetch
# reset your current branch (master) to origin's master
git reset --hard origin/master

Saya pribadi merekomendasikan untuk membuat cabang cadangan di KEPALA Anda saat ini terlebih dahulu, sehingga jika Anda menyadari ini adalah ide yang buruk, Anda belum kehilangan jejaknya.

Jika di sisi lain, Anda ingin mempertahankan komit itu dan membuatnya tampak seolah-olah Anda digabungkan dengan asal, dan menyebabkan penggabungan untuk menjaga versi hanya dari asal, Anda bisa menggunakan oursstrategi gabungan:

# fetch from the default remote, origin
git fetch
# create a branch at your current master
git branch old-master
# reset to origin's master
git reset --hard origin/master
# merge your old master, keeping "our" (origin/master's) content
git merge -s ours old-master
Cascabel
sumber
1
Di blok kedua dari perintah git di sana .. haruskah ada 'git fetch origin' setelah perintah kedua?
David Tuite
@ David: Ya, Anda harus mengambil dari tempat asal di beberapa titik. Maaf, saya menganggapnya implisit.
Cascabel
2
Tidak ada yang dapat tersirat ketika datang kepada saya dan git ;-). Serius, terima kasih satu juta. Jawaban Anda persis seperti apa yang saya cari.
David Tuite
1
Apakah ini akan berhasil jika asal benar-benar di depan? seperti pada, dapatkah saya juga menggunakannya jika saya tidak memiliki komitmen di depan, dan bahkan cabang dapat diteruskan dengan cepat?
Jared Forsyth
1
Terima kasih! Membuatnya tampak mudah.
sholsinger
137

Anda bisa menggunakan jawaban dari tautan duplikat yang ditunjukkan oleh nvm.

Atau Anda dapat menyelesaikan konflik dengan menggunakan perubahannya (tetapi beberapa perubahan Anda mungkin disimpan jika tidak bertentangan dengan versi jarak jauh):

git pull -s recursive -X theirs
Antoine Pelisse
sumber
3
Sepertinya tidak bekerja untuk saya. Saya mendapatkan "error: switch` X '"yang tidak diketahui menggunakan git git versi 1.5.6.5. Apakah saya perlu meningkatkan ke versi yang tidak stabil?
David Tuite
Juga, Antoine, jika Anda ingin mengambil versi asli segala sesuatu, bukan hanya konten yang bertentangan, Anda dapat - lihat jawaban saya.
Cascabel
2
@ David Anda bisa mendapatkan versi git terbaru untuk debian dari backports.debian.org
Arrowmaster
2
Ini persis apa yang saya cari!
micahblu
2
@CeesTimmerman Tidak benar, setidaknya di git terbaru. XOpsi dilewatkan untuk menggabungkan strategi, yang hanya recursivejika menggabungkan dua kepala, sehingga perintah Anda akan mengeluh "Could not find merge strategy 'theirs'. Available strategies are: octopus ours recursive resolve subtree."- itu memalukan, karena Xdapat diatur dalam konfigurasi (misalnya git config pull.twohead theirs) tetapi stidak bisa.
OJFord