ลบคอมไพล์คอมมิทเก่า ๆ


89

ฉันใหม่มากที่จะคอมไพล์และสงสัยว่าจะเป็นไปได้ไหม

>git log --pretty=oneline --abbrev-commit
2f05aba Added new feature
3371cec Fixed screw up    <-- I want to remove this
daed25c Screw up          <-- and remove this.
e2b2a84 First.                So it's like they never happend.

เป็นไปได้หรือไม่

คำตอบ:


63

ซึ่งเป็นไปได้ด้วยgit rebase. ลองทำดังต่อไปนี้

git rebase -i HEAD~4

จากนั้นทำตามคำแนะนำเชิงโต้ตอบในตัวแก้ไขของคุณ ในขั้นตอนแรกที่คุณ "สควอช" กระทำ ควรมีลักษณะดังนี้:

pick 2f05aba ... will be preserved
squash 3371cec ... will be squashed with daed25c
squash daed25c ... will be squashed with e2b2a84
pick e2b2a84 .. will contain this and 3371cec and daed25c

ในขั้นตอนที่สองคุณสามารถแก้ไขข้อความคอมมิต


27
คำถามเกี่ยวกับการลบคอมมิทไม่ใช่หรือไม่?
Richard

4
@Stony: คุณอาจจะลบมันออกไปก็ได้ แต่จากคอมเมนต์คอมมิตใน OP ("Screw up" และ "Fixed screw up") ฉันเดาว่าอันนั้นกำลังเลิกทำอีกอันและคุณก็ทำได้เช่นกันแค่สควอชสองอัน
Deve

85

หากคุณต้องการลบอย่างแท้จริง (ลบออกจากประวัติไม่ปรากฏให้เห็นอีกต่อไป) คุณสามารถทำได้

เรียกใช้ rebase:

git rebase -i HEAD~4

จากนั้นเพียงลบ (หรือแสดงความคิดเห็น) บรรทัดที่ตรงกับการคอมมิตที่คุณต้องการลบดังนี้:

pick 2f05aba ... #will be preserved
#pick 3371cec ... #will be deleted
#pick daed25c ... #will be deleted
pick e2b2a84 ... #will be preserved

2
ฉันเพิ่งเริ่มใช้ github คุณจะผลักดันการเปลี่ยนแปลงอย่างไรหลังจากนั้น (เมื่อฉันคลิกซิงค์มันจะย้อนกลับสิ่งที่ฉันทำ) ฉันคิดว่าฉันเข้าใจแล้ว: git push origin HEAD --force
Nicolas Thery

@Nicolas เธอทำไม่ได้ นั่นเป็นเหตุผลที่ git push ปฏิเสธที่จะทำงานโดยไม่มี --force เพราะคุณกำลังเขียนประวัติศาสตร์ซ้ำและคุณจะทำลายที่เก็บของคนอื่น ๆ หากคุณผลักดันไปแล้วตัวเลือกเดียวของคุณคือทำไฟล์git revert. ซึ่งเมื่อคุณคิดว่ามันสมเหตุสมผลเพราะถ้าคุณดึงรหัสของคนอื่นคุณจะไม่ต้องการให้พวกเขาสามารถลบความผิดเก่าของคุณได้โดยไม่ต้องมีประวัติอะไรบ้าง?
Angry Dan

ฉันคิดว่าสิ่งนี้ใช้งานได้ใน Git repo ปัจจุบันและไม่เปลี่ยนแปลงสิ่งใดที่อัปสตรีม / โหนด Git อื่น ๆ ?
Alexander Mills

2
@AlexanderMills มันจะไม่เปลี่ยนแปลงอะไรเลยตราบเท่าที่คุณไม่ผลักดันมัน (และถ้าคุณทำคุณต้องเพิ่มธง --force ตามที่ Angry Dan กล่าว)
Shathur

dหรือdropเป็นคำสั่งในการลบคอมมิตออกจากประวัติ
รถเข็นที่ถูกทิ้ง

6

หากต้องการลบคอมมิตอย่างสมบูรณ์dropตอนนี้มีตัวเลือกใหม่สำหรับ git rebases แบบโต้ตอบ วิ่งครั้งแรก:

git rebase -i HEAD~4

จากนั้นแทนที่pickด้วยdropสำหรับการกระทำที่จะทิ้ง:

pick 2f05aba ... #will be preserved
drop 3371cec ... #will be dropped
drop daed25c ... #will be dropped
pick e2b2a84 ... #will be preserved

สิ่งนี้ใช้ได้กับ Fedora สำหรับฉันด้วยเวอร์ชันต่อไปนี้:

$ git version
git version 2.21.0

2

สควอชมีประโยชน์เมื่อคุณต้องการสร้างรายการคอมมิตที่ผสานภายใต้แฮชเดียว แต่ถ้าคุณต้องการแยกคอมมิทสามคอมมิตและมีผลลัพธ์สุดท้ายที่ดูเหมือนว่าเป็นการคอมมิตเดียวฉันขอแนะนำ fixup

git rebase -i HEAD~4

pick 2f05aba ... will be preserved
fixup 3371cec ... will be merged with daed25c
fixup daed25c ... will be merged with e2b2a84
pick e2b2a84 .. will include 3371cec and daed25c, but only the commit message of e2b2a84

คุณสามารถค้นหาข้อมูลเพิ่มเติมได้ในรายการคำสั่งของ UI rebase แบบโต้ตอบ

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