วิธีผสานต้นแบบระยะไกลเข้ากับสาขาในพื้นที่


238

ฉันมีสาขาในท้องถิ่นของโครงการ ("configUpdate") ที่ฉันได้แยกจากโครงการของคนอื่นและฉันได้ทำการเปลี่ยนแปลงหลายอย่างแล้วและต้องการที่จะรวมการเปลี่ยนแปลงที่พวกเขาทำกับสาขาท้องถิ่นของฉัน

ฉันพยายามแล้ว

git pull --rebase origin configUpdate

แต่มันไม่ได้คว้าการเปลี่ยนแปลงล่าสุด - ฉันจะรวมสองสิ่งนี้เข้าด้วยกันได้อย่างไร (เช่นเดียวกับคะแนนโบนัสฉันทำอะไรกับpull --rebaseคำสั่ง)


สำเนาซ้ำที่เป็นไปได้ของGit: ผสานสาขาระยะไกลภายในเครื่อง
Michael Freidgeim

คำตอบ:


354

จากสาขาคุณลักษณะของคุณ (เช่นconfigUpdate) รัน:

git fetch
git rebase origin/master

หรือแบบฟอร์มที่สั้นกว่า:

git pull --rebase

ทำไมจึงใช้งานได้:

  • git merge branchnameใช้ความมุ่งมั่นใหม่จากสาขาbranchnameและเพิ่มเข้าไปในสาขาปัจจุบัน หากจำเป็นระบบจะเพิ่มคำสั่ง "ผสาน" โดยอัตโนมัติ

  • git rebase branchnameใช้ความมุ่งมั่นใหม่จากสาขาbranchnameและแทรกพวกเขา "ภายใต้" การเปลี่ยนแปลงของคุณ ยิ่งไปกว่านั้นมันจะปรับเปลี่ยนประวัติของสาขาปัจจุบันเช่นว่ามันจะขึ้นอยู่กับส่วนปลายของbranchnameกับการเปลี่ยนแปลงใด ๆ ที่คุณทำด้านบนของที่

  • git pullgit fetch; git merge origin/masterเป็นพื้นเดียวกับ

  • git pull --rebasegit fetch; git rebase origin/masterเป็นพื้นเดียวกับ

ดังนั้นเหตุผลที่คุณต้องการใช้git pull --rebaseมากกว่าgit pull? นี่คือตัวอย่างง่ายๆ:

  • คุณเริ่มทำงานกับคุณสมบัติใหม่

  • เมื่อถึงเวลาที่คุณพร้อมที่จะผลักดันการเปลี่ยนแปลงของคุณนักพัฒนารายอื่น ๆ ก็มุ่งมั่นทุ่มเท

  • หากคุณgit pull(ซึ่งใช้การผสาน) การเปลี่ยนแปลงของคุณจะถูกฝังโดยคอมมิทใหม่นอกเหนือจากการคอมมิทที่สร้างโดยอัตโนมัติ

  • หากคุณgit pull --rebaseแทน git จะส่งต่อต้นแบบของคุณไปยังต้นน้ำอย่างรวดเร็วจากนั้นใช้การเปลี่ยนแปลงของคุณที่ด้านบน


ฉันทำสิ่งนี้ในสาขาที่ถูกต้อง แต่ฉันยังสามารถเห็นความแตกต่างระหว่างไฟล์ในเครื่องของฉันและสาขาต้นแบบระยะไกลของโครงการดั้งเดิม (แม้ว่ามันจะบอกว่าทุกอย่างทันสมัย!) บางทีฉันอาจตั้งโครงการไม่ถูกต้อง? มีวิธีตรวจสอบอย่างไร?
Martyn

1
@Martyn: ความแตกต่างควรจะเป็นการเปลี่ยนแปลงในท้องถิ่นของคุณ ทำการแยกสาขาระยะไกลอื่นและตรวจสอบว่าอันนั้นมีเนื้อหาไฟล์ที่ถูกต้อง
ZeissS

4
ฉันรู้ว่านี่เป็นคำตอบที่เก่า แต่โปรดทราบว่าคุณอาจต้องการทำ MERGE แทนการ rebase คุณไม่ต้องการทำการ rebase ในภายหลังถ้าคุณจะต้องรวมกับ repo ระยะไกลที่มีการเปลี่ยนแปลงของคุณอยู่แล้ว
Domino

1
วิธีการเกี่ยวกับ (สมมติว่าคุณอยู่ใน configUpdate สาขา) ... ดึง git นั้นโดยทั่วไปเหมือนกับ git fetch; คอมไพล์แหล่งกำเนิด / ต้นแบบ <- ไม่ใช่เรื่องจริง
คริส

@Chris: ในแง่ใดมันไม่เป็นความจริง? สมมติฐานของต้นกำเนิด / ต้นแบบเป็นต้นน้ำ? หรือมีการเปลี่ยนแปลง git pull?
Joey Adams

81

ฉันพบว่ามันคือ:

$ git fetch upstream
$ git merge upstream/master

6
ดังนั้นหากคุณยังไม่ได้ระบุออกมาคุณpull --rebaseก็ไม่ทำงานเพราะoriginชี้ไปที่ส้อมของคุณ git pull --rebase upstream/masterมันจะได้ทำงานถ้าคุณไม่ได้ทำ
Karl Bielefeldt

3
ลอง: คอมไพล์ต้นกำเนิด / ต้นแบบ
คริส

คำตอบนี้แก้ให้ฉันแล้ว
nurettin

38

เปลี่ยนเป็นสาขาใกล้บ้าน

> git checkout configUpdate

ผสานต้นแบบระยะไกลเข้ากับสาขาของคุณ

> git rebase master configUpdate

ในกรณีที่คุณมีข้อขัดแย้งใด ๆ ให้แก้ไขคำสั่งเหล่านั้นและสำหรับแต่ละไฟล์ที่ขัดแย้งกันให้ทำคำสั่ง

> git add [path_to_file / ขัดแย้งted_file] (เช่น git เพิ่มแอป / สินทรัพย์ / javascripts / test.js)

รีบูตต่อไป

> git rebase - ยุติ


ไม่ต้องกลัวที่จะใช้ rebase แทนการผสานใช้จ่ายบางเวลาการตรวจสอบความแตกต่างถ้าคุณรู้สึกว่าช่องว่างในคำถามนี้
เสิร์จ Seletskyy

13

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

git checkout <local_branch>
git merge <master> 

หากคุณเป็นมือใหม่อย่างฉันนี่เป็นบทความที่ดีเกี่ยวกับ git merge vs git rebase https://www.atlassian.com/git/tutorials/merging-vs-rebasing

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