รับการเปลี่ยนแปลงจากต้นแบบเป็นสาขาใน Git


691

ในที่เก็บของฉันฉันมีสาขาaqที่ฉันกำลังทำงานอยู่

masterจากนั้นผมก็มุ่งมั่นในการทำงานใหม่และข้อบกพร่องใน

อะไรคือวิธีที่ดีที่สุดในการทำให้คนเหล่านั้นผูกพันกับaqสาขา? สร้างสาขาใหม่จากmasterและรวมเข้าด้วยกันaqหรือไม่


3
ในอนาคตคุณสามารถเริ่มสาขาบั๊กของคุณจากบรรพบุรุษร่วมกันของมาสเตอร์และสาขาอื่น ๆ ที่จะต้องมีการแก้ไขเพื่อที่คุณจะสามารถรวมมันเข้าไปในสาขาทั้งหมดเหล่านั้นได้โดยไม่ต้องหยิบอะไรอีกเลย
Cascabel

2
@Jefromi แต่มันไม่สามารถควบคุมได้หากเขาไม่ใช่คนเดียวที่ทำงานในโครงการ คนอื่นอัปเดตต้นแบบ นรกคุณเองอาจอัปเดตต้นแบบจากสาขาที่สามและสถานการณ์จะหลีกเลี่ยงไม่ได้และต้องการโซลูชันทั่วไป
ahnbizcad

@ahnbizcad ฉันค่อนข้างแน่ใจว่าเขาเป็นผู้ควบคุมที่เขาเริ่มสาขาของตัวเอง หากสาขาของเขาเป็นบรรพบุรุษร่วมกันของสาขาที่เขาต้องการรวมเข้าด้วยกันและผู้คนเพิ่มเข้าไปในสาขาเหล่านั้นก็จะยังคงเป็นบรรพบุรุษร่วมกัน
Cascabel

พวกคำถาม, ทำตามคำสั่งนี้หรือไม่git pull origin my_branch_name
Basheer AL-MOMANI

คำตอบ:


795

ตรวจสอบaqสาขาและ rebase masterจาก

git checkout aq
git rebase master

rebase สามารถมาจากสาขาอื่นได้หรือไม่ กล่าวคือ คอมไพล์ rebase อื่น ๆ สาขา? ดูเหมือนว่าฉันจะเป็นคำถามเล็ก ๆ น้อย ๆ ของฉันฉันแยกจากสาขาแล้วทำการเปลี่ยนแปลงสาขาเดิม
Slee

2
ถ้าฉันถูกต้องให้รีบูตคำขอดึงมันจะแสดงความมุ่งมั่นทั้งหมด ถ้าคุณใช้ merge / origin master การกระทำหลักทั้งหมดจะแสดงเป็น 1 คอมมิชชันซึ่งทำให้ง่ายต่อการตรวจสอบโค้ด
ผู้ใช้ Foo Bar

4
บางครั้งgit mergeจะดีกว่า หากทั้งสองสาขาวิวัฒนาการไปตามกาลเวลาคุณควรพิจารณาว่าสาขาไหนดีที่สุดสำหรับคุณ
erick2red

70
ช่วงปลายไปงานเลี้ยง แต่นี้เป็นภาพรวมที่ดีเมื่อเทียบกับการ rebase ผสาน: atlassian.com/git/tutorials/merging-vs-rebasing/...
ebuat3989

7
หากการกระทำก่อนหน้าของคุณในสาขา aq เป็นสาธารณะอย่ารีบูต atlassian.com/git/tutorials/rewriting-history/git-rebase
Hanmant

301

คุณควรจะสามารถgit merge origin/masterเมื่อคุณอยู่ในสาขา aq ของคุณ

git checkout aq
git merge origin/master

55
หากการรีบูตเป็น“ ดีกว่า” ขึ้นอยู่กับสถานการณ์โดยเฉพาะ
Bombe

13
ทำไมคุณไม่เรียก "git merge master" แทน "git merge origin / master"
Michael Küller

145
ใช้ในกรณีที่สาขาของคุณอยู่ในท้องถิ่นและยังไม่ได้รับการผลักดันให้rebase originใช้mergeถ้าสาขาของคุณถูกผลักไปแล้ว rebaseจะเขียนประวัติศาสตร์ใหม่
garbagecollector

17
@Toskan คุณสามารถพบปัญหาที่เจ้านายในพื้นที่ของคุณไม่ได้รับการอัปเดตด้วยรีโมท วิธีนี้ทำให้มั่นใจได้ว่าคุณกำลังรวมอยู่ในสำเนาระยะไกลของรหัส
Chris Kooken

