Git-এ HEAD কী?
HEAD হলো একটা pointer, যা নির্দেশ করে আপনি এখন repository-র কোন জায়গায় দাঁড়িয়ে আছেন। সহজভাবে বললে — "আপনি এখন এখানে আছেন" চিহ্ন।
স্বাভাবিক অবস্থায় HEAD সরাসরি কোনো commit-কে point করে না, বরং একটা branch-কে point করে, আর সেই branch তখন সর্বশেষ commit-কে point করে:
HEAD → main → commit (a1b2c3d)
আপনি নতুন commit করলে branch pointer এগিয়ে যায়, আর HEAD যেহেতু branch-কে ধরে আছে, সে-ও সাথে সাথে এগোয়। .git/HEAD ফাইলটা খুললে দেখবেন লেখা আছে:
ref: refs/heads/main
Detached HEAD কী?
যখন HEAD কোনো branch-কে point না করে সরাসরি একটা নির্দিষ্ট commit-কে point করে, তখন সেই অবস্থাকে বলে detached HEAD:
HEAD → commit (a1b2c3d) ← কোনো branch নেই মাঝখানে
সাধারণত এই অবস্থায় পড়েন যখন:
git checkout a1b2c3d # সরাসরি commit hash-এ checkout
git checkout v2.1.0 # কোনো tag-এ checkout
git checkout origin/main # remote branch-এ সরাসরি checkout
সমস্যাটা কোথায়? Detached HEAD অবস্থায় আপনি code দেখতে, build করতে, এমনকি commit করতেও পারবেন। কিন্তু নতুন commit-গুলো কোনো branch-এর সাথে যুক্ত থাকে না। ফলে আপনি অন্য কোথাও checkout করে চলে গেলে সেই commit-গুলো "অনাথ" হয়ে যায় — কোনো reference না থাকায় Git একসময় garbage collection-এ সেগুলো মুছে ফেলতে পারে।
Detached HEAD থেকে বের হওয়ার উপায়
পরিস্থিতি ১: শুধু ঘুরে দেখছিলেন, কোনো পরিবর্তন করেননি
সোজা কোনো branch-এ ফিরে যান:
git switch main
# বা পুরনো syntax-এ: git checkout main
ব্যস, HEAD আবার branch-এর সাথে যুক্ত হয়ে গেল।
পরিস্থিতি ২: Detached অবস্থায় commit করে ফেলেছেন এবং সেগুলো রাখতে চান
Commit-গুলোকে একটা নতুন branch-এ বেঁধে ফেলুন:
git switch -c my-new-branch
# বা: git checkout -b my-new-branch
এতে বর্তমান commit থেকে নতুন branch তৈরি হবে, HEAD সেটাকে point করবে, আর আপনার কাজ নিরাপদ থাকবে।
পরিস্থিতি ৩: Commit করেছিলেন কিন্তু branch না বানিয়েই বেরিয়ে এসেছেন
চিন্তা নেই, reflog দিয়ে হারানো commit খুঁজে বের করা যায়:
git reflog # হারানো commit-এর hash খুঁজুন
git branch recovery-branch a1b2c3d # সেই hash থেকে branch বানান
Reflog সাধারণত ৩০–৯০ দিন পর্যন্ত history রাখে, তাই garbage collection-এর আগে ফিরে পাওয়ার সুযোগ থাকে।