เมื่อทำการบำรุงรักษาโค้ดโดยใช้ระบบควบคุมเวอร์ชัน เช่น git เป็นสิ่งที่หลีกเลี่ยงไม่ได้ที่เราจะต้องย้อนกลับการคอมมิตที่ผิดพลาดบางส่วน ไม่ว่าจะเป็นเพราะข้อบกพร่องหรือการย้อนกลับโค้ดชั่วคราว ในกรณีนี้ นักพัฒนาที่ยังใหม่จะรู้สึกประหม่ามาก เพราะพวกเขาอาจสับสนว่าจะต้องทำอย่างไรเพื่อย้อนกลับการเปลี่ยนแปลงโดยไม่ส่งผลกระทบต่อผู้อื่น แต่สำหรับนักพัฒนาที่มีประสบการณ์ นี่คืองานประจำของพวกเขา และพวกเขาสามารถแสดงวิธีต่างๆ ในการทำสิ่งนั้นให้คุณได้
ในโพสต์นี้ เราจะแนะนำวิธีหลักสองวิธีที่นักพัฒนาใช้บ่อยๆ
- git reset
- git revert
ความแตกต่างและกรณีการใช้งานที่เกี่ยวข้องคืออะไร เราจะพูดคุยกันในรายละเอียดด้านล่าง
git reset
สมมติว่าเรามีการคอมมิตดังต่อไปนี้
Commit A และ B เป็นคอมมิตที่ใช้งานได้ แต่ commit C และ D เป็นคอมมิตที่ไม่ดี ตอนนี้เราต้องการย้อนกลับไปที่ commit B และทิ้ง commit C และ D ปัจจุบัน HEAD ชี้ไปที่ commit D 5lk4er เราเพียงแค่ต้องชี้ HEAD ไปที่ commit B a0fvf8 เพื่อให้ได้สิ่งที่เราต้องการ
การใช้คำสั่ง git reset เป็นเรื่องง่าย
git reset --hard a0fvf8
หลังจากรันคำสั่งข้างต้น HEAD จะชี้ไปที่ commit B
แต่ตอนนี้ remote origin ยังคงมี HEAD ชี้ไปที่ commit D หากเราใช้ git push เพื่อพุชการเปลี่ยนแปลงโดยตรง จะไม่ทำการอัปเดต remote repo เราต้องเพิ่มออปชัน -f เพื่อบังคับพุชการเปลี่ยนแปลง
git push -f
ข้อเสียของวิธีนี้คือคอมมิตทั้งหมดหลังจาก HEAD จะหายไปเมื่อทำการรีเซ็ตเสร็จสิ้น ในกรณีที่วันหนึ่งเราพบว่าคอมมิตบางส่วนเป็นคอมมิตที่ดีและต้องการเก็บไว้ ก็สายเกินไป ด้วยเหตุนี้ หลายบริษัทจึงห้ามใช้วิธีนี้ในการย้อนกลับการเปลี่ยนแปลง
git revert
การใช้ git revert คือการสร้างคอมมิตใหม่ซึ่งจะย้อนกลับคอมมิตก่อนหน้า HEAD จะชี้ไปที่คอมมิตที่ย้อนกลับใหม่
สำหรับตัวอย่างของ git reset ด้านบน สิ่งที่เราต้องทำคือการย้อนกลับ commit D แล้วจึงย้อนกลับ commit C
git revert 5lk4er
git revert 76sdeb
ตอนนี้จะสร้างคอมมิตใหม่สองรายการคือ D' และ C'
ในตัวอย่างข้างต้น เรามีคอมมิตเพียงสองรายการที่จะย้อนกลับ ดังนั้นเราจึงสามารถย้อนกลับทีละรายการได้ แต่ถ้ามีคอมมิตจำนวนมากที่จะย้อนกลับล่ะ เราสามารถย้อนกลับช่วงได้จริงๆ
git revert OLDER_COMMIT^..NEWER_COMMIT
วิธีนี้จะไม่มีข้อเสียของ git reset โดยจะชี้ HEAD ไปที่คอมมิตที่ย้อนกลับที่สร้างขึ้นใหม่ และสามารถพุชการเปลี่ยนแปลงไปยัง remote ได้โดยตรงโดยไม่ต้องใช้ตัวเลือก -f
ตอนนี้ลองมาดูตัวอย่างที่ยากขึ้น สมมติว่าเรามีสามคอมมิต แต่คอมมิตที่ไม่ดีคือคอมมิตที่สอง
ไม่ใช่ความคิดที่ดีที่จะใช้ git reset เพื่อย้อนกลับคอมมิต B เนื่องจากเราต้องเก็บคอมมิต C ไว้เนื่องจากเป็นคอมมิตที่ดี ตอนนี้เราสามารถย้อนกลับคอมมิต C และ B แล้วใช้ cherry-pick เพื่อคอมมิต C อีกครั้ง
จากคำอธิบายข้างต้น เราจะพบว่าความแตกต่างที่ใหญ่ที่สุดระหว่าง git reset และ git revert คือ git reset จะรีเซ็ตสถานะของ branch ไปยังสถานะก่อนหน้าโดยการทิ้งการเปลี่ยนแปลงทั้งหมดหลังจากคอมมิตที่ต้องการ ในขณะที่ git revert จะรีเซ็ตไปยังสถานะก่อนหน้าโดยการสร้างคอมมิตที่ย้อนกลับใหม่และเก็บคอมมิตเดิมไว้ ขอแนะนำให้ใช้ git revert แทน git reset ในสภาพแวดล้อมขององค์กร
อ้างอิง: https://kknews.cc/news/4najez2.html
Really hard to take anything you say seriously when you use the entire aplhabet for your hexadecimal SHA1 examples.