Tag Archives: git

แก้ไข git commit ล่าสุด

หลายๆครั้งหลังจากเรา commit code แล้ว เรามาพบทีหลังว่าเรา commit ไม่ครบทุกไฟล์หรือมีบางอย่างที่อยากแก้ไขใน commit ที่เริ่มเพิ่งจะทำการ commit ไป เช่น ลืมลบ print statement ที่ใช้ debug ตัวโปรแกรมออกหลังจาก debug เสร็จแล้ว สำหรับความผิดพลาดเหล่านี้เราสามารถใช้คำสั่ง

git commit --amend

เพื่อทำการแก้ไข commit สุดท้ายของเราได้

เพียงแค่เราทำการแก้ไขไฟล์ และสั่ง git add เหมือนที่เราจะทำการ commit ใหม่ตามปกติ จากนั้นสั่ง git commit –amend ตัว git จะทำการรวมการเปลี่ยนแปลงล่าสุดของเรานั้นเข้ากับ commit สุดท้ายให้เรียบร้อย

ข้อควรระวังคือการแก้ไข commit ในลักษณะนี้ ทำให้เกิด commit ใหม่แทนที่ commit เก่า สังเกตได้จาก revision ที่เปลี่ยนไปหลังคำสั่ง commit –amend เราจึงไม่ควรทำการแก้ไข commit ด้วยคำสั่งนี้และวิธีอื่นใดๆ ที่ทำให้ revision เปลี่ยน ปัญหาจะเกิดขึ้นหากเพื่อนร่วมทีมมี commit เดียวกันนี้อยู่ในเครื่องของเขา เพราะจะทำให้ git มองว่าเป็น commit ที่ต่างกันและเกิดความสับสนวุ่นวายเมื่อมีการนำ code มารวมกันในภายหลัง

แนวทางการป้องกันปัญหานี้ง่ายๆ ก็คือ แก้ไข commit เฉพาะ commit ที่เรายังไม่เคย push ไปที่ repository ที่คนอื่นใช้งานร่วมอยู่ด้วย หามีการ push ไปที่ public repository แล้ว ก็ยอมสร้าง commit ใหม่ เพียงแค่นี้เราและเพื่อนร่วมทีมก็จะปลอดภัยแล้วครับ

[Presentation Summary] A Tale of Three Trees (Git)

A Tale of Three Trees

Presentation นี้ ชื่อมันอาจจะไม่สื่อถึง Git และไม่ดึงดูดให้สนใจเท่าไหร่ แต่เนื้อหาดีมากครับ

ผู้พูดทำงานอยู่ Github และเป็นคนทำเว็บไซต์ 3 อันนี้ git-scm.comgitref.orgprogit.org 

ต้นไม้ 3 ต้นที่เค้าพูดถึง คือ 3 ต้นไม้ส่วนประกอบสำคัญของ Git ได้แก่

  1. ต้นไม้ HEAD
  2. ต้นไม้ Index
  3. ต้นไม้ Working directory

เค้าเริ่มจากการอธิบายต้นไม้ 3 ต้นนี้

จากนั้นอธิบายถึงคำสั่ง git reset ว่า default, –soft, –hard ทำงานภายในอย่างไร ทำให้เข้าใจว่าทำไมเค้าถึง design คำสั่งออกมาแบบนี้ (แต่ก็รู้สึกว่าเป็นวิธีคิดแบบโปรแกรมเมอร์จริงๆ ทำให้อาจจะไม่เหมาะสำหรับ first impression)

การทำงานของ –soft จะเป็น subset ของการทำงานของ default และการทำงานของ default จะเป็น subset ของการทำงานของ –hard

  • –soft จะอัพเดต HEAD และ current branch
  • default จะอัพเดต HEAD, current branch และ Index
  • –hard จะอัพเดต HEAD, current branch, Index, และ working directory

ผู้พูดได้ blog เรื่องส่วนนี้ไว้ที่ progit blog ด้วย

ตรงนี้ทำให้เข้าใจคำถามที่คาใจอยู่นานว่า ประโยชน์ของ Index มันเยอะเพียงพอให้ใส่เข้ามาในตัว tool เพื่อแล้วกลายเป็นต้องเพิ่มขั้นตอนในการทำงานขึ้นอีก 1 ขั้น จริงๆ หรือ

จากนั้น เค้าพูดต่อถึงเรื่อง git checkout ว่าคล้าย reset แต่เป็นการอัพเดต HEAD โดยไม่ได้อัพเดต current branch

จากนั้นก็เริ่มลงไปที่ internal command ของ git พร้อมกับการ demo บนจอซึ่งไม่ได้ capture มาด้วย + คนพูดๆ เร็วมากเลยฟังไม่ค่อยรู้เรื่องเท่าไหร่

ปล. ใครเจอปัญหา commit หายจาก reset –hard, git reflog และ git checkout ช่วยท่านได้นะครับ แต่ working directory หายนี่ ตัวใครตัวมัน