Thuta Learning
Git & GitHub: Collaboration and Professional Workflows
AdvancedDevOps & Toolsintermediate

Reflog နှင့် Git Hooks

ဒီခန်းပြီးရင် ဘာတတ်သွားမလဲ

  • Reflog နှင့် Git Hooks concept ကို နားလည်ရှင်းပြနိုင်ရန်
  • Diagram ကို ဖတ်ပြီး Git/GitHub workflow ထဲမှာ state (သို့) data ဘယ်လိုစီးဆင်းသလဲ ခြေရာခံနိုင်ရန်
  • ကိုယ့် project/team အတွက် ဘယ်လို အသုံးချသင့်သလဲ ဆုံးဖြတ်နိုင်ရန်

နားလည်ထားရမယ့် အချက်

Reflog နဲ့ hook နှစ်ခုစလုံးက commit၊ branch level အောက်မှာ အလုပ်လုပ်လို့ တိတ်တဆိတ် အင်အားကြီးပါတယ် — reflog က HEAD တကယ်ရောက်ခဲ့တဲ့နေရာကို မှတ်သားပေးပြီး hook တွေကတော့ သင်လုပ်တော့မယ့်အရာအပေါ် script တွေ အလိုအလျောက် တုံ့ပြန်စေပါတယ်။

Reflog ဆိုတာ သင့် HEAD နဲ့ branch tip တွေ ရောက်ခဲ့တဲ့နေရာအားလုံးရဲ့ local မှတ်တမ်းပါ — hard reset နဲ့ ဖျက်ခံရတဲ့ branch မဟုတ်တော့တဲ့ commit တွေအပါအဝင်ပါ။ Git က commit object ကို reach မလုပ်နိုင်ပေမယ့် ပျက်စီးမသွားဘဲ ရက်ပေါင်း 30-90 လောက်ကြာမှ garbage collection က ရှင်းလင်းပေးပါတယ်။ git reflog run ပြီး အမှားမလုပ်ခင်က hash ကိုရှာကာ git reset --hard နဲ့ ပြန်သွားနိုင်ပါတယ်။

Reflog ဟာ backup မဟုတ်ပါ

Reflog ဟာ local ချည်းသက်သက်ပါ၊ .git directory တစ်ခုတည်းနဲ့ ချိတ်ဆက်နေပြီး clone/fetch လုပ်တဲ့အခါ sync မဖြစ်ပါဘူး၊ နောက်ဆုံးတော့ သက်တမ်းလည်း ကုန်သွားပါတယ်။ မကြာသေးခင်က local အမှားအတွက် recovery tool သာဖြစ်ပြီး backup စစ်စစ်ရဲ့ အစားထိုးမဟုတ်ပါ။

Hook တွေက Git ရဲ့ workflow ထဲက သတ်မှတ်ထားတဲ့နေရာတွေမှာ အလိုအလျောက် run တဲ့ script တွေဖြစ်ပြီး .git/hooks ထဲမှာ trigger point တစ်ခုစီအတွက် executable file တစ်ခုစီအဖြစ် သိမ်းထားပါတယ်။ pre-commit hook က commit အပြီးသတ်ခါနီးမှာ run ပြီး changed file တွေကို lint/format လုပ်ဖို့နဲ့ check fail ရင် commit ကို ငြင်းပယ်ဖို့ အများဆုံးသုံးပါတယ်။ commit-msg hook ကတော့ message convention ကို ဓမ္မဓိသတ်မှတ်နိုင်ပြီး pre-push hook ကတော့ code မထွက်ခွာခင် test suite run နိုင်ပါတယ်။

Reflog
HEAD နဲ့ branch tip တွေရောက်ခဲ့တဲ့ နေရာအားလုံးရဲ့ local၊ အချိန်အစဉ်လိုက် မှတ်တမ်းတစ်ခုဖြစ်ပြီး branch ဘယ်ဟာကမှ reach မလုပ်နိုင်တော့တဲ့ commit တွေပါ အပါအဝင်ပါ။
Git Hook
pre-commit ဒါမှမဟုတ် pre-push လို Git workflow ထဲက သတ်မှတ်ထားတဲ့ နေရာတစ်ခုမှာ Git က အလိုအလျောက် run တဲ့ executable script တစ်ခု။
text
REFLOG TIMELINE AND HOOK TRIGGER POINTS
---------------------------------------
REFLOG (local history of where HEAD has pointed)