8
@garbagecollector ฉันต่อต้าน rebase (ฉันทำได้ แต่จะไม่ได้ rebase) ฉันไม่เห็นเหตุผลที่จะเล่นการพนันด้วย rebase มันทำให้สิ่งที่ซับซ้อนโดยไม่จำเป็น คุณมักจะมีคำถามว่า "ฉันผลักสิ่งนี้ไปยังระยะไกลหรือไม่" ไตร่ตรองและเป็นความเจ็บปวดที่จะอธิบายให้กับผู้มาใหม่ บางคนบอกว่าหลีกเลี่ยงการรวม แต่ฉันต้องการที่จะรวมความมุ่งมั่น พวกเขาไม่ได้รกรุงรังพวกเขาเอกสารเมื่อรวมสาขา ดังนั้นเป็นครั้งสุดท้ายที่เราจะหยุดทำตัวเหมือนเรามุ่งมั่นที่จะเป็นอาจารย์หรือไม่? หากคุณไม่ชอบการรวมคอมมิทเข้าสู่ระบบมากเพียงแค่กรองพวกเขาด้วย - ไม่มีการรวม
nurettin

92

ตรวจสอบครั้งแรกเพื่อต้นแบบ:

git checkout master

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

กลับไปที่สาขาของคุณ 'aq' และผสานหลักในนั้น:

git checkout aq
git merge master

สาขาของคุณจะทันสมัยกับอาจารย์ ที่ดีและเป็นตัวอย่างพื้นฐานของการรวมเป็น3.2 Git กิ่ง - กิ่งพื้นฐานและการผสาน


25

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

git checkout aq
git cherry-pick commit1
git cherry-pick commit2
git cherry-pick commit3
...

สมมติว่าการกระทำเหล่านั้นเป็นตัวแทนของการแก้ไขข้อบกพร่อง

จากนี้ไปให้แก้ไขข้อผิดพลาดในสาขาแยก คุณจะสามารถที่จะ

git merge hotfixes

เมื่อคุณต้องการที่จะม้วนพวกเขาทั้งหมดลงในสาขา dev ปกติ


17

ทั้งสองcherry-pickตกลงที่เกี่ยวข้องในสาขาaqหรือสาขาผสานลงในสาขาmasteraq


5
@ เห็นว่าคุณตอบตัวเอง ... มันไม่ใช่ทางออกสำหรับสถานการณ์นี้
mtet88



7

สำหรับฉันฉันมีการเปลี่ยนแปลงอยู่แล้วและฉันต้องการรุ่นล่าสุดจากสาขาฐาน ฉันไม่สามารถทำได้rebaseและcherry-pickจะต้องดำเนินการตลอดไปดังนั้นฉันจึงทำสิ่งต่อไปนี้:

git fetch origin <base branch name>  
git merge FETCH_HEAD

ดังนั้นในกรณีนี้:

git fetch origin master  
git merge FETCH_HEAD

7

นี่ ( จากที่นี่ ) เหมาะกับฉัน:

git checkout aq
git pull origin master
...
git push

พิเศษ:

git pull origin masterดึงและผสานเนื้อหาของสาขาหลักเข้ากับสาขาของคุณและสร้างการผสาน หากมีความขัดแย้งใด ๆ ผสานคุณจะได้รับแจ้งในขั้นตอนนี้และคุณต้องแก้ไขกระทำก่อนที่จะดำเนินการผสาน git pushเมื่อคุณพร้อมที่จะผลักดันให้กระทำในท้องถิ่นของคุณรวมถึงการผสานใหม่ของคุณกระทำกับเซิร์ฟเวอร์ระยะไกลวิ่ง


สิ่งสำคัญที่ควรทราบว่าโซลูชันนี้สมบูรณ์แบบหากต้องการผสานโดยเฉพาะกล่าวคือถ้าสาขาหลักไม่สามารถทำการ rebased ได้ด้วยเหตุผลบางประการ
cudacoder

3

คุณมีสองทางเลือก git rebase master aqเข้าสู่สาขาซึ่งจะเก็บชื่อการส่งมอบ แต่อย่ารีบาสหากนี่เป็นสาขาระยะไกล คุณสามารถgit merge master aqถ้าคุณไม่สนใจเกี่ยวกับการเก็บชื่อกระทำ หากคุณต้องการที่จะเก็บชื่อกระทำและมันเป็นสาขาระยะไกลgit cherry-pick <commit hash>มุ่งมั่นที่สาขาของคุณ


0

คุณสามารถทำได้โดยใช้บรรทัดเดียว
git merge aq master

สิ่งนี้เทียบเท่า

git checkout aq
git merge master

