git rebase --skip ทำอะไรกันแน่?


107

ฉันเพิ่งทำgit pull --rebase origin masterและมีความขัดแย้ง

ประการแรกความขัดแย้งนี้อยู่ในไฟล์ที่ฉันไม่ได้สัมผัสและมีการตอบกลับประมาณ 10 ครั้ง ทำไมสิ่งนี้ถึงเกิดขึ้น?

จากนั้นฉันก็พิมพ์โดยไม่ได้ตั้งใจgit rebase --skipและมัน 'ข้ามแพตช์นั้น'

กังวลว่าฉันข้ามการคอมมิตไปแล้วฉันตรวจสอบเวอร์ชันใหม่ของสาขาหลักและพบความแตกต่างระหว่างสาขาที่ฉันทำฐานใหม่และสาขาหลักใหม่ การเปลี่ยนแปลงเดียวที่ปรากฏในความแตกต่างคือคอมมิตล่าสุดและเมื่อดูที่บันทึกแพตช์ที่ถูก "ข้าม" จะปรากฏในประวัติการคอมมิต

ใครช่วยอธิบายได้ไหมว่าเกิดอะไรขึ้นที่นี่?


11
เผลอพิมพ์ยังgit rebase --skipไง. อาจจะผิด? :)
manojlds

3
ฮา! หมายถึงพิมพ์ --abort แต่ด้วยเหตุผลที่ไม่ทราบสาเหตุจึงออกมาเป็น --skip ไม่ได้คิดจริงๆ :)
mrwooster

9
ประวัติเชลล์เป็นสิ่งที่ดี (เพื่อให้คุณดำเนินการในสิ่งที่คุณไม่ต้องการ)
Florian Klein

คำตอบ:


60

มันทำตามที่พูดมันข้ามการกระทำ หากคุณrebase --abortพบข้อขัดแย้งในภายหลังระหว่างการรีเบสเดียวกันคอมมิตที่ข้ามไปจะถูกเปลี่ยนกลับไปด้วยแน่นอน

หากการเปลี่ยนแปลงของคุณมีต้นน้ำอยู่แล้ว Git จะไม่สามารถใช้คอมมิตของคุณได้ (แต่โดยปกติแล้วควรข้ามไปโดยอัตโนมัติหากแพตช์เหมือนกันทุกประการ) คอมมิตของคุณเองจะถูกข้ามไป แต่การเปลี่ยนแปลงจะยังคงมีอยู่ใน HEAD ปัจจุบันเนื่องจากมีการใช้งานอัปสตรีมแล้ว

คุณควรตรวจสอบให้แน่ใจว่าคุณไม่ได้ลบการเปลี่ยนแปลงที่สำคัญของคุณ;) (ใช้ reflog เพื่อย้อนกลับไปยังสถานะก่อน rebase)


4
เหตุใดการกระทำจึงยังคงปรากฏในบันทึก แล้วเหตุใดการกระทำที่หายไปจึงปรากฏในส่วนต่าง
mrwooster

3
ใช่ความขัดแย้งได้รับการแก้ไขแล้วตั้งแต่ต้นน้ำ ... ด้วยเหตุผลบางอย่าง git rebase ทำให้เกิดความขัดแย้งในการผสานแบบเก่า ... อีกสิ่งหนึ่งที่ทำให้ฉันสับสนหรือไม่ ... นี่หมายความว่ามันข้ามความขัดแย้งไป แต่ใช้โปรแกรมแก้ไขที่แก้ไข ขัดแย้ง?
mrwooster

3
คุณข้ามคอมมิตของตัวเองซึ่งมีการเปลี่ยนแปลงเช่นเดียวกับคอมมิตอัพสตรีม คุณข้ามการกระทำของคุณไปแล้ว แต่การเปลี่ยนแปลงยังคงเกิดขึ้น (เนื่องจากมีอยู่แล้วที่อัป
สตรีม

1
@mittal ไม่ฉันไม่คิดว่า--skipจะเป็นทางไป การข้ามจะข้ามการกระทำทั้งหมดโดยทิ้งการเปลี่ยนแปลงทั้งหมดที่เกิดขึ้นในคอมมิตนี้
knittl

3
@mittal: คิดว่าgit rebaseเป็นการคัดลอกคอมมิชชันจากสาขาหนึ่งไปยังอีกสาขาหนึ่ง ดังนั้นเมื่อคุณข้ามคอมมิตเนื้อหาดั้งเดิมของคอมมิตจะถูกข้ามและไม่มีการใช้แพตช์ (ดังนั้นการเปลี่ยนแปลงทั้งหมดที่เกิดขึ้นกับไฟล์ใด ๆ จะไม่ทำให้มันอยู่ในสาขาเป้าหมายของคุณ) วิธีที่ง่ายที่สุดคือการตั้งค่าที่เก็บ git อย่างง่ายโดยมีสองสาขาโดยมีการคอมมิตกับแต่ละสาขาจากนั้นลอง rebase และข้ามการกระทำ (คุณสามารถใช้git rebase --interactiveระบุได้ว่าจะคัดลอกpickskip
คอมมิตใด
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.