Git Reset vs Revert vs Rebase
เผยแพร่แล้ว: 2021-05-20ในบทความนี้ คุณจะได้เรียนรู้เกี่ยวกับวิธีการต่างๆ ในการเล่นกับคอมมิตใน Git
ในฐานะนักพัฒนา คุณจะต้องเผชิญกับสถานการณ์ดังกล่าวหลายครั้งซึ่งคุณต้องการย้อนกลับไปยังการคอมมิตครั้งก่อนของคุณ แต่ไม่แน่ใจว่าต้องทำอย่างไร และแม้ว่าคุณจะรู้คำสั่ง Git เช่น reset, revert, rebase คุณก็ไม่ทราบถึงความแตกต่างระหว่างคำสั่งเหล่านี้ มาเริ่มกันและทำความเข้าใจว่า git reset, revert และ rebase คืออะไร
Git รีเซ็ต
การรีเซ็ต Git เป็นคำสั่งที่ซับซ้อน และใช้เพื่อเลิกทำการเปลี่ยนแปลง
คุณสามารถนึกถึงการรีเซ็ต git เป็นคุณสมบัติย้อนกลับ ด้วยการรีเซ็ต git คุณสามารถข้ามไปมาระหว่างการคอมมิตต่างๆ การรันคำสั่ง git reset มีสามโหมด: –soft, –mixed และ –hard โดยค่าเริ่มต้น คำสั่ง git reset จะใช้โหมดผสม ในเวิร์กโฟลว์การรีเซ็ต git กลไกการจัดการภายในสามกลไกของ git จะเข้ามาในรูปภาพ: HEAD , staging area (index) และ ไดเร็กทอรีการทำงาน

