Git ดันไปผิดสาขา


100

การทำงานกับคอมไพล์หลังจาก 'กระทำ' และ 'ดัน' สองสามครั้งฉันก็รู้ว่ากำลังใช้ผิดสาขา!

ตอนนี้ฉันต้องลบการเปลี่ยนแปลงของฉันใน wrong_branch ไม่ว่าจะด้วยวิธีใดและยอมรับและผลักดันการเปลี่ยนแปลงใน right_branch

อะไรคือวิธีที่ดีที่สุด (และง่าย ๆ ) ในการทำเช่นนั้น

ขอบคุณ


เป็นไปได้ที่จะทำสำเนาGit: การลบ
คอมมิตที่

คำถามที่ดี @tokland: 99% ของนักพัฒนา Ruby ใช้ git และโครงการที่ฉันกำลังทำงานอยู่ใน RoR ... แต่ฉันรู้ว่านี่อาจไม่ใช่แรงจูงใจที่ดี
Alessandro De Simone

3
จากมุมมองของฉันนี่ไม่ใช่สิ่งที่ซ้ำกันกับสิ่งที่ฮาล์ฟแดนกล่าวไว้เนื่องจากมันเกี่ยวกับการย้ายคอมมิชชันไปยังสาขาอื่นไม่เพียง แต่ลบออกเท่านั้น
olenz

คำตอบ:


146

เปลี่ยนไปที่สาขานั้นตรวจสอบgit logและคอมgit revertมิตทีละรายการ เมื่อคุณทำเสร็จแล้วให้เปลี่ยนกลับไปที่สาขาที่ต้องการจากนั้นคุณสามารถใช้git cherry-pickเพื่อเลือกคอมมิตเฉพาะจาก git refs และรวมเข้ากับสาขาที่ถูกต้อง

git checkout wrong_branch
git revert commitsha1
git revert commitsha2
git checkout right_branch
git cherry-pick commitsha1
git cherry-pick commitsha2

หากการคอมมิตถูกรวมเข้าด้วยกันและไม่มีการผลักดันหลังจากการกระทำที่ไม่เหมาะสมของคุณคุณยังสามารถใช้git resetเพื่อทำให้สาขาที่ไม่ถูกต้องนั้นกลับสู่สถานะก่อนที่คุณจะกระทำจากนั้นทำตามอีกครั้งโดยใช้git cherry-pickเพื่อให้การกระทำของคุณเข้าสู่สาขาที่ถูกต้อง

git checkout wrong_branch
git reset commitsha3 #commit just before commitsha2
git checkout right_branch
git cherry-pick commitsha1
git cherry-pick commitsha2

Revert + cherry-pick ดูเหมือนจะง่ายกว่าวิธีอื่น ๆ ที่เป็นไปได้เกี่ยวกับการรีเซ็ตหัวและ / หรือการเปลี่ยนใหม่
ChrisV

2
สำหรับคอมไพล์เชอร์รี่รับคุณสามารถใส่ Shas git cherry-pick commitsha1 commitsha2หลายในบรรทัดเดียวคือ
ThomasW

ช่วยชีวิต! และไม่ซับซ้อน. ขอบคุณ!
Craig Silver

จะเกิดอะไรขึ้นเมื่อคุณต้องการรวม Wrong_branch (เช่นพัฒนา) เข้ากับ right_branch (เช่นฟีเจอร์ / X) จากนั้นคุณจะได้รับการยกเลิกการยกเลิกการเปลี่ยนแปลงที่คุณเลือกเชอร์รี่
timB33

revertสะอาดกว่ามากและไม่น่าทึ่งกว่าresetเว้นแต่คุณต้องการลบสิ่งที่ละเอียดอ่อน (ข้อมูลรับรอง?)
Qumber

3

git rebaseวิธีที่ง่ายที่สุดคือการใช้ สมมติว่าคุณมีการตั้งค่าดังกล่าว:

A -- B -- C -- C1 -- C2 # right branch
          \
           \-- D -- C3 -- C4 # wrong branch

คุณต้องการย้ายการเปลี่ยนแปลง C3, C4 ไปยังสาขาที่ถูกต้อง

git checkout -b new_wrong_branch D
git checkout wrong_branch
git rebase D --onto right_branch
git checkout right_branch
git merge right_branch wrong_branch
git branch -d wrong_branch
git branch rename new_wrong_branch wrong_branch

ตอนนี้การตั้งค่าคือ

A -- B -- C -- C1 -- C2 -- C3 -- C4 # right_branch
          \
           \ -- D # wrong_branch

จากนั้นคุณต้องผลักดันผลลัพธ์ของคุณด้วยแรง (หากยังไม่มีใครซิงโครไนซ์กับ repo ระยะไกลของคุณ):

git push -f remote:right_branch

ฉันไม่ได้ลองวิธีแก้ปัญหานี้ฉันได้ดำเนินการตามคำตอบแรกแล้ว (และได้ผล) ฉันไม่ได้คิดที่จะใช้ rebase ดูเหมือนว่าจะเป็นทางเลือกที่ดีขอบคุณ
Alessandro De Simone

1
แทนที่จะใช้ดีกว่าgit push -f git push --force-with-leaseอย่างน้อยก็ช่วยให้มั่นใจได้ว่าการอ้างอิงระยะไกลจะได้รับการอัปเดตก็ต่อเมื่อไม่มีใครผลักดันการกระทำอื่น ๆ นอกเหนือจากการกระทำของคุณ
Pierre-Olivier Vares

2

ทางลัดเล็กน้อยเพื่อเพิ่มคำตอบของ Dhruva

git checkout wrong_branch
git revert commitsha1

git checkout right_branch
git push right_branch

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