การเลิกกระทำนั้นน่ากลัวนิดหน่อยถ้าคุณไม่รู้ว่ามันทำงานอย่างไร แต่จริงๆแล้วมันเป็นเรื่องง่ายอย่างน่าอัศจรรย์ถ้าคุณเข้าใจ
สมมติว่าคุณมีสิ่งนี้โดยที่ C คือ HEAD ของคุณและ (F) คือสถานะของไฟล์ของคุณ
(F)
A-B-C
↑
master
คุณต้องการที่จะNuke กระทำ C และไม่เคยเห็นมันอีกครั้งและสูญเสียการเปลี่ยนแปลงทั้งหมดในการแก้ไขไฟล์ในท้องถิ่น คุณทำสิ่งนี้:
git reset --hard HEAD~1
ผลลัพธ์คือ:
(F)
A-B
↑
master
ตอนนี้ B คือ HEAD เนื่องจากคุณใช้--hard
ไฟล์ของคุณจะถูกรีเซ็ตเป็นสถานะเมื่อคอมมิชชัน B
อ้า แต่คิดว่าคอมมิชไม่ใช่ภัยพิบัติ แต่เพียงเล็กน้อย คุณต้องการยกเลิกการคอมมิชชัน แต่ทำการเปลี่ยนแปลงเพื่อแก้ไขเล็กน้อยก่อนที่จะทำการคอมมิชชันที่ดีขึ้น เริ่มต้นอีกครั้งจากที่นี่ด้วย C ในฐานะหัวหน้าของคุณ:
(F)
A-B-C
↑
master
คุณสามารถทำได้โดยออกจาก--hard
:
git reset HEAD~1
ในกรณีนี้ผลลัพธ์คือ:
(F)
A-B-C
↑
master
ในทั้งสองกรณี HEAD เป็นเพียงตัวชี้ไปยังการคอมมิทล่าสุด เมื่อคุณทำคุณจะgit reset HEAD~1
บอก Git ให้ย้ายตัวชี้ HEAD กลับหนึ่งคำสั่ง แต่ (เว้นแต่คุณจะใช้--hard
) คุณปล่อยไฟล์ไว้เหมือนเดิม ดังนั้นตอนนี้git status
แสดงให้เห็นถึงการเปลี่ยนแปลงที่คุณได้ตรวจสอบใน C. คุณไม่ได้สูญเสียอะไร!
สำหรับการสัมผัสที่เบาที่สุดคุณสามารถยกเลิกการคอมมิทได้ แต่ทิ้งไฟล์และดัชนีไว้ :
git reset --soft HEAD~1
สิ่งนี้ไม่เพียง แต่ปล่อยให้ไฟล์ของคุณอยู่คนเดียวมันยังทำให้ดัชนีของคุณอยู่คนเดียว เมื่อคุณทำเช่นgit status
นั้นคุณจะเห็นว่าไฟล์เดียวกันอยู่ในดัชนีเหมือนเดิม อันที่จริงหลังจากคำสั่งนี้คุณสามารถทำได้git commit
และคุณจะทำซ้ำการกระทำที่คุณเพิ่งมี
อีกอย่างหนึ่ง: สมมติว่าคุณทำลายการกระทำดังในตัวอย่างแรกแต่แล้วคุณก็ค้นพบว่าคุณต้องการมันใช่ไหม? โชคดีใช่มั้ย
ไม่ยังคงมีวิธีที่จะได้รับคืน พิมพ์git reflog
และคุณจะเห็นรายการ (บางส่วน) ที่ใช้shas (นั่นคือแฮช) ที่คุณย้ายไปมาค้นหาสิ่งที่คุณทำลายและทำสิ่งนี้:
git checkout -b someNewBranchName shaYouDestroyed
ตอนนี้คุณฟื้นคืนชีพที่กระทำ การกระทำนั้นไม่ได้ถูกทำลายใน Git เป็นเวลา 90 วันดังนั้นคุณสามารถกลับไปช่วยคนที่คุณไม่ได้ตั้งใจจะกำจัดได้