ไดเร็กทอรีการทำงานคือที่ที่คุณกำลังทำงานอยู่ เป็นที่ที่มีไฟล์ของคุณอยู่ การใช้คำสั่งสถานะ git คุณสามารถดูไฟล์/โฟลเดอร์ทั้งหมดที่มีอยู่ในไดเร็กทอรีการทำงาน
Staging Area (ดัชนี) เป็นที่ที่ git ติดตามและบันทึกการเปลี่ยนแปลงทั้งหมดในไฟล์ การเปลี่ยนแปลงที่บันทึกไว้จะแสดงในไดเร็กทอรี .git คุณใช้ git add “filename” เพื่อเพิ่มไฟล์ลงในพื้นที่จัดเตรียม และเหมือนเมื่อก่อน เมื่อคุณรันสถานะ git คุณจะเห็นว่ามีไฟล์ใดบ้างในพื้นที่แสดง
สาขาปัจจุบันใน Git เรียกว่า HEAD ซึ่งชี้ไปที่การคอมมิตล่าสุด ซึ่งเกิดขึ้นในสาขาการชำระเงินปัจจุบัน จะถือเป็นตัวชี้สำหรับการอ้างอิงใดๆ เมื่อคุณชำระเงินไปยังสาขาอื่นแล้ว HEAD ก็จะย้ายไปที่สาขาใหม่ด้วย
ให้ฉันอธิบายว่าการรีเซ็ต git ทำงานอย่างไรในโหมดฮาร์ด ซอฟต์ และโหมดผสม โหมดฮาร์ดใช้เพื่อไปที่การคอมมิตแบบชี้ ไดเร็กทอรีการทำงานจะถูกเติมด้วยไฟล์ของการคอมมิตนั้น และพื้นที่การแสดงละครจะถูกรีเซ็ต ในซอฟต์รีเซ็ต เฉพาะตัวชี้เท่านั้นที่เปลี่ยนเป็นคอมมิตที่ระบุ ไฟล์ของการคอมมิตทั้งหมดยังคงอยู่ในไดเร็กทอรีการทำงานและพื้นที่การจัดเตรียมก่อนการรีเซ็ต ในโหมดผสม (ค่าเริ่มต้น) ตัวชี้และพื้นที่การแสดงละครจะถูกรีเซ็ตทั้งคู่
Git รีเซ็ตฮาร์ด
วัตถุประสงค์ของการฮาร์ดรีเซ็ต git คือการย้าย HEAD ไปยังการคอมมิตที่ระบุ มันจะลบการคอมมิตทั้งหมดที่เกิดขึ้นหลังจากการคอมมิตที่ระบุ คำสั่งนี้จะเปลี่ยนประวัติการคอมมิตและชี้ไปที่การคอมมิตที่ระบุ
ในตัวอย่างนี้ ฉันจะเพิ่มไฟล์ใหม่สามไฟล์ คอมมิตไฟล์ จากนั้นทำการฮาร์ดรีเซ็ต
ดังที่คุณเห็นจากคำสั่งด้านล่าง ตอนนี้ ไม่มีอะไรให้คอมมิต
$ git status On branch master Your branch is ahead of 'origin/master' by 2 commits. (use "git push" to publish your local commits) nothing to commit, working tree cleanตอนนี้ฉันจะสร้างไฟล์ 3 ไฟล์และเพิ่มเนื้อหาลงไป
$ vi file1.txt $ vi file2.txt $ vi file3.txtเพิ่มไฟล์เหล่านี้ไปยังที่เก็บที่มีอยู่
$ git add file*เมื่อคุณรันคำสั่งสถานะอีกครั้ง มันจะสะท้อนถึงไฟล์ใหม่ที่ฉันเพิ่งสร้างขึ้น
$ git status On branch master Your branch is ahead of 'origin/master' by 2 commits. (use "git push" to publish your local commits) Changes to be committed: (use "git restore --staged <file>..." to unstage) new file: file1.txt new file: file2.txt new file: file3.txtก่อนทำคอมมิชชัน ให้ฉันแสดงให้คุณเห็นก่อนว่า ขณะนี้ฉันมีบันทึกของคอมมิต 3 รายการใน Git
$ git log --oneline 0db602e (HEAD -> master) one more commit 59c86c9 new commit e2f44fc (origin/master, origin/HEAD) testตอนนี้ฉันจะส่งไปยังที่เก็บ
$ git commit -m 'added 3 files' [master d69950b] added 3 files 3 files changed, 3 insertions(+) create mode 100644 file1.txt create mode 100644 file2.txt create mode 100644 file3.txtถ้าฉันทำ ls-files คุณจะเห็นว่ามีการเพิ่มไฟล์ใหม่
$ git ls-files demo dummyfile newfile file1.txt file2.txt file3.txtเมื่อฉันรันคำสั่ง log ใน git ฉันมี 4 คอมมิต และ HEAD จะชี้ไปที่คอมมิตล่าสุด
$ git log --oneline d69950b (HEAD -> master) added 3 files 0db602e one more commit 59c86c9 new commit e2f44fc (origin/master, origin/HEAD) testหากฉันไปและลบไฟล์ file1.txt ด้วยตนเองและทำสถานะ git มันจะแสดงข้อความว่าการเปลี่ยนแปลงไม่ได้ถูกจัดฉากสำหรับการคอมมิต
$ git status On branch master Your branch is ahead of 'origin/master' by 3 commits. (use "git push" to publish your local commits) Changes not staged for commit: (use "git add/rm <file>..." to update what will be committed) (use "git restore <file>..." to discard changes in working directory) deleted: file1.txt no changes added to commit (use "git add" and/or "git commit -a")ตอนนี้ฉันจะเรียกใช้คำสั่งฮาร์ดรีเซ็ต
$ git reset --hard HEAD is now at d69950b added 3 filesถ้าฉันตรวจสอบสถานะอีกครั้ง ฉันจะพบว่าไม่มีอะไรให้คอมมิต และไฟล์ที่ฉันลบได้กลับมาอยู่ในที่เก็บแล้ว การย้อนกลับเกิดขึ้นเนื่องจากหลังจากลบไฟล์ ฉันไม่ได้คอมมิต ดังนั้นหลังจากฮาร์ดรีเซ็ต ไฟล์จะกลับสู่สถานะก่อนหน้า
$ git status On branch master Your branch is ahead of 'origin/master' by 3 commits. (use "git push" to publish your local commits) nothing to commit, working tree cleanถ้าฉันตรวจสอบ log ของ git มันจะออกมาเป็นแบบนี้
$ git log commit d69950b7ea406a97499e07f9b28082db9db0b387 (HEAD -> master) Author: mrgeek <[email protected]> Date: Mon May 17 19:53:31 2020 +0530 added 3 files commit 0db602e085a4d59cfa9393abac41ff5fd7afcb14 Author: mrgeek <[email protected]> Date: Mon May 17 01:04:13 2020 +0530 one more commit commit 59c86c96a82589bad5ecba7668ad38aa684ab323 Author: mrgeek <[email protected]> Date: Mon May 17 00:54:53 2020 +0530 new commit commit e2f44fca2f8afad8e4d73df6b72111f2f2fd71ad (origin/master, origin/HEAD) Author: mrgeek <[email protected]> Date: Mon May 17 00:16:33 2020 +0530 testวัตถุประสงค์ของฮาร์ดรีเซ็ตคือเพื่อชี้ไปที่การคอมมิตที่ระบุและอัพเดตไดเร็กทอรีการทำงานและพื้นที่การแสดงละคร ผมขอแสดงให้คุณเห็นอีกตัวอย่างหนึ่ง ปัจจุบัน การแสดงภาพการกระทำของฉันมีลักษณะดังนี้:

