GIT ผสานข้อมูลหลักเข้ากับสาขา


48

ฉันได้พัฒนาฟีเจอร์ใหม่ในสาขาใหม่และที่ด้านข้างมีการเปลี่ยนแปลงเล็กน้อยในสาขาหลักของฉัน

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


คุณลอง git-merge แล้วหรือยัง? ความช่วยเหลือที่นี่
karatedog

คำตอบ:


55

คุณสามารถgit merge masterหรือgit rebase masterในกรณีนี้ผมต้องการrebase คอมไพล์

เพราะgit rebaseทำให้มันราวกับว่าการเปลี่ยนแปลงในสาขาคุณลักษณะที่ทำอยู่ด้านบนของการเปลี่ยนแปลงในสาขาหลักซึ่งทำให้กราฟรุ่นง่ายขึ้น

การยกตัวอย่างเช่นจากคู่มือการคอมไพล์ rebase , git rebase masterสาขาfeature:

      A---B---C feature                             A'--B'--C' feature
     /                   --rebase-->               /
D---E---F---G master                  D---E---F---G master

อย่างไรก็ตามgit rebaseจะเหมาะสมเมื่อสาขาไม่ได้ถูกกระจายเท่านั้นหรือจะมีความสับสนและการทำงานพิเศษต่อเนื่องเนื่องจากตอนเก่า A, B, C ถูกแทนที่ด้วยคอมมิทใหม่ A 'B', C 'และ F และ G ที่ไม่เคยมีมาก่อน

ผลลัพธ์ที่แท้จริงหลังจากgit rebase masterอยู่ในสาขาfeatureคือ:

      ( A---B---C )
       /
      /       A'--B'--C' feature
     /       /
D---E---F---G master

commits A, B, C จะห้อยหลังจาก rebase git reflog featureแต่จะผ่านเข้าถึงได้

หากมีใครดึงสาขาของคุณหรือคุณผลักไปที่ไหนสักแห่งคุณควรรวมเข้าไปในสาขานั้นแทนเพื่อหลีกเลี่ยงความสับสนและทำงานพิเศษในส่วนอื่น ๆ ดูการกู้คืนจาก rebase

นี่คือผลลัพธ์ของgit merge masterในสาขาfeature:

      A---B---C feature                    A---B---C---M feature
     /                   --merge-->       /       ,---’
D---E---F---G master                 D---E---F---G master

หรือหากคุณgit merge featureอยู่ในสาขาmasterก็จะมีลักษณะเช่นนี้:

      A---B---C feature                    A---B---C feature
     /                   --merge-->       /         \
D---E---F---G master                 D---E---F---G---M master

คุณควรอธิบายว่าทำไมคุณถึงชอบ rebase และความแตกต่างคืออะไร Rebase สร้างประวัติเชิงเส้นซึ่งอาจไม่เหมาะกับคำถามนี้
Andreas Rehm

ตกลงถ้าฉันเข้าใจดี: ฉันต้องชำระเงินที่สาขาหลักหากคุณสมบัติใหม่ยังไม่เสร็จและการลดราคาถ้ามันเสร็จแล้ว?
mnml

ไม่เมื่อสาขาคุณลักษณะชำระเงินแล้วให้ทำgit rebase masterและมันจะ "รีบูต" การเปลี่ยนแปลงในฟีเจอร์สาขาเพื่อให้พวกเขา "อิง" กับการเปลี่ยนแปลงในสาขาหลัก หากการเปลี่ยนแปลงในสาขาหลักขัดแย้งกับการเปลี่ยนแปลงในฟีเจอร์สาขา git จะขอให้คุณแก้ไขและดำเนินการต่อข้ามหรือยกเลิก หากคุณไม่แน่ใจคุณสามารถเช็คเอาต์สาขาทดสอบเพื่อลองด้วยgit checkout -b test-feature feature(สมมติว่าฟีเจอร์สาขาของคุณชื่อ "ฟีเจอร์")
Christoffer Hammarström

ฉันทำ rebase ของฉันเสร็จแล้ว แต่ตอนนี้เมื่อฉันดึงจากคอมพิวเตอร์เครื่องอื่นฉันไม่เห็นสาขาของฉันอีกต่อไป: ฉันได้ทำการเช็คเอาต์ newfeature / git rebase master แล้ว
mnml

2
คุณหมายถึง "ไม่เห็นสาขาของฉันอีกต่อไป" อย่างไรก็ตามgit rebaseควรจะใช้เฉพาะในกรณีที่สาขาไม่ได้รับการกระจายซึ่งฉันคิดว่าเป็นกรณีเนื่องจากคุณบอกว่ามันเป็นสาขาใหม่ขออภัยเกี่ยวกับเรื่องนี้ ดูที่การกู้คืนจากการรีสตรีม rebaseในเอกสารที่ฉันลิงก์ไว้ คุณจะต้องใช้git mergeแทน และคุณสามารถใช้git reflogเพื่อค้นหาส่วนหัวสาขาฟีเจอร์ก่อนหน้าของคุณหากคุณต้องการเรียกคืน
Christoffer Hammarström
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.