နားလည်ထားရမယ့် အချက်
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 တစ်ခု။
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 နှစ်ကြောင်း ပေါ်လာပါတယ်။
အတူတူ စမ်းရေးကြည့်မယ်
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"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 Documentation — Git & GitHub