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

HEAD နှင့် Detached HEAD

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

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

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

HEAD ဆိုတာ 'ငါ အခု ဘယ်နေရာမှာ ရှိနေလဲ' ဆိုတဲ့ မေးခွန်းကို Git ရဲ့ အဖြေပါ။ များသောအားဖြင့် HEAD က branch နာမည်တစ်ခုကို ညွှန်ပြပြီး ထို branch ကလည်း commit တစ်ခုကို ညွှန်ပြပါတယ် — HEAD ဆိုတာ pointer ကို ညွှန်ပြနေတဲ့ pointer တစ်ခုပါပဲ။

Commit အသစ်တစ်ခုစီ လုပ်တိုင်း branch pointer က ရှေ့ကို ရွေ့သွားပြီး HEAD က branch နဲ့ ချိတ်ဆက်ထားလို့ အတူတူ ရွှေ့သွားပါတယ်။

Detached HEAD ဖြစ်တာက HEAD ကို branch နာမည်မဟုတ်ဘဲ commit တစ်ခုကို တိုက်ရိုက် ညွှန်ပြစေရင် ဖြစ်ပါတယ် — အများဆုံးက `git checkout <hash>` (သို့) `git checkout <tag>` run လိုက်လို့ပါ။ Git မှာ ပျက်စီးမှု ဘာမှ မရှိသလို အန္တရာယ်လည်း ဘာမှ မရှိပါဘူး။

  • Detached ဖြစ်နေတုန်း commit လုပ်ရင် ဖန်တီးခံရဆဲ၊ ကြည့်လို့လည်း ရဆဲပါ
  • ဒါပေမဲ့ ဘယ် branch မှ ဒါတွေကို ညွှန်ပြမထားပါဘူး
  • Branch တခြားပြောင်းလိုက်ရင် ဒီ commit တွေက ရှာမတွေ့နိုင်ဘဲ Git က နောက်ဆုံး garbage-collect လုပ်နိုင်ပါတယ်
  • သိမ်းချင်ရင် `git switch -c <new-branch-name>` နဲ့ branch အသစ် ချက်ချင်း ဖန်တီးပါ

ပုံမှန်ပြန်ရောက်ဖို့က ရိုးရှင်းပါတယ် — branch နာမည်တစ်ခုကို ပြန် checkout လုပ်ရုံပါပဲ၊ `git checkout main` လိုမျိုးပေါ့။

HEAD
လက်ရှိ checkout လုပ်ထားတဲ့ commit ကို ညွှန်ပြသော pointer — ပုံမှန်အားဖြင့် branch နာမည်တစ်ခုကို ဖြတ်ပြီး ညွှန်ပြသည်။
Detached HEAD
HEAD ကို branch နာမည်မဟုတ်ဘဲ commit တစ်ခုကို တိုက်ရိုက် ညွှန်ပြနေသော အခြေအနေ — commit (သို့) tag တစ်ခုကို တိုက်ရိုက် checkout လုပ်ပြီးနောက် ဖြစ်ပေါ်လေ့ရှိသည်။
text
HEAD: NORMAL VS DETACHED
------------------------
HEAD: NORMAL VS DETACHED
--------------------------
Normal (attached):
  HEAD --> main --> commit C3
                       |
                     commit C2
                       |
                     commit C1

Detached:
  HEAD --------------> commit C1   (no branch name in between)
                          |
                        commit C2
                          |
                        commit C3  <- main still points here

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

Detached HEAD က မကြာခဏ မတော်တဆ ဖြစ်ပါတယ် — old code ကြည့်ဖို့ commit hash ကို checkout လုပ်တာ (သို့) tag တစ်ခု checkout လုပ်တာမျိုးနဲ့ ရုတ်တရက် detached ဖြစ်သွားတတ်ပါတယ်။