HEAD@{2}   HEAD@{1}              HEAD@{0}
  A ------> B ------> (hard reset back to A)
            ^
            still exists, just orphaned from any
            branch -- recoverable via its hash

HOOKS (scripts triggered at points in the workflow)

edit files -> pre-commit -> commit -> pre-push -> push
              (lint/test)            (run tests)

လက်တွေ့ scenario နဲ့ ချိတ်ကြည့်မယ်

Reflog ဥပမာမှာ notes file ကို နှစ်ကြိမ် commit လုပ်ထားပါတယ် (Add project notes ပြီးရင် Add important analysis) ၊ ပြီးရင် git reset --hard HEAD~1 နဲ့ ဒုတိယ commit ကို ရည်ရွယ်ချက်ရှိရှိ ဆုံးရှုံးစေထားပါတယ်။ ပြီးနောက် git log --oneline က ပထမ commit ကိုသာ ပြပါတယ် — ဒုတိယ commit တစ်ခုလုံး မရှိခဲ့သလိုပါပဲ။

ပျောက်သွားတဲ့ commit ကို ပြန်တွေ့ခြင်း

git reflog က HEAD ရောက်ခဲ့တဲ့နေရာအားလုံးကို orphaned ဖြစ်နေတဲ့ Add important analysis commit နဲ့ hash အပြည့်အစုံအပါအဝင် ဖော်ပြပေးပါတယ်။

ပြန်ရယူခြင်း

အဲ့ hash နဲ့ git reset --hard လုပ်လိုက်ရင် branch ကို ပြန်ရောက်စေပြီး git log --oneline က commit နှစ်ခုလုံး ပြန်ရှိနေတာကို အတည်ပြုပါတယ်။

Hook ဖန်တီးခြင်း

.git/hooks/pre-commit ထဲကို shell script တိုတိုတစ်ခု ရေးပြီး executable အဖြစ် သတ်မှတ်ထားပါတယ်။

Trigger လုပ်ခြင်း

အစစ်အမှန် commit တစ်ခု run လိုက်ရင် hook က အလိုအလျောက် run ပါတယ် — -m က Git ရဲ့ ကိုယ်ပိုင် summary output ကိုသာ ဖျောက်ထားလို့ hook ရဲ့ echo line နှစ်ကြောင်း ပေါ်လာပါတယ်။

အတူတူ စမ်းရေးကြည့်မယ်

bash
export GIT_AUTHOR_NAME="Thuta Learner"
export GIT_AUTHOR_EMAIL="learner@example.com"
export GIT_COMMITTER_NAME="Thuta Learner"
export GIT_COMMITTER_EMAIL="learner@example.com"

git init -q -b main
export GIT_AUTHOR_DATE="2026-01-01T09:00:00"
export GIT_COMMITTER_DATE="2026-01-01T09:00:00"
echo "draft 1" > notes.txt
git add notes.txt
git commit -m "Add project notes"

export GIT_AUTHOR_DATE="2026-01-01T10:00:00"
export GIT_COMMITTER_DATE="2026-01-01T10:00:00"
echo "draft 2 - important work" > notes.txt
git add notes.txt
git commit -m "Add important analysis"
LOST_COMMIT=$(git rev-parse HEAD)

git log --oneline
git reset --hard HEAD~1
git log --oneline
git reflog

git reset --hard $LOST_COMMIT
git log --oneline

# --- hooks ---
printf "#!/bin/sh
echo \"Running pre-commit checks...\"
echo \"pre-commit hook: OK\"
" > .git/hooks/pre-commit
chmod +x .git/hooks/pre-commit

export GIT_AUTHOR_DATE="2026-01-01T11:00:00"
export GIT_COMMITTER_DATE="2026-01-01T11:00:00"
echo "more notes" >> notes.txt
git add notes.txt
git commit -m "Add more notes"
You should see
hard reset ပြီးနောက် git log --oneline က ဒါတစ်ခုတည်းပဲ ပြပါတယ်:

ea0d552 Add project notes

git reflog ကတော့ ပျောက်သွားတဲ့ commit အပါအဝင် မှတ်တမ်းအပြည့်အစုံကို ပြပါတယ်:

ea0d552 HEAD@{0}: reset: moving to HEAD~1
a628635 HEAD@{1}: commit: Add important analysis
ea0d552 HEAD@{2}: commit (initial): Add project notes

git reset --hard a628635 လုပ်ပြီးနောက် git log --oneline က commit နှစ်ခုလုံးကို ပြန်ပြပါတယ်:

a628635 Add important analysis
ea0d552 Add project notes

Hook အတွက်ကတော့ pre-commit hook ထည့်ထားပြီး commit လုပ်လိုက်ရင် commit မပြီးခင် ဒါကို print လုပ်ပါတယ်:

Running pre-commit checks...
pre-commit hook: OK

၅ မိနစ် စမ်းကြည့်

test repo တစ်ခုမှာ git reset --hard HEAD~1 နဲ့ ရည်ရွယ်ချက်ရှိရှိ commit တစ်ခု ဆုံးရှုံးအောင်လုပ်ပါ၊ ပြီးရင် git reflog နဲ့ git reset --hard သုံးပြီး ပြန်ရယူပါ။ ပြီးရင် message အက္ခရာစာလုံးကြီးနဲ့ မစတဲ့ commit တွေကို ငြင်းပယ်မယ့် (error message နဲ့ exit 1) pre-commit hook တစ်ခု ရေးပြီး commit မကောင်းတာကို တကယ် ပိတ်ဆို့ပေးလား စစ်ကြည့်ပါ။

သတိလေးတစ်ချက်

reflog ကို အမြဲကာကွယ်ပေးမယ်လို့ ထင်နေခြင်း — local ချည်းသက်သက်သာဖြစ်ပြီး clone အသစ်ဆွဲရင် မပါလာဘဲ entry တွေလည်း နောက်ဆုံးသက်တမ်းကုန်ကာ garbage collect ဖြစ်သွားပါတယ်။

hook file ကို chmod +x နဲ့ executable မလုပ်ဘဲထားရင် Git က error ဘာမှမပြဘဲ run ဖို့ ကျော်သွားပါတယ်။

Git - githooks DocumentationGit & GitHub

ဒီနေရာမှာ လူအများမှားတတ်တယ်

  • reflog ကို အမြဲကာကွယ်ပေးမယ်လို့ ထင်နေခြင်း — local ချည်းသက်သက်သာဖြစ်ပြီး clone အသစ်ဆွဲရင် မပါလာဘဲ entry တွေလည်း နောက်ဆုံးသက်တမ်းကုန်ကာ garbage collect ဖြစ်သွားပါတယ်။
  • hook file ကို chmod +x နဲ့ executable မလုပ်ဘဲထားရင် Git က error ဘာမှမပြဘဲ run ဖို့ ကျော်သွားပါတယ်။
  • Destructive (သို့) history ပြောင်းလဲနိုင်တဲ့ command တိုင်းကို run မခင် git status နဲ့ လက်ရှိအခြေအနေကို အမြဲစစ်ပါ။

လေ့ကျင့်ခန်း

test repo တစ်ခုမှာ git reset --hard HEAD~1 နဲ့ ရည်ရွယ်ချက်ရှိရှိ commit တစ်ခု ဆုံးရှုံးအောင်လုပ်ပါ၊ ပြီးရင် git reflog နဲ့ git reset --hard သုံးပြီး ပြန်ရယူပါ။ ပြီးရင် message အက္ခရာစာလုံးကြီးနဲ့ မစတဲ့ commit တွေကို ငြင်းပယ်မယ့် (error message နဲ့ exit 1) pre-commit hook တစ်ခု ရေးပြီး commit မကောင်းတာကို တကယ် ပိတ်ဆို့ပေးလား စစ်ကြည့်ပါ။

You'll know it worked when: hard reset ပြီးနောက် git log --oneline က ဒါတစ်ခုတည်းပဲ ပြပါတယ်: ea0d552 Add project notes git reflog ကတော့ ပျောက်သွားတဲ့ commit အပါအဝင် မှတ်တမ်းအပြည့်အစုံကို ပြပါတယ်: ea0d552 HEAD@{0}: reset: moving to HEAD~1 a628635 HEAD@{1}: commit: Add important analysis ea0d552 HEAD@{2}: commit (initial): Add project notes git reset --hard a628635 လုပ်ပြီးနောက် git log --oneline က commit နှစ်ခုလုံးကို ပြန်ပြပါတယ်: a628635 Add important analysis ea0d552 Add project notes Hook အတွက်ကတော့ pre-commit hook ထည့်ထားပြီး commit လုပ်လိုက်ရင် commit မပြီးခင် ဒါကို print လုပ်ပါတယ်: Running pre-commit checks... pre-commit hook: OK

Reflog နှင့် Git Hooks | Thuta Learning