นี่ไม่ได้ทำในสิ่งที่คุณคิดว่ากำลังทำอยู่ git merge a bผสานสาขาaและbเป็นสาขาปัจจุบัน แต่git merge aเมื่อคุณอยู่ในสาขาaจะไม่ทำอะไรเลย (ซึ่งเป็นเหตุผลว่าทำไมมันถึงดูเหมือนว่ากำลังทำสิ่งที่คุณคิดว่ากำลังทำอยู่) (ดูgit-scm.com/docs/git-merge#Documentation/ ...... )
MikeBeaton

0

แก้ไข:

คำตอบของฉันด้านล่างเอกสารวิธีการผสานmasterเข้าaqที่ถ้าคุณดูรายละเอียดของการผสานมันแสดงการเปลี่ยนแปลงที่เกิดขึ้นในก่อนที่จะมีการรวมไม่เปลี่ยนแปลงที่เกิดขึ้นในaq masterฉันรู้ว่านั่นอาจไม่ใช่สิ่งที่คุณต้องการแม้ว่าคุณจะคิด!

แค่:

git checkout aq
git merge master

ไม่เป็นไร

ใช่นี้ผสานง่ายจะแสดงให้เห็นว่าการเปลี่ยนแปลงจากmasterที่ได้ทำไปaqที่จุดที่ไม่รอบทางอื่น ๆ ; แต่ก็ไม่เป็นไร - เพราะนั่นคือสิ่งที่เกิดขึ้น! ต่อมาเมื่อคุณรวมสาขาของคุณเข้าด้วยกันในที่สุดmasterนั่นคือเมื่อการรวมจะแสดงการเปลี่ยนแปลงทั้งหมดของคุณตามที่ได้ทำไว้master(ซึ่งเป็นสิ่งที่คุณต้องการอย่างแท้จริงและเป็นสิ่งที่ผู้คนคาดหวังว่าจะพบข้อมูลนั้น)

ฉันได้ตรวจสอบแล้วและวิธีการด้านล่างนี้ยังแสดงการเปลี่ยนแปลงที่เหมือนกันทุกประการ(การเปลี่ยนแปลงทั้งหมดที่เกิดขึ้นaqตั้งแต่การแยกแบบดั้งเดิมระหว่างaqและmaster) เป็นวิธีการปกติด้านบนเมื่อคุณรวมทุกอย่างเข้าmasterด้วยกัน ดังนั้นฉันคิดว่ามันเป็นข้อเสียที่แท้จริงเพียงอย่างเดียว (นอกเหนือจากความซับซ้อนและไม่ได้มาตรฐาน ... : - /) คือถ้าคุณgit reset --hard HEAD~<n>ไขการเปลี่ยนแปลงล่าสุดที่มีและสิ่งนี้ผ่านการรวมแล้วเวอร์ชั่นด้านล่างจะย้อนกลับ สาขา 'ผิด' ซึ่งคุณต้องแก้ไขด้วยมือ (เช่นกับgit reflog& git reset --hard [sha])


[ดังนั้นสิ่งที่ฉันคิดว่าก่อนหน้านี้คือ:]

มีปัญหากับ:

git checkout aq
git merge master

เนื่องจากการเปลี่ยนแปลงที่แสดงในการคอมมิชชันคอมมิชชัน (เช่นถ้าคุณดูตอนนี้หรือในภายหลังใน Github, Bitbucket หรือผู้ดูประวัติ git ท้องถิ่นที่คุณชื่นชอบ) เป็นการเปลี่ยนแปลงที่เกิดขึ้นกับมาสเตอร์ซึ่งอาจไม่ใช่สิ่งที่คุณต้องการ

ในทางกลับกัน

git checkout master
git merge aq

แสดงการเปลี่ยนแปลงที่เกิดขึ้นใน aq ซึ่งอาจเป็นสิ่งที่คุณต้องการ (หรืออย่างน้อยก็มักจะเป็นสิ่งที่ฉันต้องการ!) แต่การผสานแสดงการเปลี่ยนแปลงที่ถูกต้องอยู่ในสาขาที่ไม่ถูกต้อง!

วิธีรับมือ!

กระบวนการเต็มรูปแบบลงท้ายด้วยการรวมการกระทำแสดงการเปลี่ยนแปลงที่เกิดขึ้นใน aq (ตามการผสานที่สองข้างต้น) แต่ด้วยการผสานที่มีผลต่อสาขา aq คือ:

git checkout master
git merge aq
git checkout aq
git merge master
git checkout master
git reset --hard HEAD~1
git checkout aq

สิ่งนี้: ผสาน aq เข้ากับ master ส่งต่ออย่างรวดเร็วไปยัง aq เดียวกันรวมกับเลิกใช้บน master และทำให้คุณกลับมาใช้ aq อีกครั้ง!

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

นอกจากนี้การคืนเงินจะไม่เทียบเท่า มันสูญเสียการประทับเวลาและตัวตนของความมุ่งมั่นใน aq ซึ่งก็ไม่ใช่สิ่งที่ฉันต้องการ


0

สถานการณ์สมมติ:

  • ฉันสร้างสาขาจากเจ้านายพูดว่า branch-1 และดึงมันไปยังท้องที่ของฉัน
  • เพื่อนของฉันสร้างสาขาจากต้นแบบว่า branch-2
  • เขาส่งการเปลี่ยนแปลงรหัสบางอย่างไปยังต้นแบบ
  • ตอนนี้ฉันต้องการที่จะเปลี่ยนแปลงเหล่านั้นจากสาขาหลักไปยังสาขาท้องถิ่นของฉัน

สารละลาย

git stash // to save all existing changes in local branch
git checkout master // Switch to master branch from branch-1
git pull // take changes from the master
git checkout branch-1 // switchback to your own branch
git rebase master // merge all the changes and move you git head  forward
git stash apply // reapply all you saved changes 

คุณสามารถค้นหาข้อขัดแย้งในไฟล์ของคุณหลังจากเรียกใช้งาน "git stash Apply" คุณต้องแก้ไขด้วยตนเองและตอนนี้คุณพร้อมที่จะผลักดันแล้ว

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