Git က ရှင်းရှင်းလင်းလင်း ပြောပါတယ် — `git status` run လိုက်ရင် ပုံမှန် 'On branch main' အစား 'HEAD detached at <hash>' လို့ ပေါ်ပါလိမ့်မယ်။ ဒါက ပျက်စီးမှုသတိပေးချက် မဟုတ်ဘဲ အချက်ပြချက်တစ်ခုပါ။

ကြည့်ရှုသက်သက်ဆိုရင်

ရှင်းစရာ ဘာမှ မလိုပါဘူး — branch ကို ပြန် checkout လုပ်လိုက်ရုံပါပဲ။

ပြန်ချိတ်ဆက်ပါ

`git checkout main` (သို့) `git switch main` က HEAD ကို ပြန်ချိတ်ပြီး 'Switched to branch main' ပြပါလိမ့်မယ်။

Detached ဖြစ်နေတုန်း commit လုပ်ခဲ့လား

Branch ပြောင်းမသွားခင် `git switch -c fix-from-old-version` နဲ့ branch အသစ် ဖန်တီးထားပါ၊ မဟုတ်ရင် ဒီ commit တွေက ရှာမတွေ့နိုင်တော့ပါဘူး။

Error မဟုတ်ဘဲ — ပုံမှန် အခြေအနေတစ်ခုပါ

Detached HEAD ကို ပထမဆုံး တွေ့တဲ့အခါ ကြောက်စရာလို့ ထင်ရပေမယ့် ဘာမှ ပျက်စီးမနေပါဘူး။ ကြည့်ရှုနိုင်ပါတယ်၊ code run နိုင်ပါတယ်၊ စမ်းသပ် commit တောင် လုပ်နိုင်ပါတယ်။ ဘယ်တော့မှ လိုအပ်တဲ့ ပြင်ဆင်ချက်ကတော့ branch နာမည်တစ်ခုကို ပြန် checkout လုပ်ရုံပါပဲ။

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

bash
git init -q -b main
git config user.name "Thuta Learner"
git config user.email "learner@example.com"

git init -q -b main
git config user.name "Thuta Learner"
git config user.email "learner@example.com"

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"

echo "line1" > notes.txt
git add notes.txt
GIT_AUTHOR_DATE="2026-01-03T09:00:00" GIT_COMMITTER_DATE="2026-01-03T09:00:00"   git commit -m "Add notes"
FIRST_COMMIT=$(git rev-parse HEAD)

echo "line2" >> notes.txt
git add notes.txt
GIT_AUTHOR_DATE="2026-01-03T10:00:00" GIT_COMMITTER_DATE="2026-01-03T10:00:00"   git commit -m "Update notes"

git log --oneline

git checkout $FIRST_COMMIT
git status

git checkout main
git status
You should see
$ git log --oneline
301b387 Update notes
aec746a Add notes

$ git checkout aec746a
Note: switching to 'aec746a'.

You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by switching back to a branch.

If you want to create a new branch to retain commits you create, you may
do so (now or later) by using -c with the switch command. Example:

  git switch -c <new-branch-name>

Or undo this operation with:

  git switch -

Turn off this advice by setting config variable advice.detachedHead to false

HEAD is now at aec746a Add notes

$ git status
HEAD detached at aec746a
nothing to commit, working tree clean

$ git checkout main
Previous HEAD position was aec746a Add notes
Switched to branch 'main'

$ git status
On branch main
nothing to commit, working tree clean

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

Commit အနည်းဆုံး နှစ်ခုရှိတဲ့ repo မှာ ပထမ commit ကို hash နဲ့ checkout လုပ်ပြီး HEAD ကို တမင် detach လုပ်ပါ။ `git status` run ပြီး Git ပေးတဲ့ message ကို ဖတ်ပါ။ ပြီးရင် branch ကို ပြန် checkout လုပ်ပြီး `git status` ပုံမှန်ပြန်ဖြစ်တယ်ဆိုတာ သေချာအောင် ကြည့်ပါ။ နောက်ဆုံး detached ဖြစ်နေတုန်း commit တစ်ခု လုပ်ကြည့်ပါ၊ branch ကို ပြောင်းပါ၊ ပြီးရင် (`git log` နဲ့) ထို branch ထဲမှာ ဒီ commit မပါဘူးဆိုတာ observe ပါ။

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

