จะลบ n สุดท้ายบน Github และในเครื่องได้อย่างไร?


128

ฉันกำลังพยายามลบ 2 คอมมิตสุดท้ายจากที่เก็บ GitHub ของฉัน ฉันได้ลองทำตามคำแนะนำที่นี่ : git push -f origin HEAD^^:master. ดูเหมือนว่าจะใช้งานได้เนื่องจากการกระทำสองครั้งสุดท้ายจะถูกลบออก

จากนั้นฉันลบออกจากที่เก็บในเครื่องของฉันด้วยgit rebase -i HEAD~2. ฉันลบบรรทัดที่เกี่ยวข้องกับการกระทำเหล่านั้นและตรวจสอบgit logว่าได้ลบออกอย่างถูกต้อง

หลังจากนั้นฉันทำการเปลี่ยนแปลงบางอย่างในที่เก็บในเครื่องของฉันทำการคอมมิตใหม่และกดไปที่ GitHub ปัญหาคือในบัญชี GitHub ของฉันฉันมีการคอมมิตสองครั้งก่อนหน้านี้ที่ฉันพยายามลบ

ฉันคิดว่าปัญหาอยู่ในที่เก็บในเครื่องของฉันเพราะถ้าฉันโคลนที่เก็บ Github ของฉันไปยังท้องถิ่นของฉันและทำการเปลี่ยนแปลงบางอย่างที่นี่เมื่อฉันกดคอมมิตใหม่การคอมมิตเก่าเหล่านั้นจะไม่ถูกผลักไปที่ GitHub

ความคิดใด ๆ ?

คำตอบ:


202

ในการลบการกระทำสองครั้งสุดท้ายในเครื่องฉันขอแนะนำให้ใช้:

git reset --hard HEAD^^

Rebase เป็นการดำเนินการที่แตกต่างอย่างสิ้นเชิงซึ่งจะไม่ช่วยคุณที่นี่


24
หากคุณได้ผลักดันการเปลี่ยนแปลงนี้ไปยังที่เก็บระยะไกลแล้ว คุณสามารถลบออกได้ด้วย git push -f
Ivan Fernandez

คุณสามารถสรุปสิ่งนี้สำหรับ n จำนวนคอมมิตสุดท้ายได้ไหม
user_19

6
@ user_19 คุณสามารถทำสิ่งต่างๆเช่นgit reset --hard HEAD^4หรือgit reset --hard HEAD~4. แม้ว่าสิ่งต่างๆอาจซับซ้อนเล็กน้อยหากประวัติของคุณมีการรวมเข้าด้วยกัน คุณสามารถค้นหาข้อมูลเพิ่มเติมเกี่ยวกับการระบุการแก้ไขในส่วนที่สอดคล้องกันที่นี่
KL-7

2
ถ้าฉันต้องการลบการกระทำ 7 ครั้งสุดท้ายแล้วล่ะ ?? ฉันต้องใส่ 7 ครั้ง ^ หลัง HEAD ... โปรดเคลียร์ฉัน
Gagan Gami

4
@GaganGami ฉันคิดว่าคุณจะทำgit reset --hard HEAD~7แต่โปรดแก้ไขฉันถ้าฉันผิด
Con Antonakos

106

หากคุณต้องการลบ 2 (สอง) คอมมิตสุดท้ายมีคำสั่งง่ายๆในการทำเช่นนั้น:

git reset --hard HEAD~2

คุณสามารถเปลี่ยนค่าคอม2มิตสุดท้ายจำนวนเท่าใดก็ได้ที่ต้องการลบ

และในการส่งการเปลี่ยนแปลงนี้ไปยังรีโมตคุณต้องดำเนินการgit pushกับพารามิเตอร์force ( -f):

git push -f

อย่างไรก็ตามฉันไม่แนะนำให้ทำgitคำสั่ง-fหรือ--hardตัวเลือกใด ๆ ที่เกี่ยวข้องหากมีการคอมมิตใหม่บนรีโมต (Github) หลังจากนี้คอมมิตที่คุณต้องการลบ git revertในกรณีที่ใช้เสมอ


การเปลี่ยนแปลงที่ฉันทำจะยังคงอยู่หรือไม่
Zuhayer Tahir

@SymfonyUser เลขที่ เมื่อคุณทำhardคำสั่งคุณหลวมสองกระทำ หากคุณต้องการบันทึกการเปลี่ยนแปลงให้สร้างdiffไฟล์ของข้อตกลงเหล่านี้ก่อนใช้การรีเซ็ต
Dherik

3
@ZuhayerTahir หากคุณต้องการเพียงแค่ยกเลิกการกระทำสำหรับการกระทำ 5 ครั้งสุดท้ายให้ทำgit reset HEAD~5(อย่าใช้hard) ด้วยวิธีนี้คุณจะได้รับการเปลี่ยนแปลงของคุณในสถานะทีละขั้น (เช่นไม่ได้กระทำ) สำหรับฉันดูคำตอบนี้
น้ำผึ้ง

@Honey ขอบคุณสำหรับการตอบกลับ ฉันได้ข้อสรุปเดียวกัน
Zuhayer Tahir

29

ต่อไปนี้ใช้ได้ผลสำหรับฉัน

git reset HEAD~n

จะลบคอมมิตสุดท้ายnออกจาก repo ในเครื่องเนื่องจากHEAD^ลบเพียงรายการเดียว หากคุณต้องการลบการเปลี่ยนแปลงเหล่านี้ออกจากระยะไกลคุณอาจต้องกดบังคับเนื่องจากคุณจะอยู่หลังรีโมต

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