Git reflog

Git ขั้นสูง

Amanda Crawford-Adamo

Software and Data Engineer

Git Reflog คืออะไร?

  1. บันทึกภายในเครื่องของการอัปเดต reference ทั้งหมด ใน repository
  2. Reflog ถูกเก็บไว้บนเครื่องของเราในไดเรกทอรี .git/logs/refs/heads/
  3. บันทึกการเปลี่ยนแปลงของ branch tips และตำแหน่ง HEAD
  4. ทำหน้าที่เป็นตาข่ายนิรภัยสำหรับการทำงานกับ Git
  5. ช่วยกู้คืนการเปลี่ยนแปลงหรือการลบที่เกิดขึ้นโดยไม่ตั้งใจ

ตัวอย่างกราฟแสดงการเปลี่ยนแปลงประวัติ git

Git ขั้นสูง

Git Reflog เทียบกับ Git Log

คุณสมบัติ Git Reflog Git Log
จุดประสงค์ แสดงการอัปเดต reference และการเขียนทับใน local repo แสดงเฉพาะประวัติ commit
ขอบเขต เฉพาะ local repository ทั้ง local และ remote repository
เนื้อหา การอัปเดต ref ทั้งหมด (commit, reset, merge ฯลฯ) เฉพาะ commit
ความถาวร ชั่วคราว (โดยทั่วไป 90 วัน) ถาวร (ส่วนหนึ่งของประวัติ repository)
กรณีใช้งาน กู้คืน commit ที่หายไป, ตรวจสอบการกระทำล่าสุด ดูประวัติโปรเจกต์, ติดตามการพัฒนาฟีเจอร์
Git ขั้นสูง

คำสั่ง Reflog

  • แสดงข้อมูล log และกิจกรรมของ HEAD
    git reflog
    git reflog show
    
  • ล้างข้อมูล log เก่าหรือรายการที่เข้าถึงไม่ได้
    git reflog expire
    
Git ขั้นสูง

โครงสร้าง Output ของ Reflog

โครงสร้างข้อความ output ของ reflog

ตัวอย่าง output ของ reflog ใน terminal

องค์ประกอบ คำอธิบาย
short-hash hash ของ commit แบบย่อ
ref โดยทั่วไปคือ HEAD แต่อาจเป็นชื่อ branch ได้
index ตำแหน่งใน reflog (0 คือรายการล่าสุด)
action ประเภทของการกระทำ (commit, reset, merge ฯลฯ)
descriptions คำอธิบายเกี่ยวกับการกระทำ
1 https://hackernoon.com/time-to-rewrite-your-git-history-effectively-with-git-reflog
Git ขั้นสูง

การกรอง: Since และ Until

  • since = แสดงรายการตั้งแต่จุดนี้เป็นต้นไป

    git reflog --since "time-qualifer"
    
  • until = แสดงรายการจนถึงจุดนี้

    git reflog --until "time-qualifer"
    
การใช้งาน
git reflog --since="1 week ago"
git reflog --until="yesterday"
git reflog --until="2024-01-01"
Git ขั้นสูง

การกู้คืน Branch ที่ถูกลบ

สถานการณ์

  • สร้าง branch ชื่อ etl-feature
  • commit การเปลี่ยนแปลงฟีเจอร์ ETL ไปยัง branch นี้
  • ลบ branch นี้โดยไม่ตั้งใจ
  • การเปลี่ยนแปลงโค้ดทั้งหมดสูญหาย

จะกู้คืน branch etl-feature ได้อย่างไร?

วิธีแก้ไข

  1. ค้นหา hash ของ commit ที่ปลาย branch ที่ถูกลบโดยใช้ git reflog
  2. ใช้ git checkout เพื่อย้าย HEAD ไปยัง commit hash ของ branch ที่ถูกลบ
  3. สร้าง branch ใหม่ จาก commit ที่ HEAD ชี้อยู่ในปัจจุบัน
git reflog
git checkout <hash>
git checkout -b <branch-name>
1 https://stackoverflow.com/questions/3640764/can-i-recover-a-branch-after-its-deletion-in-git
Git ขั้นสูง

Git Reset

  • ย้าย HEAD ไปยัง commit object ที่ระบุ
  • working area และ staging area จะถูกอัปเดตขึ้นอยู่กับประเภทของ reset
ประเภท Reset คำสั่ง ผลต่อ Working Directory ผลต่อ Staging Area
Soft git reset --soft <commit> ไม่มีการเปลี่ยนแปลง การเปลี่ยนแปลงยังคง staged
Mixed (ค่าเริ่มต้น) git reset --mixed <commit> ไม่มีการเปลี่ยนแปลง การเปลี่ยนแปลงถูก unstaged
Hard git reset --hard <commit> การเปลี่ยนแปลงถูกยกเลิก การเปลี่ยนแปลงถูกยกเลิก
Git ขั้นสูง

การค้นหา Commit ที่หายไป

สถานการณ์

  • การทดสอบเริ่มล้มเหลวหลังจาก commit และ rebase
  • ไม่ทราบว่า commit ใดทำให้เกิดปัญหา
  • ต้องการย้อนกลับไปยังสถานะที่ผ่านการทดสอบ

จะย้อนกลับไปยังการเปลี่ยนแปลง ETL script ก่อนหน้าได้อย่างไร?

วิธีแก้ไข

  1. ค้นหา hash ของ commit ที่หายไปโดยใช้ Git Reflog
  2. ใช้ git reset เพื่อย้อนกลับไปยัง commit ที่ผ่านการทดสอบ
git reflog
git reset --soft HEAD@{1}
Git ขั้นสูง

แนวทางปฏิบัติที่ดี

  • มีประสิทธิภาพสูงในการกู้คืนโค้ดและ commit ที่หายไป
  • ใช้ commit message ที่สื่อความหมายชัดเจน
  • push ขึ้น remote อย่างสม่ำเสมอ
  • ระมัดระวังการใช้ force push

Reflog คือเครื่องย้อนเวลาภายในเครื่องของเรา เมื่อเกิดข้อผิดพลาด

ภาพนาฬิกาที่หมุนย้อนเวลา

Git ขั้นสูง

มาฝึกกันเถอะ!

Git ขั้นสูง

Preparing Video For Download...