ที่นี่ ฉันจะรันคำสั่งด้วย HEAD^ ซึ่งหมายความว่าฉันต้องการรีเซ็ตการคอมมิตครั้งก่อน (หนึ่งคอมมิชชันย้อนกลับ)
$ git reset --hard HEAD^ HEAD is now at 0db602e one more commitคุณจะเห็นว่าตัวชี้ส่วนหัวเปลี่ยนเป็น 0db602e จาก d69950b แล้ว
$ git log --oneline 0db602e (HEAD -> master) one more commit 59c86c9 new commit e2f44fc (origin/master, origin/HEAD) test 
หากคุณตรวจสอบบันทึก การคอมมิตของ d69950b หายไป และตอนนี้ส่วนหัวชี้ไปที่ 0db602e SHA
$ git log commit 0db602e085a4d59cfa9393abac41ff5fd7afcb14 (HEAD -> master) Author: mrgeek <[email protected]> Date: Mon May 17 01:04:13 2020 +0530 one more commit commit 59c86c96a82589bad5ecba7668ad38aa684ab323 Author: mrgeek <[email protected]> Date: Mon May 17 00:54:53 2020 +0530 new commit commit e2f44fca2f8afad8e4d73df6b72111f2f2fd71ad (origin/master, origin/HEAD) Author: mrgeek <[email protected]> Date: Mon May 17 00:16:33 2020 +0530 Testหากคุณเรียกใช้ ls-files คุณจะเห็น file1.txt, file2.txt และ files3.txt ไม่อยู่ในที่เก็บอีกต่อไปเนื่องจากการกระทำนั้นและไฟล์ถูกลบหลังจากการฮาร์ดรีเซ็ต
$ git ls-files demo dummyfile newfileGit Soft Reset
ในทำนองเดียวกัน ตอนนี้ฉันจะแสดงตัวอย่างซอฟต์รีเซ็ตให้คุณดู พิจารณา ฉันได้เพิ่ม 3 ไฟล์อีกครั้งตามที่กล่าวข้างต้นและมุ่งมั่น บันทึก git จะปรากฏขึ้นดังที่แสดงด้านล่าง คุณจะเห็นว่า 'ซอฟต์รีเซ็ต' เป็นคอมมิตล่าสุดของฉัน และ HEAD ก็ชี้ไปที่สิ่งนั้นด้วย
$ git log --oneline aa40085 (HEAD -> master) soft reset 0db602e one more commit 59c86c9 new commit e2f44fc (origin/master, origin/HEAD) testดูรายละเอียดการคอมมิตในบันทึกได้โดยใช้คำสั่งด้านล่าง
$ git log commit aa400858aab3927e79116941c715749780a59fc9 (HEAD -> master) Author: mrgeek <[email protected]> Date: Mon May 17 21:01:36 2020 +0530 soft reset commit 0db602e085a4d59cfa9393abac41ff5fd7afcb14 Author: mrgeek <[email protected]> Date: Mon May 17 01:04:13 2020 +0530 one more commit commit 59c86c96a82589bad5ecba7668ad38aa684ab323 Author: mrgeek <[email protected]> Date: Mon May 17 00:54:53 2020 +0530 new commit commit e2f44fca2f8afad8e4d73df6b72111f2f2fd71ad (origin/master, origin/HEAD) Author: mrgeek <[email protected]> Date: Mon May 17 00:16:33 2020 +0530 testตอนนี้ใช้ซอฟต์รีเซ็ต ฉันต้องการเปลี่ยนไปใช้คอมมิตที่เก่ากว่าด้วย SHA 0db602e085a4d59cfa9393abac41ff5fd7afcb14

