คำสั่งจัดการ change (เวลามันพัง)
เมื่อ change เกิดปัญหา เราทำอะไรได้บ้าง ?
เคสในหมวดหมู่นี้เราจะใช้ในเคสที่จะต้องมีการจัดการ history เพิ่มเติม เช่น
- ต้องการย้อน commit
- ต้องการสร้าง branch ใหม่จากจุดอื่นใน commit (ไม่ใช่จาก branch โดยตรง)
- ต้องการ shift history git เพื่อให้ history up to date จาก branch main
- สร้ าง history มาเยอะจัด (เช่น change 1, change 2, change 3) ต้องการรวม history ให้สวยงามขึ้น
ในหมวดหมู่นี้จะสามารถแก้ไขได้
- จริงอยู่ที่ git เป็นลักษณะ snapshot แต่ก็สามารถที่จะเปลี่ยนแปลง history ได้
- แต่ก็ต้องอยู่บนพื้นฐานของการต่อ history หรือการเปลี่ยนแปลงจากจุดในอดีต history อยู่ดี = คือเราไม่สามารถเข้าไปแก้ history commit ตรงๆได้ แต่สามารถย้อนกลับไปก่อนหน้า เพื่อต่อ history ใหม่ออกมาได้
ก่อนไปต่อลง Extension "GitLens" ใน VScode
คำสั่งช่วยเหลือมีอะไรบ้าง
1. git checkout <commit hash>
= ย้อนเวลา
วิธีแรกคือการย้อนเวลากลับไปยัง commit ในอดีต เพื่อสร้าง commit change ใหม่ต่อออกมา
สมมุติว่า history ของ git เป็นแบบนี้
ทีนี้ เราอาจจะอยากเพิ่ม feature บางอย่าง โดยที่ยังไม่อยากใช้ประวัติของ C, D (อาจจะเพื่อตรวจสอบบางอย่างให้แน่ใจว่า ไม่ได้กระทบจาก C,D ใช่ไหม) = ต้องย้อนกลับไปที่ B แล้วสร้าง branch ใหม่แทน
- ดังนั้น เมื่อใช้คำสั่ง
git checkout B
และสร้าง branch ใหม่เป็นgit checkout -b develop
- เสร็จแล้วลอง commit C1, D1 เพิ่มหน้าตา history ก็จะประมาณนี้ = branch develop ที่สร้างมาใหม่ ก็จะทำการย้อนเวลากลับไปยังประวัติ B และทำประวัติ C1, D1 ต่อ
- และจะไม่ได้ประวัติของ C, D ออกมา
ตัวอย่างการใช้ checkout สำหรับการย้อนเวลา
# command
git checkout <commit history ที่ต้องการย้อน อย่างน้อย 6 ตัว>
git checkout -b <ชื่อ branch ใหม่ที่ต้องการสร้างจาก history>
# ตัวอย่าง
git checkout 13eda488b
git checkout -b develop
2. git reset (ย้อน commit), revert (กลับ commit)
คำสั่ง set แรกคือ คำสั่งที่ใช้สำหรับแก้ไข change commit ซึ่งปกติจะมี 2 วิธีที่สามารถทำได้
Ref: https://gcapes.github.io/git-course-mace/07-undoing/
2.1 git reset = ย้อนกลับไปยัง commit ที่ระบุ (โดยจะล้างประวัติ)
สมมุติ history ของ git หน้าตาประมาณนี้
แล้วถ้าเราทำการ git reset B
= ประวัติของ git จะเหลือเพียง
และ git reset B
จะต้องกลายเป็นประวัติใหม่ เพื่อเป็นการ confirm ว่า จะย้อนกลับมา commit B จริงๆใช่ไหม = เกิด commit ใหม่ที่บอกว่า เราย้อนกลับมาที่ commit "B" ประวัติจะกลายเป็นแบบนี้แทน หลังจาก commit ใหม่ (เป็นแบบ C1)
ออกมาแทน ตัวอย่าง command git reset
# command
git reset <commit history ที่ต้องการย้อน อย่างน้อย 6 ตัว>
# ตัวอย่าง
git reset 13eda488b
git commit -m "reset history to B"