Detached HEAD မှာ commit လုပ်ပြီး branch အရင် မဖန်တီးဘဲ branch ပြောင်းလိုက်ရင် ထို commit တွေက နာမည်နဲ့ ရှာမတွေ့နိုင်တော့ဘဲ နောက်ဆုံးတော့ garbage-collect ဖြစ်သွားနိုင်ပါတယ်။

`git status` ထဲမှာ 'detached HEAD' တွေ့တာက ကိုယ်တိုင် ပြဿနာ မဟုတ်ပါဘူး — panic ဖြစ်ပြီး force-reset လုပ်တာက `git switch -c` လွယ်လွယ်နဲ့ သိမ်းနိုင်မယ့် အလုပ်ကို ဆုံးရှုံးစေနိုင်ပါတယ်။

Git Documentation: git-checkout (detached HEAD)Git & GitHub

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

  • Detached HEAD မှာ commit လုပ်ပြီး branch အရင် မဖန်တီးဘဲ branch ပြောင်းလိုက်ရင် ထို commit တွေက နာမည်နဲ့ ရှာမတွေ့နိုင်တော့ဘဲ နောက်ဆုံးတော့ garbage-collect ဖြစ်သွားနိုင်ပါတယ်။
  • `git status` ထဲမှာ 'detached HEAD' တွေ့တာက ကိုယ်တိုင် ပြဿနာ မဟုတ်ပါဘူး — panic ဖြစ်ပြီး force-reset လုပ်တာက `git switch -c` လွယ်လွယ်နဲ့ သိမ်းနိုင်မယ့် အလုပ်ကို ဆုံးရှုံးစေနိုင်ပါတယ်။
  • Destructive (သို့) history ပြောင်းလဲနိုင်တဲ့ command တိုင်းကို run မခင် git status နဲ့ လက်ရှိအခြေအနေကို အမြဲစစ်ပါ။

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

Commit အနည်းဆုံး နှစ်ခုရှိတဲ့ repo မှာ ပထမ commit ကို hash နဲ့ checkout လုပ်ပြီး HEAD ကို တမင် detach လုပ်ပါ။ `git status` run ပြီး Git ပေးတဲ့ message ကို ဖတ်ပါ။ ပြီးရင် branch ကို ပြန် checkout လုပ်ပြီး `git status` ပုံမှန်ပြန်ဖြစ်တယ်ဆိုတာ သေချာအောင် ကြည့်ပါ။ နောက်ဆုံး detached ဖြစ်နေတုန်း commit တစ်ခု လုပ်ကြည့်ပါ၊ branch ကို ပြောင်းပါ၊ ပြီးရင် (`git log` နဲ့) ထို branch ထဲမှာ ဒီ commit မပါဘူးဆိုတာ observe ပါ။

You'll know it worked when: $ git log --oneline 301b387 Update notes aec746a Add notes $ git checkout aec746a Note: switching to 'aec746a'. You are in 'detached HEAD' state. You can look around, make experimental changes and commit them, and you can discard any commits you make in this state without impacting any branches by switching back to a branch. If you want to create a new branch to retain commits you create, you may do so (now or later) by using -c with the switch command. Example: git switch -c <new-branch-name> Or undo this operation with: git switch - Turn off this advice by setting config variable advice.detachedHead to false HEAD is now at aec746a Add notes $ git status HEAD detached at aec746a nothing to commit, working tree clean $ git checkout main Previous HEAD position was aec746a Add notes Switched to branch 'main' $ git status On branch main nothing to commit, working tree clean

HEAD နှင့် Detached HEAD | Thuta Learning