ในการทำเช่นนั้น ฉันจะเรียกใช้คำสั่งด้านล่าง คุณต้องส่งอักขระเริ่มต้นของ SHA มากกว่า 6 ตัว ไม่จำเป็นต้องใช้ SHA ที่สมบูรณ์
$ git reset --soft 0db602e085a4ตอนนี้เมื่อฉันรันบันทึก git ฉันจะเห็นว่า HEAD ถูกรีเซ็ตเป็นคอมมิตที่ฉันระบุ
$ git log commit 0db602e085a4d59cfa9393abac41ff5fd7afcb14 (HEAD -> master) Author: mrgeek <[email protected]> Date: Mon May 17 01:04:13 2020 +0530 one more commit commit 59c86c96a82589bad5ecba7668ad38aa684ab323 Author: mrgeek <[email protected]> Date: Mon May 17 00:54:53 2020 +0530 new commit commit e2f44fca2f8afad8e4d73df6b72111f2f2fd71ad (origin/master, origin/HEAD) Author: mrgeek <[email protected]> Date: Mon May 17 00:16:33 2020 +0530 testแต่ความแตกต่างที่นี่คือ ไฟล์ของการคอมมิต (aa400858aab3927e79116941c715749780a59fc9) ที่ฉันเพิ่มไป 3 ไฟล์ยังคงอยู่ในไดเร็กทอรีการทำงานของฉัน พวกเขาไม่ได้ถูกลบ นั่นเป็นเหตุผลที่คุณควรใช้ซอฟต์รีเซ็ตมากกว่าฮาร์ดรีเซ็ต ไม่มีความเสี่ยงที่จะสูญเสียไฟล์ในโหมดซอฟต์
$ git ls-files demo dummyfile file1.txt file2.txt file3.txt newfileGit Revert
ใน Git คำสั่ง revert ใช้เพื่อดำเนินการย้อนกลับ กล่าวคือ เพื่อย้อนกลับการเปลี่ยนแปลงบางอย่าง มันคล้ายกับคำสั่งรีเซ็ต แต่ข้อแตกต่างเพียงอย่างเดียวที่นี่คือ คุณทำการคอมมิตใหม่เพื่อกลับไปยังการคอมมิตเฉพาะ กล่าวโดยย่อ เป็นการยุติธรรมที่จะบอกว่าคำสั่ง git revert เป็นคำสั่ง
คำสั่งเปลี่ยนกลับของ Git จะไม่ลบข้อมูลใด ๆ ขณะดำเนินการเปลี่ยนกลับ
สมมติว่าฉันกำลังเพิ่ม 3 ไฟล์และดำเนินการ git commit สำหรับตัวอย่างการย้อนกลับ
$ git commit -m 'add 3 files again' [master 812335d] add 3 files again 3 files changed, 3 insertions(+) create mode 100644 file1.txt create mode 100644 file2.txt create mode 100644 file3.txtบันทึกจะแสดงการคอมมิตใหม่
$ git log --oneline 812335d (HEAD -> master) add 3 files again 0db602e one more commit 59c86c9 new commit e2f44fc (origin/master, origin/HEAD) testตอนนี้ฉันต้องการเปลี่ยนกลับไปเป็นการกระทำในอดีตของฉัน สมมติว่า - "59c86c9 การคอมมิตใหม่" ฉันจะเรียกใช้คำสั่งด้านล่าง
$ git revert 59c86c9การดำเนินการนี้จะเปิดไฟล์ขึ้น คุณจะพบรายละเอียดของการคอมมิตที่คุณพยายามเปลี่ยนกลับไป และคุณสามารถตั้งชื่อการคอมมิตใหม่ได้ที่นี่ จากนั้นจึงบันทึกและปิดไฟล์
Revert "new commit" This reverts commit 59c86c96a82589bad5ecba7668ad38aa684ab323. # Please enter the commit message for your changes. Lines starting # with '#' will be ignored, and an empty message aborts the commit. # # On branch master # Your branch is ahead of 'origin/master' by 4 commits. # (use "git push" to publish your local commits) # # Changes to be committed: # modified: dummyfileหลังจากที่คุณบันทึกและปิดไฟล์ นี่คือผลลัพธ์ที่คุณจะได้รับ
$ git revert 59c86c9 [master af72b7a] Revert "new commit" 1 file changed, 1 insertion(+), 1 deletion(-)ตอนนี้เพื่อทำการเปลี่ยนแปลงที่จำเป็นซึ่งแตกต่างจากการรีเซ็ตการคืนค่าได้ดำเนินการใหม่อีกครั้ง หากคุณตรวจสอบบันทึกอีกครั้ง คุณจะพบการคอมมิตใหม่เนื่องจากการดำเนินการย้อนกลับ
$ git log --oneline af72b7a (HEAD -> master) Revert "new commit" 812335d add 3 files again 0db602e one more commit 59c86c9 new commit e2f44fc (origin/master, origin/HEAD) test 
บันทึก Git จะมีประวัติการคอมมิตทั้งหมด หากคุณต้องการลบการคอมมิตออกจากประวัติ การย้อนกลับไม่ใช่ตัวเลือกที่ดี แต่ถ้าคุณต้องการคงการเปลี่ยนแปลงการคอมมิตไว้ในประวัติ การย้อนกลับเป็นคำสั่งที่เหมาะสมแทนการรีเซ็ต
Git Rebase
ใน Git การรีเบสเป็นวิธีการย้ายหรือรวมการคอมมิตของสาขาหนึ่งไปยังอีกสาขาหนึ่ง ในฐานะนักพัฒนา ฉันจะไม่สร้างฟีเจอร์ของฉันบนมาสเตอร์แบรนช์ในสถานการณ์จริง ฉันจะทำงานในสาขาของตัวเอง ('สาขาคุณลักษณะ') และเมื่อฉันมีข้อผูกพันบางอย่างในสาขาคุณลักษณะของฉันโดยเพิ่มคุณลักษณะนี้ ฉันต้องการย้ายไปยังสาขาหลัก
การรีเบสบางครั้งอาจสร้างความสับสนเล็กน้อยในการทำความเข้าใจ เพราะมันคล้ายกับการผสานมาก เป้าหมายของการรวมและการ rebasing ทั้งสองคือการนำคอมมิตจากสาขาฟีเจอร์ของฉันมาวางบนมาสเตอร์แบรนช์หรือแบรนช์อื่น พิจารณาว่าฉันมีกราฟที่มีลักษณะดังนี้:

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

