Git คือ ตอนที่ 5 : การเลิกทำการเปลี่ยนแปลง (Undoing Changes)

เมื่อคุณทำงานกับแอปพลิเคชัน ระบบควบคุมเวอร์ชันเช่น Git มีความสำคัญอย่างยิ่งในการติดตามการเปลี่ยนแปลง ทำงานร่วมกับนักพัฒนารายอื่นในการทำแอพ และรักษาประวัติที่สะอาดและเป็นระเบียบ หนึ่งในคุณสมบัติที่ทรงพลังที่สุดของ Git คือความสามารถในการ “undo” การเปลี่ยนแปลง ไม่ว่าคุณจะทำโค้ดผิดพลาด คอมมิตเร็วเกินไป หรือแม้กระทั่งคอมมิชชันหาย Git ก็มีเครื่องมือมากมายสำหรับย้อนรอย บทความนี้จะแนะนำคุณเกี่ยวกับคำสั่ง Git ที่จำเป็นเหล่านี้และแสดงให้เห็นว่าคุณสามารถใช้คำสั่งเหล่านั้นในบริบทของการทำแอพได้อย่างไร

1. การคืนค่าการยอมรับการเปลี่ยนแปลง (Commits)

ลองจินตนาการว่าคุณกำลังทำแอพและคุณเพิ่งเพิ่มคุณลักษณะใหม่เข้าไป หลังจากยอมรับการเปลี่ยนแปลง คุณพบว่าคุณลักษณะนี้ก่อให้เกิดปัญหามากกว่าที่แก้ไข นั่นคือสิ่งที่ git revert คำสั่งมีประโยชน์

คำ git revert สั่งสร้างการยืนยันใหม่ที่ยกเลิกการเปลี่ยนแปลงที่เกิดขึ้นในการยืนยันก่อนหน้านี้ คำสั่งนี้ปลอดภัยที่จะใช้ใน repository สาธารณะเนื่องจากไม่เปลี่ยนแปลงประวัติการคอมมิตที่มีอยู่ ไวยากรณ์คือ:

git revert [commit]

คุณสามารถค้นหาคอมมิชชันแฮชโดยใช้ git log แทนที่[commit]ด้วยแฮชของการคอมมิตที่คุณต้องการเปลี่ยนกลับ คำสั่งจะเปิดตัวแก้ไขข้อความที่กำหนดค่าของคุณเพื่อป้อนข้อความยืนยันสำหรับการคืนค่าใหม่

ตัวอย่างเช่น หากคุณแนะนำจุดบกพร่องด้วย commit abc123 คุณจะต้องใช้ git revert abc123 การดำเนินการนี้จะสร้างการคอมมิตใหม่ที่เลิกทำการเปลี่ยนแปลงที่เกิดขึ้น ใน abc123 ขณะที่ยังคงรักษาประวัติเดิมไว้

2. รีเซ็ตไดเร็กทอรีการทำงานของคุณ

ในบางครั้ง คุณอาจทำการเปลี่ยนแปลงกับแอปที่คุณต้องการยกเลิกทั้งหมด ใน Git git reset เป็นเครื่องมือสำหรับงานนี้

คำ git reset สั่งจะย้ายHEADตัวชี้ไปยังการกระทำที่ระบุ ซึ่งจะ “rewinding” โปรเจ็กต์ของคุณไปยังจุดนั้นได้อย่างมีประสิทธิภาพ มีสามโหมดหลัก: อ่อน ผสม (default) และยาก

2.1 ซอฟต์รีเซ็ต (Soft Reset)

ซอฟต์รีเซ็ต ( git reset --soft [commit]) ย้ายHEADไปยังคอมมิชชันอื่น แต่จะปล่อยให้ดัชนีการแสดงละครและไดเร็กทอรีการทำงานไม่ถูกแตะต้อง เหมือนกับว่าไม่ได้ [commit] ทำคอมมิชชันหลังจากนั้น แต่การเปลี่ยนแปลงจะถูกรักษาไว้และจัดฉาก

2.2 รีเซ็ตแบบผสม (Mixed Reset)

การรีเซ็ตแบบผสม ( git reset --mixed [commit] หรือ git reset [commit]) จะย้าย HEAD และรีเซ็ตดัชนีการจัดเตรียมให้ตรงกัน [commit] แต่ปล่อยให้ไดเร็กทอรีทำงานเพียงอย่างเดียว การเปลี่ยนแปลงจะถูกรักษาไว้แต่ไม่ได้จัดฉาก

2.3 ฮาร์ดรีเซ็ต (Hard Reset)

การฮาร์ดรีเซ็ต ( git reset --hard [commit]) เป็นรูปแบบที่รุนแรงที่สุด โดยจะย้าย HEAD รีเซ็ตดัชนีการจัดเตรียม และเปลี่ยนไดเร็กทอรีการทำงานให้ [commit] ตรงกัน การเปลี่ยนแปลงใด ๆ ที่เกิดขึ้นหลังจากนั้น [commit] จะหายไปโดยสิ้นเชิง

ใช้ฮาร์ดรีเซ็ตด้วยความระมัดระวัง หากมีการเปลี่ยนแปลงที่ไม่มีข้อผูกมัดในพื้นที่จัดเตรียมหรือไดเร็กทอรีการทำงาน การเปลี่ยนแปลงเหล่านั้นจะสูญหายไป

