HEAD ইতিমধ্যে বেশ কয়েকবার এসেছে — আগের Merge Conflicts lesson-এর <<<<<<< HEAD marker, আর Undoing Changes থেকে git reset --soft HEAD~1। এই lesson ব্যাখ্যা করে এটা আসলে কী।
HEAD বর্তমানে checkout করা যে কোনো commit নির্দেশ করে — সাধারণত, মানে এটা বর্তমান branch-এর tip নির্দেশ করে, যা নিজে সবচেয়ে সাম্প্রতিক commit নির্দেশ করে।
cat .git/HEAD
# ref: refs/heads/main
# HEAD -> main -> main-এর সবচেয়ে সাম্প্রতিক commit| Reference | মানে |
|---|---|
| HEAD | বর্তমান commit |
| HEAD~1 | HEAD-এর একটা commit আগে |
| HEAD~3 | HEAD-এর তিনটা commit আগে |
| HEAD^ | HEAD-এর সরাসরি parent — একটা সাধারণ commit-এর জন্য HEAD~1-এর সমতুল্য |
সাধারণত HEAD একটা branch নির্দেশ করে। একটা branch নামের বদলে সরাসরি একটা নির্দিষ্ট commit checkout করলে HEAD যেকোনো branch থেকে detach হয়ে যায় — এটা এখন সরাসরি সেই একটা commit নির্দেশ করে।
git checkout a1b2c3d
# Note: switching to 'a1b2c3d'.
# You are in 'detached HEAD' state...Detached HEAD state-এ চারপাশে দেখা — পুরনো file content check করা, কিছু test করা — সম্পূর্ণ নিরাপদ। ঝুঁকিটা detached অবস্থায় নতুন পরিবর্তন commit করায়: সেই commit-গুলো থাকে, কিন্তু কোনো branch-এ না, আর অন্য কিছু checkout হয়ে গেলে আবার খুঁজে পাওয়া সত্যিকারভাবে কঠিন হয়ে যায়।
Detached HEAD-এর আসল ঝুঁকি
Detached HEAD state-এ করা একটা commit, কোনো branch এটা নির্দেশ না করলে, HEAD অন্য কোথাও move করলে কার্যকরভাবে হারিয়ে যেতে পারে — Git শেষ পর্যন্ত কিছু reference করে না এমন commit garbage-collect করে। এই state-এ করা কাজ রাখতে, সরে যাওয়ার আগে এটা থেকে একটা branch তৈরি করুন।
# detached HEAD-এ করা পরিবর্তন রাখার যোগ্য হলে, আগে একটা branch-এ save করুন:
git switch -c rescue-branch
# না হলে, শুধু একটা সাধারণ branch-এ ফিরে যান:
git switch main