ฉันได้ทำการเปลี่ยนแปลงและลืมเพิ่มไฟล์ลงในชุดการเปลี่ยนแปลง หลังจากการกระทำอื่น ๆ ฉันตระหนักว่าขณะนี้ไฟล์หายไปจากการคอมHEAD^4
มิต
ฉันจะเขียนคอมมิตก่อนหน้านี้ใหม่เพื่อรวมไฟล์ที่หายไปได้อย่างไร
ฉันได้ทำการเปลี่ยนแปลงและลืมเพิ่มไฟล์ลงในชุดการเปลี่ยนแปลง หลังจากการกระทำอื่น ๆ ฉันตระหนักว่าขณะนี้ไฟล์หายไปจากการคอมHEAD^4
มิต
ฉันจะเขียนคอมมิตก่อนหน้านี้ใหม่เพื่อรวมไฟล์ที่หายไปได้อย่างไร
คำตอบ:
ใช้git rebase --interactive HEAD~4
และตั้งค่าedit
ตัวเลือกสำหรับการกระทำที่คุณต้องการแก้ไข
โปรดจำไว้ว่าคุณไม่ควรแก้ไขคอมมิตที่ส่งไปยังที่เก็บระยะไกลด้วยวิธีนี้ จะเป็นการดีกว่าที่จะเพิ่มคอมมิตใหม่พร้อมไฟล์ที่หายไปในกรณีนั้น
git push -f
ถ้าแน่ใจว่าต้นน้ำไม่เปลี่ยน?
add
แก้ไขไฟล์ที่หายไปแล้วดังนั้นฉันจึงทำการคอมมิตกับ "xxx" เป็นข้อความ จากนั้นฉันก็ใช้คำสั่ง rebase และเปลี่ยนการคอมมิต "xxx" จาก "pick" เป็น "edit" จากนั้นฉันก็ทำ "git rebase --continue" ตอนนี้เมื่อฉันดูประวัติฉันมี "xxx" เป็นคอมมิตล่าสุดและการคอมมิตก่อนหน้านี้ที่ฉันต้องการเพิ่มเข้าไปนั้นไม่เปลี่ยนแปลง ฉันสงสัยว่าฉันผิดพลาดตรงไหน?
ฉันตระหนักดีว่าผู้คนสามารถใช้ Google และมาที่นี่เพื่อหาคำตอบที่ง่ายกว่านี้จะเกิดอะไรขึ้นถ้ามันเป็นเพียงการกระทำครั้งสุดท้าย (คำถามของ OP คือการแก้ไขการกระทำครั้งที่ 4 ในประวัติศาสตร์)
ในกรณีที่คุณยืนยันและรู้ตัวว่าลืมเพิ่มไฟล์ทันทีให้ทำดังนี้
# edited file-that-i-remember.txt
git add file-that-i-remember.txt
git commit
# realize you forgot a file
git add file-that-i-forgot.txt
git commit --amend --no-edit
ที่ไหน --no-edit
จะให้เหมือนกันกระทำข้อความ
peasy ง่าย!
--amend
มีแฮชที่แตกต่างกัน
HEAD^4
ถามหา มันก็โอเคเหมือนเป็นภาคผนวกสำหรับการอ้างอิง ;)
หากคุณยังไม่ได้ผลักดันการกระทำ 4 ข้อนี้คุณสามารถทำได้ดังนี้:
สร้างไฟล์แพทช์สำหรับคอมมิตทั้งหมดเหล่านี้:
git format-patch -4
ย้อนกลับโดย 4 คอมมิต:
git reset --hard HEAD~4
เพิ่มไฟล์ที่หายไป:
git add missing-file
กระทำกับ--amend
:
git commit --amend
ใช้โปรแกรมแก้ไขที่บันทึกไว้ทั้งหมดกลับ:
git am *.patch
หากคุณผลักดันคุณไม่ควรใช้วิธีนี้ แต่เพียงแค่ยอมรับข้อผิดพลาดของคุณและสร้างการกระทำอีกครั้งที่ด้านบนของ HEAD ซึ่งช่วยแก้ปัญหานี้ได้
git format-patch
/ git am
ดีกว่ามาก สิ่งสำคัญที่สุดคือช่วยให้คุณมั่นใจมากขึ้นหากคุณทำบางสิ่งบางอย่างผิดพลาดการกระทำที่บันทึกเป็นโปรแกรมแก้ไขในไฟล์ทางกายภาพถือเป็นเครือข่ายความปลอดภัยที่ดีที่สุดของคุณ
git gc
:)
rm *.patch
)
แม้ว่าคำตอบที่ยอมรับจะถูกต้อง แต่ก็ไม่มีคำแนะนำโดยละเอียดเกี่ยวกับวิธีดำเนินการแก้ไขคอมมิตในระหว่างกระบวนการ rebase
ขั้นแรกเริ่มกระบวนการ rebase:
git rebase --interactive HEAD~4
รายการกระทำจะนำเสนอให้เลือกกระทำคุณต้องการที่จะแก้ไขโดยการเปลี่ยนคำpick
ไปedit
และบันทึกไฟล์
ทำการแก้ไขที่จำเป็นในโค้ดของคุณ (อย่าลืมเรียกใช้git add
ไฟล์ใหม่)
หลังจากการแก้ไขทั้งหมดเสร็จสิ้นปัญหาgit commit --amend
- สิ่งนี้จะแก้ไขการกระทำที่ทำเครื่องหมายเป็นedit
เรียกใช้git rebase --continue
ซึ่งจะเสร็จสิ้นกระบวนการ (หากมีการทำเครื่องหมายว่าเป็นจำนวนedit
มากกว่าขั้นตอนข้างต้นจะต้องทำซ้ำ)
หมายเหตุสำคัญ:
อย่าลบบรรทัดที่ทำเครื่องหมายpick
ว่าคุณไม่ต้องการแก้ไข - ปล่อยไว้ตามที่เป็นอยู่ การลบบรรทัดเหล่านี้จะส่งผลให้ลบคอมมิตที่เกี่ยวข้อง
GIT บังคับให้คุณทำstash
ก่อนทำการรีเบตใหม่หากไดเร็กทอรีการทำงานของคุณไม่สะอาด อย่างไรก็ตามคุณสามารถgit stash pop / git stash apply
ในระหว่างการ rebase เพื่อแก้ไขการเปลี่ยนแปลงเหล่านี้ (เช่นการเปลี่ยนแปลงที่ซ่อนไว้ก่อนเริ่มกระบวนการ rebase) เป็นคอมมิตที่ทำเครื่องหมายเป็นedit
หากมีบางอย่างผิดพลาดและคุณต้องการเปลี่ยนกลับการเปลี่ยนแปลงที่เกิดขึ้นในระหว่างกระบวนการ rebase ก่อนที่จะเสร็จสิ้น (เช่นคุณต้องการย้อนกลับไปที่จุดก่อนที่จะเริ่ม rebase) ให้ใช้git rebase --abort
- อ่านเพิ่มเติม: วิธีการยกเลิกฐานข้อมูลแบบโต้ตอบถ้า --abort doesn ' t ทำงาน?
ดังที่กล่าวไว้ในคำตอบที่ยอมรับ:
โปรดจำไว้ว่าคุณไม่ควรแก้ไขคอมมิตที่ส่งไปยังที่เก็บระยะไกลด้วยวิธีนี้ จะเป็นการดีกว่าที่จะเพิ่มการคอมมิตใหม่ด้วยไฟล์ที่หายไปในกรณีนั้น
คำตอบว่าทำไมอยู่ในGit Book (ย่อหน้าที่ชื่อว่า " The Perils of Rebasing "):
อย่า rebase คอมมิตที่มีอยู่นอกที่เก็บของคุณ
หากคุณปฏิบัติตามแนวทางนั้นคุณจะสบายดี ถ้าคุณไม่ทำคนอื่นจะเกลียดคุณและคุณจะถูกเพื่อนและครอบครัวดูถูก
เมื่อคุณสร้างฐานข้อมูลใหม่คุณจะละทิ้งความมุ่งมั่นที่มีอยู่และสร้างสิ่งใหม่ที่เหมือนกัน แต่แตกต่างกัน หากคุณผลักดันความมุ่งมั่นที่ใดที่หนึ่งและคนอื่น ๆ ดึงพวกเขาลงและทำงานบนพื้นฐานจากนั้นคุณเขียนคอมมิตเหล่านั้นใหม่ด้วย git rebase และผลักดันขึ้นมาอีกครั้งผู้ทำงานร่วมกันของคุณจะต้องรวมงานของพวกเขาใหม่และสิ่งต่างๆจะยุ่งเหยิงเมื่อคุณพยายาม ดึงงานของพวกเขากลับมาเป็นของคุณ
[... ]