การรวม 2 สาขาเข้าด้วยกันใน GIT


132

ฉันเพิ่งเริ่มใช้ GIT และคิดว่ามันยอดเยี่ยม แต่ฉันก็สับสนเล็กน้อยว่าmergeคำสั่งทำอะไร

สมมติว่าเรามีโครงการทำงานในสาขา "A"

ฉันกลับบ้านและทำการเปลี่ยนแปลงสาขานี้และบันทึกเป็น "B" โปรแกรมเมอร์คนอื่นทำการเปลี่ยนแปลง "A" และบันทึกเป็น "C"

มีวิธีการรวมสองสาขา "B" และ "C" เข้าด้วยกันจากนั้นยอมรับการเปลี่ยนแปลงเป็นสาขาใหม่โดยพูดว่า "D" หรือไม่?

หรือฉันพลาดจุด "รวม"?


ไม่จำเป็นต้อง 'บันทึกการเปลี่ยนแปลง' ในสาขาอื่น ทำงาน A แล้วรวม A ที่แตกต่างกันเข้าด้วยกัน
knittl

ฉันไม่ทำตาม A จะอยู่ในเครื่องคอมพิวเตอร์ของฉัน dev1 จะมีสำเนา A ในคอมพิวเตอร์ของเขาและ dev2 มีสำเนา A ในคอมพิวเตอร์ของเขา นักพัฒนาทั้งสองทำการเปลี่ยนแปลงฉันจะรวมการเปลี่ยนแปลงเหล่านี้เข้าด้วยกันได้อย่างไร
dotty

ดู < kernel.org/pub/software/scm/git/docs/git-pull.html > ผู้พัฒนาอาจต้องพุช / อัปโหลดที่เก็บของพวกเขาก่อน
knittl

คำตอบ:


197

merge ใช้เพื่อนำสองสาขา (หรือมากกว่า) มารวมกัน

ตัวอย่างเล็กน้อย:

# on branch A:
# create new branch B
$ git checkout -b B
# hack hack
$ git commit -am "commit on branch B"

# create new branch C from A
$ git checkout -b C A
# hack hack
$ git commit -am "commit on branch C"

# go back to branch A
$ git checkout A
# hack hack
$ git commit -am "commit on branch A"

ดังนั้นตอนนี้จึงมีสามสาขาแยกกัน (ได้แก่ AB และ C) ที่มีหัวต่าง

เพื่อรับการเปลี่ยนแปลงจาก B และ C กลับไปที่ A ให้ชำระเงิน A (ทำไปแล้วในตัวอย่างนี้) จากนั้นใช้คำสั่ง merge:

# create an octopus merge
$ git merge B C

ประวัติของคุณจะมีลักษณะดังนี้:

…-o-o-x-------A
      |\     /|
      | B---/ |
       \     /
        C---/

หากคุณต้องการผสานข้ามพื้นที่เก็บข้อมูล / คอมพิวเตอร์ให้ดูที่git pullคำสั่งเช่นจากพีซีที่มีสาขา A (ตัวอย่างนี้จะสร้างการคอมมิตใหม่สองรายการ):

# pull branch B
$ git pull ssh://host/… B
# pull branch C
$ git pull ssh://host/… C

นั่นหมายความว่าทั้งสองสาขาเปลี่ยนรหัสชิ้นเดียวกัน แก้ไข conflitcs git add conflicting_filesแล้วgit commit
knittl

พูดว่าไฟล์ใน A มีคำว่า "สวัสดี" A แก้ไขเป็น "HELLO" และ B แก้ไขเป็น "Hello world" ผลของการรวมไฟล์เหล่านี้จะเป็นอย่างไร?
dotty

อ๊ะฉันหมายถึง B แก้ไขและ C แก้ไข
dotty

ระวังคำว่า 'แก้ไข' ที่หมายถึงสิ่งที่แตกต่างในคอมไพล์ (เปลี่ยนการกระทำที่มีอยู่) การเปลี่ยนไฟล์ 'hello' เป็น 'HELLO' ในด้านหนึ่งและ 'Hello World' ในอีกด้านหนึ่งจะทำให้เกิดข้อขัดแย้งในการผสาน
knittl

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

48

หากคุณต้องการผสานการเปลี่ยนแปลงในSubBranchเป็นMainBranch

  1. คุณควรอยู่ในสาขาหลัก git checkout MainBranch
  2. จากนั้นเรียกใช้คำสั่งผสาน git merge SubBranch

2
@luckytaxi: เห็นด้วยบางครั้งน้อยกว่ามาก
Marcelo Scofano

ฉันสามารถยกเลิกสิ่งนี้ได้หรือไม่
Yohanelly

0

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

สมมติว่าสาขาคุณลักษณะใหม่ถูกตรวจสอบจากต้นแบบที่มีการคอมมิต 2 ครั้งแล้ว

  • "เพิ่ม A", "เพิ่ม B"

Checkout a new feature_branch

  • "เพิ่ม C", "เพิ่ม D"

จากนั้นสาขาคุณลักษณะเพิ่มสองคอมมิต ->

  • "เพิ่ม E", "เพิ่ม F"

ใส่คำอธิบายภาพที่นี่

ตอนนี้ถ้าคุณต้องการรวมการเปลี่ยนแปลง feature_branch เป็น master ให้git merge feature_branchนั่งบนต้นแบบ

นี้จะเพิ่มกระทำทั้งหมดลงในสาขาต้นแบบ (4 + 2 หลักใน feature_branch = ทั้งหมด 6) + ผสานพิเศษกระทำบางอย่างเช่น'Merge branch 'feature_branch''เป็นหลักจะถูกแยกออก

ถ้าคุณต้องการจริงๆที่จะละเว้นกระทำเหล่านี้ (ผู้ที่ทำใน FB) และเพิ่มการเปลี่ยนแปลงทั้งหมดที่เกิดขึ้นใน feature_branch เป็นหนึ่งเดียวกระทำเช่นวิ่ง'Integrated feature branch changes into master'git merge feature_merge --no-commit

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

อ่านข้อมูลเพิ่มเติมได้ที่นี่: https://git-scm.com/docs/git-merge

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