Rebase branch feature ไปที่ branch ฟีเจอร์อื่น


305

ฉันมีสาขาฟีเจอร์ (ส่วนตัว) สองสาขาที่ฉันทำงานอยู่

a -- b -- c                  <-- Master
     \     \
      \     d -- e           <-- Branch1
       \
        f -- g               <-- Branch2

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

a -- b -- c                  <-- Master
           \
            d -- e -- f -- g <-- Branch1

ฉันค่อนข้างแน่ใจว่าฉันต้องรีบูทสาขาที่สองไปที่สาขาแรก แต่ฉันไม่แน่ใจเกี่ยวกับไวยากรณ์ที่ถูกต้องและสาขาที่ฉันควรจะเช็คเอาท์

คำสั่งนี้จะสร้างผลลัพธ์ที่ต้องการหรือไม่?

(Branch1)$ git rebase --onto Branch1 Branch2

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

3
ขอบคุณ ฉันงอมากในการทำให้ถูกต้องในครั้งแรกที่มันไม่ได้เกิดขึ้นกับฉันว่าฉันสามารถทดสอบตัวเองได้อย่างง่ายดาย :-)
Arjen

4
ฉันคิดอย่างนั้นนั่นเป็นเหตุผลที่ฉันโพสต์ความคิดเห็น :) ทุกครั้งที่ฉันทำสิ่งที่ฉันไม่แน่ใจว่าจะทำสิ่งที่ฉันคิดว่ามันทำฉันสร้างพื้นที่เก็บข้อมูลทดสอบและทำการทดสอบของฉันที่นั่น หรือฉันสร้างสำเนาของที่เก็บจริงของฉันและทำการทดสอบกับสำเนา
Daniel Hilgarth

หมายเหตุ: Git 2.0 จะแนะนำทางลัดสำหรับชนิดของ rebase git rebase -นี้: ดูคำตอบของฉันด้านล่าง
VonC

5
หมายเหตุเล็กน้อย: คำตอบที่นี่ให้ branch2 เป็นผลลัพธ์ OP ต้องการ branch1 หรือฉันพลาดอะไรไป?
Josef.B

คำตอบ:


353
  1. สลับไปที่ Branch2

    git checkout Branch2
    
  2. ใช้การเปลี่ยนแปลงปัจจุบัน (Branch2) ที่ด้านบนของการเปลี่ยนแปลง Branch1 อยู่ใน Branch2:

    git rebase Branch1
    

ซึ่งจะทำให้คุณมีผลลัพธ์ที่ต้องการใน Branch2:

a -- b -- c                      <-- Master
           \
            d -- e               <-- Branch1
           \
            d -- e -- f' -- g'   <-- Branch2

คุณสามารถลบ Branch1


ขอบคุณ! เมื่อลบสาขาหลังจากรีบูตฉันได้รับข้อความว่าสาขาไม่ได้ถูกผสานอย่างสมบูรณ์ ฉันคิดว่าฉันสามารถเพิกเฉยต่อข้อความนี้และบังคับให้ลบได้อย่างปลอดภัยหรือไม่
อาร์เจน

10
เขาไม่ต้องการเปลี่ยนแปลงทั้งหมดใน Branch1 หรือ
tomasz_kusmierczyk

6
ดูเหมือนว่าตรงข้ามกับสิ่งที่เขาต้องการใช่ไหม
1252748

1
อันที่จริง @tomasz_kusmierczyk และ @ 1252748 และฉันก็สับสนเหมือนกัน แต่ฉันก็รู้ว่าการแสดงgit rebaseในขณะที่อยู่ใน Branch1 จะเขียนประวัติของ Branch1 ใหม่เพื่อให้การเปลี่ยนแปลงของ Branch1 อยู่ด้านบนของสิ่งที่คัดลอกมาจาก Branch2 ที่จะส่งผลในคำสั่งกระทำดังต่อไปนี้, a - b - f - g - c' - d' - e'.
ปลาไหล gEEE

1
@tomasz_kusmierczyk และ 1252748 นี่ไม่ตรงข้ามกับสิ่งที่เขาต้องการนี่คือสิ่งที่เขาต้องการจริงๆ ชื่อสาขาไม่สำคัญคุณสามารถเปลี่ยนได้ตลอดเวลา
a3y3

56

หมายเหตุ: ถ้าคุณอยู่Branch1คุณจะสามารถพิมพ์ Git 2.0 (Q2 2014):

git checkout Branch2
git rebase -

ดูคอมมิท 4f40740โดยBrian Gesiakmodocache :

rebase: อนุญาตให้ใช้ทาง-ลัด "" สำหรับสาขาก่อนหน้า

สอนลดการจดชวเลขเดียวกันเป็นcheckoutและmergeเพื่อตั้งชื่อสาขาให้rebaseกับสาขาปัจจุบันใน นั่นคือ " -" หมายถึง "สาขาที่เราเคยเปิดอยู่"


26
ดี แต่ก็ค่อนข้างอันตราย บางครั้งการใช้คำฟุ่มเฟื่อยชนะ แต่แล้วอีกครั้งฉันชอบ Java ... (-:
sthzg

3

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

a -- b -- c                  <-- Master
     \     \
      \     d -- e -- f -- g <-- Branch1 (Cherry-Pick f & g)
       \
        f -- g               <-- Branch2
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.