วิธีการย้ายมุ่งมั่นบางอย่างที่จะขึ้นอยู่กับสาขาอื่นในคอมไพล์?


381

สถานการณ์:

  • เจ้านายอยู่ที่ X
  • quickfix1 อยู่ที่ X + 2 คอมมิชชัน

ดังนั้น:

o-o-X (master HEAD)
     \
      q1a--q1b (quickfix1 HEAD)

จากนั้นฉันก็เริ่มทำงานกับ quickfix2 แต่โดยบังเอิญเอา quickfix1 เป็นสาขาต้นทางเพื่อคัดลอกไม่ใช่ต้นแบบ ตอนนี้ quickfix2 อยู่ที่ X + 2 คอมมิต + 2 คอมมิทที่เกี่ยวข้อง

o-o-X (master HEAD)
     \
      q1a--q1b (quickfix1 HEAD)
              \
               q2a--q2b (quickfix2 HEAD)

ตอนนี้ฉันต้องการมีสาขาที่มี quickfix2 แต่ไม่มี 2 คอมมิตที่เป็นของ quickfix1

      q2a'--q2b' (quickfix2 HEAD)
     /
o-o-X (master HEAD)
     \ 
      q1a--q1b (quickfix1 HEAD)

ฉันพยายามสร้างแพทช์จากการแก้ไขบางอย่างใน quickfix2 แต่แพทช์ไม่รักษาประวัติการกระทำ มีวิธีการบันทึกประวัติการกระทำของฉัน แต่มีสาขาที่ไม่มีการเปลี่ยนแปลงใน quickfix1 หรือไม่?



8
@ Kevin คำถามเท่านั้นที่ถามเกี่ยวกับการย้ายกระทำจากสาขาหนึ่งไปยังอีกที่หนึ่งนี้มีความต้องการที่เพิ่มขึ้นของไม่quickfix1รวมถึงการกระทำใน (โปรดสังเกตความแตกต่างในคำตอบ)
Scott Weldon

คำตอบ:


372

นี่คือกรณีคลาสสิกของrebase --onto:

 # let's go to current master (X, where quickfix2 should begin)
 git checkout master

 # replay every commit *after* quickfix1 up to quickfix2 HEAD.
 git rebase --onto master quickfix1 quickfix2 

ดังนั้นคุณควรไปจาก

o-o-X (master HEAD)
     \ 
      q1a--q1b (quickfix1 HEAD)
              \
               q2a--q2b (quickfix2 HEAD)

ถึง:

      q2a'--q2b' (new quickfix2 HEAD)
     /
o-o-X (master HEAD)
     \ 
      q1a--q1b (quickfix1 HEAD)

นี่เป็นการกระทำที่ดีที่สุดบนต้นไม้ที่ใช้งานได้ดี
ดูgit config --global rebase.autostash trueโดยเฉพาะอย่างยิ่งหลังจากที่ Git 2.10


24
ระวังว่าขั้นตอนเหล่านี้จะแก้ไขประวัติของ quickfix2 ดังนั้นถ้าคุณแชร์สาขาแล้วให้ใช้เชอร์รี่เลือกแทน (ดูคำตอบต่อไปนี้)
Max Chernyak

เพียงบันทึก: ด้วยบันทึกของ SmartGit เพียงลากq2aลงไปXแล้วเลือกRebase 2จากข้อตกลงของตัวเลือกของกล่องโต้ตอบที่เกิดขึ้น
โทมัสเอส.

1
@ThomasS น่าสนใจ git rebase --ontoนั่นคือการดำเนินงานที่ดีของ GUI
VonC

1
ฉันต้องยอมรับว่าฉันทำสิ่งที่โง่ ๆ เช่นมุ่งมั่นที่จะทำผิดสาขาบ่อยครั้งกว่าที่ฉันควรจะเป็นจริงมุมมองบันทึกการใช้ SmartGit GUI ช่วยฉันได้หลายครั้งด้วยสถานการณ์เดียวกัน
WORMSS

1
@Cosine เห็นด้วย ฉันได้แก้ไขคำตอบของฉันเพื่อเพิ่มการอ้างอิงไปยังrebase.autostashการกำหนดค่า: ที่จะหลีกเลี่ยงการสูญเสียงานระหว่างทำในแผนผังการทำงานเมื่อทำการรีบูต
VonC

155

คุณสามารถใช้git cherry-pickเพื่อเลือกการกระทำที่คุณต้องการคัดลอก

อาจเป็นวิธีที่ดีที่สุดคือการสร้างสาขาจากต้นแบบจากนั้นในการใช้สาขาgit cherry-pickที่ 2 กระทำจาก quickfix2 ที่คุณต้องการ


นี่เป็นตัวเลือกที่ดีที่สุดหากคุณต้องการย้ายการกระทำเพียงครั้งเดียว ขอบคุณ
อเล็กซ์

142

สิ่งที่ง่ายที่สุดที่คุณสามารถทำได้คือเชอร์รี่เลือกช่วง มันเหมือนกันกับrebase --ontoดวงตา แต่ง่ายกว่า :)

git cherry-pick quickfix1..quickfix2

6
นอกจากนี้จะไม่สูญเสียความมุ่งมั่นดั้งเดิม IIUC ดังนั้นจึงดูเหมือนว่าดีกว่าสำหรับ "play-it-safe" เช่นฉัน;) หรือrebase --ontoยังรักษาการเปลี่ยนแปลงเดิม
akavel

6
ทั้งสองrebaseและcherry-pickมอบกุญแจ SHA ใหม่ให้คุณ นั่นเป็นเพราะการกระทำแต่ละครั้งเป็นภาพรวมที่ไม่ซ้ำกันของพื้นที่เก็บข้อมูล
Christoph

6
สิ่งที่หมายความว่า @akavel คือการเลือกเชอร์รี่จะทำให้ความมุ่งมั่นดั้งเดิมในสาขาของพวกเขาซึ่งเป็นความจริง
Mr_and_Mrs_D

4
สำหรับสิ่งที่มันมีค่าฉันพยายามที่จะcherry-pickเป็นช่วงในคำตอบนี้และมันสับสน repo ของฉัน ฉันต้องทำรายบุคคลcherry-pickสำหรับแต่ละการกระทำ (และอาจเป็นไปได้โดยไม่บอก แต่ในกรณีที่มีใครกำลังดิ้นรนคุณจะต้องcherry-pickทำตามลำดับเหตุการณ์ที่คุณทำ)
carmenism

3
git checkoutเป็นสิ่งสำคัญที่นี่ HEAD ของคุณคืออะไร?
Sławomir Lenart

28

ฉันเชื่อว่ามัน:

git checkout master
git checkout -b good_quickfix2
git cherry-pick quickfix2^
git cherry-pick quickfix2

3
cherry-pickทำงานร่วมกับแฮชคอมมิชชันได้ดังนั้นถ้าคุณแค่อยากจะรับคอมมิชชันจากที่อื่นและนำไปใช้ที่อื่นนี่คือหนทางที่จะไป เพียงให้แน่ใจว่าคุณทำcheckout <branch>สาขาที่ถูกต้องก่อน
John Leidegren

-1
// on your branch that holds the commit you want to pass
$ git log
// copy the commit hash found
$ git checkout [branch that will copy the commit]
$ git reset --hard [hash of the commit you want to copy from the other branch]
// remove the [brackets]

คำสั่งที่เป็นประโยชน์อื่น ๆ เพิ่มเติมที่นี่พร้อมคำอธิบาย: Git Guide

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