3. การใช้ Reflog เพื่อกู้คืน Commits ที่หายไป

หากคุณเคยใช้ git reset และรู้ว่าคุณต้องการคอมมิชชันบางส่วนที่คุณทิ้งไป ไม่ต้องตกใจ Git มีกลไกในตัวสำหรับกู้คืนคอมมิชชันที่หายไปซึ่งเรียกว่า reflog

ทุกการกระทำใน Git ที่ย้ายHEADจะทิ้งบันทึกไว้ในบันทึกการอ้างอิง หรือ reflog หากต้องการดู reflog ให้ใช้คำ git reflog สั่ง นี่แสดงรายการการกระทำที่ผ่านมาของคุณตามลำดับเวลาย้อนกลับ โดยแต่ละรายการมีแฮช

หากคุณเห็นคอมมิชชันที่หายไปใน reflog คุณสามารถกู้คืนได้โดย git reset ใช้ ตัวอย่างเช่น หากคอมมิตแฮชใน reflog คือ abc123 คุณจะใช้ git reset --hard abc123 เพื่อกู้คืนโปรเจ็กต์ของคุณเป็นสถานะนั้น

reflog เป็นเครือข่ายความปลอดภัยและเป็นหนึ่งในเครื่องมือที่ทรงพลังที่สุดของ Git มีวิธีเลิกทำเกือบทุกอย่างและทำให้โครงการของคุณกลับสู่สถานะการทำงาน

4. การจัดเก็บการเปลี่ยนแปลง (Stashing Changes)

ในขณะที่ทำแอพ อาจมีบางครั้งที่คุณกำลังทำงานกับฟีเจอร์ใหม่หรือแก้ไขจุดบกพร่อง และจำเป็นต้องเปลี่ยนสาขาเพื่อทำงานอย่างอื่น แต่คุณไม่ต้องการทำงานครึ่งๆกลางๆ นั่นคือสิ่ง git stash ที่เข้ามา

คำ git stash สั่งจะบันทึกการเปลี่ยนแปลงชั่วคราวที่คุณยังไม่ได้ยืนยัน เพื่อให้คุณสามารถเรียกคืนได้ในภายหลัง เมื่อคุณพร้อมที่จะทำงานต่อ คุณสามารถเรียกคืนการเปลี่ยนแปลงที่เก็บไว้ git stash apply ด้วย

นี่คือวิธีการทำงาน:

หากคุณกำลังทำงานกับแอปและมีการเปลี่ยนแปลงในไดเร็กทอรีการทำงานที่คุณต้องการซ่อน เพียง git stash พิมพ์ หากต้องการรับการเปลี่ยนแปลงในภายหลัง คุณสามารถ git stash apply ใช้ หากคุณมีที่ซ่อนหลายอันและต้องการใช้อันใดอันหนึ่ง ให้ใช้ git stash list เพื่อดูทั้งหมดและ git stash apply stash@{n} ใช้อันที่คุณต้องการnจำนวนของที่ซ่อนอยู่ ที่ไหน

คุณลักษณะนี้เป็นวิธีที่ดีในการทำให้ประวัติการกระทำของคุณสะอาดและจัดระเบียบงานของคุณ โดยเฉพาะอย่างยิ่งเมื่อคุณต้องการสลับไปมาระหว่างงานต่างๆ ในกระบวนการทำแอพของคุณ


Git เป็นเครื่องมือที่มีประสิทธิภาพในมือของนักพัฒนา และการทำความเข้าใจวิธีเลิกทำการเปลี่ยนแปลงอย่างมีประสิทธิภาพเป็นทักษะที่สำคัญในการทำแอพ ไม่ว่าคุณจะต้องการคืนค่าคอมมิชชันที่มีปัญหา รีเซ็ตโปรเจ็กต์ของคุณเป็นสถานะก่อนหน้า กู้คืนคอมมิตที่หายไป หรือซ่อนการเปลี่ยนแปลงไว้ใช้ในภายหลัง Git มีวิธีแก้ปัญหาสำหรับคุณ

อย่างไรก็ตาม สิ่งสำคัญคือต้องระมัดระวังเมื่อใช้คำสั่งเหล่านี้ โดยเฉพาะอย่างยิ่งคำสั่งที่เปลี่ยนแปลงประวัติการคอมมิตของคุณอย่างถาวร git reset --hard เช่น ตรวจสอบให้แน่ใจเสมอว่าคุณได้สำรองโค้ดของคุณหรือโค้ดของคุณถูกพุชไปยังที่เก็บระยะไกลก่อนที่จะใช้คำสั่งทำลายล้าง ด้วย Git คุณพร้อมรับมือกับข้อผิดพลาด ปรับตัวให้เข้ากับข้อกำหนดที่เปลี่ยนแปลง และรักษาประวัติการคอมมิตที่สะอาดและมีประโยชน์


Git คืออะไร

Git คือ ตอนที่ 4 : การทำงานระยะไกล (Remotes) และการทำงานร่วมกัน (Collaboration)
Git คือ ตอนที่ 6 : เทคนิคขั้นสูง (Advanced Techniques)