git แทนที่รุ่นท้องถิ่นด้วยรุ่นระยะไกล


148

ฉันจะบอก git ให้เพิกเฉยต่อไฟล์ในเครื่องของฉันและนำไปใช้จากสาขาระยะไกลของฉันโดยไม่พยายามผสานและก่อให้เกิดความขัดแย้งได้อย่างไร


1
ดูดังนั้นคำตอบ " คำสั่งคอมไพล์สำหรับการทำสาขาหนึ่งเช่นอีก " สำหรับทุกวิธีที่เป็นไปในปัจจุบันเพื่อจำลอง git merge -s their
VonC

มันจะมีประโยชน์หากคุณสามารถให้รายละเอียดเพิ่มเติมได้ คุณต้องการนำเนื้อหาของไฟล์ทั้งหมดจากสาขาระยะไกลหรือเพียงแค่บางไฟล์ (เช่นเก็บรุ่น / การเปลี่ยนแปลงในเครื่อง) คุณมีประวัติท้องถิ่นที่คุณต้องการเก็บไว้หรือไม่? (สิ่งนี้อาจมีความสำคัญหากมีสาขาหรือที่เก็บอื่น ๆ ที่รวมประวัติท้องถิ่นของคุณไว้แล้ว) หากคุณต้องการเก็บประวัติท้องถิ่นของคุณคุณวางแผนจะทำอะไรในภายหลัง (คุณสามารถปล่อยให้แท็กชี้ไปที่ประวัติศาสตร์ท้องถิ่นและเพียงแค่รีเซ็ตสาขาของคุณเป็นสิ่งที่มีระยะไกลหรือคุณอาจต้องการ "ผสานพวกเขา")
Chris Johnsen

คำตอบ:


169

นี่คือทางออกที่ปลอดภัยที่สุด:

git stash

ตอนนี้คุณสามารถทำสิ่งที่คุณต้องการโดยไม่ต้องกลัวความขัดแย้ง

ตัวอย่างเช่น

git checkout origin/master

หากคุณต้องการรวมการเปลี่ยนแปลงระยะไกลในสาขาหลักคุณสามารถทำได้:

git reset --hard origin/master

สิ่งนี้จะทำให้คุณสาขา "master" ให้ชี้ไปที่ "origin / master"


90
มันอาจจะคุ้มค่าที่ชี้ให้เห็นว่าสิ่งนี้จะแยก HEAD - ผู้ถามอาจต้องการอยู่ในสาขาด้วยgit stash; git fetch origin; git reset --hard origin/master
Mark Longair

10
ฉันคิดว่าความคิดเห็นของ Mark Longair คือคำตอบที่แท้จริงสำหรับคำถามนี้

มันเป็นคำตอบที่มีประโยชน์ที่สุดสำหรับฉัน +1
Andres

จะกลับไปยังสถานะก่อนหน้าได้git stashอย่างไร git stash listมันว่างเปล่า.
Leo

ฉันต้องการกอดคุณ
Ugur Kazdal

45

ฉันเข้าใจคำถามเช่นนี้: คุณต้องการแทนที่เนื้อหาของไฟล์เดียว (หรือส่วนที่เลือก) ทั้งหมดจากอัปสตรีม คุณไม่ต้องการที่จะส่งผลกระทบต่อดัชนีโดยตรง (ดังนั้นคุณจะต้องเพิ่ม + กระทำตามปกติ)

เพียงทำ

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

หากคุณต้องการทำเช่นนี้เพื่อ subtrees กว้างขวางและต้องการที่จะส่งผลกระทบต่อดัชนีใช้โดยตรง

git read-tree remote/branch:subdir/

จากนั้นคุณสามารถอัปเดตสำเนาการทำงานของคุณ (เลือกทำ)

git checkout-index -u --force

2
นี่คือสิ่งที่ฉันต้องการ ขอบคุณ
AutonomousApps

11

ความเข้าใจของฉันคือว่าคุณบันทึกไฟล์ที่คุณอัปเดตผิดเพื่อการทดสอบเท่านั้น จากนั้นเมื่อคุณเรียกใช้ "สถานะ git" ไฟล์จะปรากฏเป็น "แก้ไข" และคุณพูดคำที่ไม่เหมาะสม คุณเพียงแค่ต้องการให้เวอร์ชันเก่ากลับมาและทำงานได้ตามปกติ

ในสถานการณ์นั้นคุณสามารถรันคำสั่งต่อไปนี้:

git checkout -- path/filename

10

ฉันจะเช็คเอาท์ไฟล์ระยะไกลจาก "ต้นแบบ" (ที่เก็บระยะไกล / แหล่งกำเนิด) เช่นนี้:

git checkout master <FileWithPath>

ตัวอย่าง: git checkout master components / indexTest.html


สำหรับฉันทำงานเช่นนี้ "git รีโมตเช็คเอาต์ git / origin / master <my-file>"
saravanakumar

4

ใช้ตัวเลือก-sหรือ--strategyรวมกับ-Xตัวเลือก ในคำถามเฉพาะของคุณคุณต้องการเก็บไฟล์รีโมตทั้งหมดและแทนที่ไฟล์โลคัลที่มีชื่อเดียวกัน

แทนที่ข้อขัดแย้งด้วยรุ่นระยะไกล

git merge -s recursive -Xtheirs upstream/master  

จะใช้เวอร์ชัน repo ระยะไกลของไฟล์ที่ขัดแย้งทั้งหมด

แทนที่ข้อขัดแย้งด้วยรุ่นท้องถิ่น

git merge -s recursive -Xours upstream/master

จะใช้เวอร์ชั่น repo ท้องถิ่นของไฟล์ที่ขัดแย้งทั้งหมด

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.