วิธีนี้จะให้กราฟเส้นตรงที่ชัดเจนพร้อมคอมมิตทั้งหมดติดต่อกัน

ทำให้ง่ายต่อการติดตามว่าการกระทำใดไปที่ไหน คุณสามารถจินตนาการได้ว่าถ้าคุณอยู่ในทีมที่มีนักพัฒนาจำนวนมาก การคอมมิตทั้งหมดยังคงอยู่ในแถวเดียวกัน ดังนั้นจึงเป็นเรื่องง่ายมากที่จะปฏิบัติตามแม้ว่าคุณจะมีคนจำนวนมากที่ทำงานในโครงการเดียวกันในเวลาเดียวกันก็ตาม
ผมขอแสดงให้คุณเห็นในทางปฏิบัติ
นี่คือลักษณะที่สาขาหลักของฉันดูเหมือนในปัจจุบัน มี 4 คอมมิชชัน
$ git log --oneline 812335d (HEAD -> master) add 3 files again 0db602e one more commit 59c86c9 new commit e2f44fc (origin/master, origin/HEAD) testฉันจะเรียกใช้คำสั่งด้านล่างเพื่อสร้างและสลับไปยังสาขาใหม่ที่ชื่อว่าคุณสมบัติ และสาขานี้จะถูกสร้างขึ้นจากการคอมมิตครั้งที่ 2 เช่น 59c86c9
(master) $ git checkout -b feature 59c86c9 Switched to a new branch 'feature'หากคุณตรวจสอบบันทึกในสาขาคุณลักษณะ จะมีเพียง 2 คอมมิตที่มาจากมาสเตอร์ (สายหลัก)
(feature) $ git log --oneline 59c86c9 (HEAD -> feature) new commit e2f44fc (origin/master, origin/HEAD) testฉันจะสร้างคุณสมบัติ 1 และส่งไปยังสาขาคุณสมบัติ
(feature) $ vi feature1.txt (feature) $ git add . The file will have its original line endings in your working directory (feature) $ git commit -m 'feature 1' [feature c639e1b] feature 1 1 file changed, 1 insertion(+) create mode 100644 feature1.txtฉันจะสร้างคุณลักษณะเพิ่มเติมหนึ่งอย่าง เช่น คุณลักษณะ 2 ในสาขาคุณลักษณะและดำเนินการ
(feature) $ vi feature2.txt (feature) $ git add . The file will have its original line endings in your working directory (feature) $ git commit -m 'feature 2' [feature 0f4db49] feature 2 1 file changed, 1 insertion(+) create mode 100644 feature2.txtตอนนี้ หากคุณตรวจสอบบันทึกของสาขาคุณลักษณะ มันมีการคอมมิตใหม่สองรายการ ซึ่งฉันดำเนินการข้างต้น
(feature) $ git log --oneline 0f4db49 (HEAD -> feature) feature 2 c639e1b feature 1 59c86c9 new commit e2f44fc (origin/master, origin/HEAD) testตอนนี้ฉันต้องการเพิ่มคุณสมบัติใหม่ทั้งสองนี้ไปยังสาขาหลัก เพื่อที่ฉันจะใช้คำสั่ง rebase จากฟีเจอร์แบรนช์ ฉันจะรีเบสกับมาสเตอร์แบรนช์ สิ่งนี้จะทำคือมันจะยึดสาขาคุณลักษณะของฉันใหม่กับการเปลี่ยนแปลงล่าสุด
(feature) $ git rebase master Successfully rebased and updated refs/heads/feature.ตอนนี้ฉันกำลังจะไปชำระเงินที่สาขาหลัก
(feature) $ git checkout master Switched to branch 'master' Your branch is ahead of 'origin/master' by 3 commits. (use "git push" to publish your local commits)และสุดท้าย ทำการรีเบสมาสเตอร์แบรนช์กับฟีเจอร์แบรนช์ของฉัน การดำเนินการนี้จะใช้การคอมมิตใหม่สองรายการในฟีเจอร์แบรนช์ของฉันและเล่นซ้ำบนมาสเตอร์แบรนช์ของฉัน
(master) $ git rebase feature Successfully rebased and updated refs/heads/master.ตอนนี้ ถ้าฉันตรวจสอบบันทึกของมาสเตอร์แบรนช์ ฉันจะเห็นว่าการคอมมิตทั้งสองของสาขาฟีเจอร์ของฉันได้รับการเพิ่มไปยังมาสเตอร์แบรนช์เรียบร้อยแล้ว
(master) $ git log --oneline 766c996 (HEAD -> master, feature) feature 2 c036a11 feature 1 812335d add 3 files again 0db602e one more commit 59c86c9 new commit e2f44fc (origin/master, origin/HEAD) testนั่นคือทั้งหมดที่เกี่ยวกับคำสั่ง reset, revert และ rebase ใน Git
บทสรุป
นั่นคือทั้งหมดที่เกี่ยวกับคำสั่ง reset, revert และ rebase ใน Git ฉันหวังว่าคำแนะนำทีละขั้นตอนนี้จะเป็นประโยชน์ ตอนนี้ คุณรู้วิธีการเล่นกับคอมมิตของคุณตามความต้องการโดยใช้คำสั่งที่กล่าวถึงในบทความ
