แก้ไขข้อขัดแย้งโดยใช้การเปลี่ยนแปลงรีโมตเมื่อดึงจากรีโมต Git


297

ฉันกำลังพยายามดึงรหัสจาก GitHub repo ของฉันไปยังเซิร์ฟเวอร์ของฉัน แต่การดึงนั้นล้มเหลวเนื่องจากการผสานที่ขัดแย้งกัน ฉันไม่ต้องการเก็บการเปลี่ยนแปลงใด ๆ ที่อาจเกิดขึ้นบนเซิร์ฟเวอร์ในพื้นที่ของฉันตั้งแต่การดึงครั้งล่าสุด

ดังนั้นมีวิธีที่ฉันสามารถบังคับให้ Git เขียนทับด้วยเวอร์ชันใดก็ตามที่อยู่ใน GitHub แทนที่จะรบกวนฉันเกี่ยวกับความขัดแย้ง?



4
@nvm: ไม่ นี่เป็นเรื่องเกี่ยวกับความขัดแย้งที่เกิดขึ้นจริงไม่ใช่ไฟล์ที่ไม่ได้ติดตามซึ่งจะถูกเขียนทับ
Cascabel

คำตอบ:


491

หากคุณต้องการทิ้งข้อผูกพันที่คุณทำไว้ในพื้นที่อย่างแท้จริงนั่นคือไม่เคยมีพวกมันในประวัติศาสตร์อีกเลยคุณไม่ได้ถามวิธีการดึง - pull หมายถึงการรวมและคุณไม่จำเป็นต้องรวม สิ่งที่คุณต้องทำคือ:

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

ฉันขอแนะนำให้คุณสร้างสาขาสำรองที่ HEAD ปัจจุบันของคุณก่อนเพื่อที่ว่าหากคุณรู้ว่านี่เป็นความคิดที่ไม่ดีคุณก็จะไม่หลงทางเลย

หากในอีกทางหนึ่งคุณต้องการรักษาการกระทำเหล่านั้นและทำให้มันดูราวกับว่าคุณผสานกับต้นกำเนิดและทำให้การผสานเพื่อป้องกันเวอร์ชันจากจุดเริ่มต้นเท่านั้นคุณสามารถใช้oursกลยุทธ์การผสาน:

# 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

1
ในบล็อกที่สองของคำสั่ง git มี .. ควรจะมี 'git fetch origin' หลังจากคำสั่งที่สองหรือไม่
David Tuite

@ David: ใช่คุณควรดึงข้อมูลจากแหล่งกำเนิดในบางจุด ขออภัยฉันถือว่าเป็นนัย
Cascabel

2
ไม่มีอะไรที่สามารถบอกเป็นนัยได้เมื่อมันมาถึงฉันและคอมไพล์ ;-) อย่างจริงจังว่าขอบคุณล้าน คำตอบของคุณคือสิ่งที่ฉันกำลังมองหา
David Tuite

1
จะใช้งานได้ถ้าแหล่งกำเนิดอยู่ข้างหน้าจริงหรือ เช่นเดียวกับในฉันสามารถใช้มันได้หรือไม่ถ้าฉันไม่มีข้อผูกมัดใด ๆ ข้างหน้าและในความเป็นจริงสาขาสามารถส่งต่อได้อย่างรวดเร็ว?
Jared Forsyth

1
ขอบคุณ! ทำให้มันดูง่าย
sholsinger

137

คุณสามารถใช้คำตอบจากลิงค์ซ้ำที่ชี้โดย nvm

หรือคุณสามารถแก้ไขข้อขัดแย้งโดยใช้การเปลี่ยนแปลง (แต่การเปลี่ยนแปลงบางอย่างของคุณอาจถูกเก็บไว้หากพวกเขาไม่ขัดแย้งกับรุ่นระยะไกล):

git pull -s recursive -X theirs

3
ดูเหมือนจะไม่ได้ผลสำหรับฉัน ฉันได้รับ "ข้อผิดพลาด: สวิตช์ที่ไม่รู้จัก` X '"โดยใช้ git git เวอร์ชั่น 1.5.6.5 ฉันต้องอัพเกรดเป็นเวอร์ชั่นที่ไม่เสถียรหรือไม่?
David Tuite

นอกจากนี้แอนทอนถ้าคุณต้องการที่จะนำทุกสิ่งในเวอร์ชั่นดั้งเดิมไม่ใช่เนื้อหาที่ขัดแย้งคุณสามารถ - ดูคำตอบของฉัน
Cascabel

2
@David คุณสามารถรับ git สำหรับเดเบียนรุ่นล่าสุดได้จากbackports.debian.org
Arrowmaster

2
นี่คือสิ่งที่ฉันกำลังมองหา!
micahblu

2
@CeesTimmerman ไม่จริงอย่างน้อยก็ในคอมไพล์ล่าสุด Xตัวเลือกถูกส่งผ่านไปยังการผสานกลยุทธ์ซึ่งก็ต่อrecursiveเมื่อการรวมสองหัวดังนั้นคำสั่งของคุณจะบ่น"Could not find merge strategy 'theirs'. Available strategies are: octopus ours recursive resolve subtree."- มันเป็นความอัปยศเพราะXสามารถตั้งค่าใน config (เช่นgit config pull.twohead theirs) แต่sไม่สามารถทำได้
OJFord
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.