สรุป
ข้อความแสดงข้อผิดพลาด
ไม่สามารถ 'สควอช' โดยไม่ส่งคำสั่งก่อนหน้า
หมายความว่าคุณน่าจะพยายาม "สควอชลง" Git ทำให้การคอมมิชชันที่ใหม่กว่าเป็นการคอมมิชชันเก่าหรือ“ ขึ้น” เมื่อดูในรายการสิ่งที่ต้องทำแบบรีบูตแบบโต้ตอบซึ่งจะเป็นการคอมมิทบนบรรทัดก่อนหน้า การเปลี่ยนคำสั่งในบรรทัดแรกสุดของรายการสิ่งที่ต้องทำของคุณsquash
จะทำให้เกิดข้อผิดพลาดนี้เสมอเนื่องจากไม่มีสิ่งใดสำหรับการส่งสควอชครั้งแรก
การแก้ไข
ก่อนอื่นกลับไปที่ที่คุณเริ่มต้นด้วย
$ git rebase --abort
บอกว่าประวัติของคุณคือ
$ git log --pretty=oneline
a931ac7c808e2471b22b5bd20f0cad046b1c5d0d c
b76d157d507e819d7511132bdb5a80dd421d854f b
df239176e1a2ffac927d8b496ea00d5488481db5 a
นั่นคือ a คือการกระทำแรกจากนั้น b และในที่สุด c หลังจากคอมมิทเราตัดสินใจที่จะสควอชขและคด้วยกัน:
(หมายเหตุ: การเรียกใช้git log
การส่งออกไปยังเพจเจอร์less
ตามค่าเริ่มต้นบนแพลตฟอร์มส่วนใหญ่หากต้องการออกจากเพจเจอร์และกลับสู่พรอมต์คำสั่งของคุณให้กดq
ปุ่ม)
การรันgit rebase --interactive HEAD~2
จะช่วยให้คุณแก้ไขได้
pick b76d157 b
pick a931ac7 c
# Rebase df23917..a931ac7 onto df23917
#
# Commands:
# p, pick = use commit
# r, reword = use commit, but edit the commit message
# e, edit = use commit, but stop for amending
# s, squash = use commit, but meld into previous commit
# f, fixup = like "squash", but discard this commit's log message
#
# If you remove a line here THAT COMMIT WILL BE LOST.
# However, if you remove everything, the rebase will be aborted.
#
(ขอให้สังเกตว่ารายการสิ่งที่ต้องทำนี้อยู่ในลำดับย้อนกลับเมื่อเทียบกับผลลัพธ์ของgit log
)
การเปลี่ยนขของpick
การsquash
จะส่งผลให้เกิดข้อผิดพลาดที่คุณเห็น แต่ถ้าแทนคุณสควอชคเข้าไปในข (ใหม่กระทำลงไปเก่าหรือ“ฉับขึ้น”) โดยการเปลี่ยนรายการสิ่งที่ต้องทำเพื่อ
pick b76d157 b
squash a931ac7 c
และบันทึกออกจากโปรแกรมแก้ไขของคุณคุณจะได้รับโปรแกรมแก้ไขเนื้อหาที่มี
# This is a combination of 2 commits.
# The first commit's message is:
b
# This is the 2nd commit message:
c
เมื่อคุณบันทึกและออกเนื้อหาของไฟล์ที่แก้ไขจะกลายเป็นข้อความยืนยันการคอมมิทรวมใหม่:
$ git log --pretty=oneline
18fd73d3ce748f2a58d1b566c03dd9dafe0b6b4f b and c
df239176e1a2ffac927d8b496ea00d5488481db5 a
หมายเหตุเกี่ยวกับประวัติการเขียนซ้ำ
การรีบูตแบบโต้ตอบจะเขียนประวัติใหม่ ความพยายามที่จะส่งไปยังรีโมตที่มีประวัติเก่าจะล้มเหลวเนื่องจากไม่ใช่กรอไปข้างหน้า
หากสาขาที่คุณนำกลับมาใช้เป็นหัวข้อหรือสาขาคุณลักษณะที่คุณทำงานด้วยตัวเองก็ไม่ใช่เรื่องใหญ่อะไร การพุชไปยังที่เก็บอื่นจะต้องใช้--force
ตัวเลือกหรือคุณอาจสามารถขึ้นอยู่กับการอนุญาตของที่เก็บรีโมตเพื่อลบสาขาเก่าก่อนจากนั้นจึงกดเวอร์ชันที่รีบูต ตัวอย่างคำสั่งเหล่านั้นที่อาจทำลายงานอยู่นอกขอบเขตของคำตอบนี้
การเขียนประวัติศาสตร์ที่เผยแพร่แล้วบนกิ่งไม้ในที่ที่คุณกำลังทำงานกับคนอื่น ๆ ได้โดยไม่ต้องมากเหตุผลที่ดีเช่นการรั่วไหลของรหัสผ่านหรือรายละเอียดอื่น ๆ ที่มีความสำคัญกองกำลังทำงานบนที่ทำงานร่วมกันและเป็นปรปักษ์ต่อสังคมและจะรบกวนนักพัฒนาอื่น ๆ ส่วน“ การกู้คืนจากการรีสตรีม Rebase” ในgit rebase
เอกสารอธิบายอธิบายโดยเน้นที่เพิ่มเติม
การรีบูท (หรือการเขียนใหม่ในรูปแบบอื่น ๆ ) สาขาที่คนอื่นใช้ทำงานเป็นความคิดที่ไม่ดี: ใครก็ตามที่ถูกดาวน์สตรีมของมันจะถูกบังคับให้แก้ไขประวัติด้วยตนเอง ส่วนนี้อธิบายวิธีการแก้ไขจากมุมมองของดาวน์สตรีม การแก้ไขที่แท้จริงจะหลีกเลี่ยงการเริ่มต้นใหม่ในตอนแรก ...