Git যদি HEAD detached দেখায়, আপনার ফাইলগুলো এখনও একটি কমিটে চেকআউট অবস্থায় রয়েছে, তবে আপনি একটি ব্রাঞ্চ তৈরি না করা পর্যন্ত নতুন কমিটগুলো কোনো ব্রাঞ্চকে এগিয়ে নেবে না। Mac-এ, Terminal খুলুন, রিপোজিটরিতে যান, আনকমিটেড কোনো পরিবর্তন আছে কি না তা পরীক্ষা করুন, এবং তারপর হয় আপনার বর্তমান কাজটি একটি নতুন ব্রাঞ্চে যুক্ত করুন অথবা নিরাপদে সেই ব্রাঞ্চে ফিরে যান যা আপনি ব্যবহার করতে চেয়েছিলেন। Git-এর switch কমান্ড উভয় পথকেই সমর্থন করে। Apple-এর Terminal নির্দেশিকা ব্যাখ্যা করে কীভাবে Terminal খুলতে হয়; Git-এর switch সংক্রান্ত ডকুমেন্টেশন ব্রাঞ্চ এবং detached-HEAD আচরণ নথিভুক্ত করে।

১. Git কী চেকআউট করেছে তা পরীক্ষা করুন

Applications > Utilities থেকে Terminal খুলুন, তারপর আপনার রিপোজিটরিতে যান। উদাহরণস্বরূপ পাথটি আপনার প্রজেক্ট যে ফোল্ডারে আছে তা দিয়ে প্রতিস্থাপন করুন; কোটেশন চিহ্ন পাথে স্পেস ব্যবহারের অনুমতি দেয়। macOS Terminal ডিফল্টভাবে zsh ব্যবহার করে, এবং এই কমান্ডগুলো zsh-এর পাশাপাশি সাধারণ শেলগুলোতেও কাজ করে।

cd "/path/to/your/repository"
git status

যদি git status "HEAD detached" বা "not on any branch" বলে, তবে আপনি detached HEAD অবস্থায় আছেন। Git কোনো ব্রাঞ্চের পরিবর্তে সরাসরি একটি কমিট চেকআউট করেছে। কমিট এবং ওয়ার্কিং ফাইলগুলো উপলভ্য থাকে; ঝুঁকি হলো এখানে করা কমিটগুলো স্বয়ংক্রিয়ভাবে কোনো ব্রাঞ্চের সাথে যুক্ত হয় না। Git-এর checkout ম্যানুয়াল এই অবস্থাটি বর্ণনা করে এবং কীভাবে একটি ব্রাঞ্চ সেখানে করা কমিটগুলোকে সংরক্ষণ করতে পারে তা ব্যাখ্যা করে।

অন্য কোথাও সুইচ করার আগে, git status-এর বাকি অংশ পড়ুন। যদি এটি পরিবর্তিত (modified) বা আনট্র্যাকড (untracked) ফাইলগুলোর তালিকা দেখায়, তবে সেগুলো এমন পরিবর্তন যা কমিট করা হয়নি। আপনি একই জায়গায় কাজ চালিয়ে যেতে পারেন, অথবা এখনই একটি ব্রাঞ্চ তৈরি করতে পারেন; বর্তমান কমিটে একটি ব্রাঞ্চ তৈরি করলে তা নিজে থেকে পরিবর্তনগুলোকে মুছে ফেলে না। পুনরুদ্ধারের সময় force বা discard বিকল্পগুলো এড়িয়ে চলুন।

২. বর্তমান কাজটি একটি ব্রাঞ্চে রাখুন

আপনি যদি ডিটাচড থাকা অবস্থায় কোনো কমিট করে থাকেন—অথবা ঠিক এই স্ন্যাপশট থেকে কাজ চালিয়ে যেতে চান—তবে আপনি এখন যেখানে আছেন সেখানেই একটি ব্রাঞ্চ তৈরি করুন:

git switch -c recovered-work
git status

recovered-work-এর পরিবর্তে একটি বর্ণনামূলক ব্রাঞ্চ নাম ব্যবহার করুন। Git বর্তমান কমিটে ব্রাঞ্চটি তৈরি করে এবং সেটিতে সুইচ করে, ফলে পরবর্তী কমিটগুলো সেই ব্রাঞ্চের অন্তর্ভুক্ত হয়। নিশ্চিত করুন যে git status এখন ব্রাঞ্চের নাম দেখাচ্ছে। যখন ডিটাচড স্ন্যাপশটটি এমন কাজ হয় যা আপনি রাখতে চান, তখন এটিই সবচেয়ে সংক্ষিপ্ত পুনরুদ্ধার পদ্ধতি। Git switch -c-কে একটি ব্রাঞ্চ তৈরি এবং সেটিতে সুইচ করার নির্দেশ হিসেবে নথিভুক্ত করেছে।

আপনার যদি আনকমিটেড পরিবর্তন থাকে, তবে আপনি ব্রাঞ্চ তৈরি করার সময় সেগুলো সাধারণত ওয়ার্কিং ট্রিতে থেকে যায়। পরে সেগুলো এখনও উপস্থিত আছে কি না তা যাচাই করতে git status পরীক্ষা করুন। সেই নামে ইতিমধ্যে একটি ব্রাঞ্চ থাকার কারণে যদি কমান্ডটি প্রত্যাখ্যান করে, তবে একটি ভিন্ন নাম বেছে নিন; -C যোগ করবেন না, যা কোনো বিদ্যমান ব্রাঞ্চকে একটি নতুন সূচনা বিন্দুতে রিসেট করে দিতে পারে।

৩. আপনি যে ব্রাঞ্চটি ব্যবহার করতে চেয়েছিলেন সেটিতে ফিরে যান

আপনি যদি কেবল একটি কমিট পর্যবেক্ষণ করে থাকেন এবং সংরক্ষণ করার মতো কোনো পরিবর্তন না থাকে, তবে নাম ধরে নির্দিষ্ট ব্রাঞ্চে সুইচ করুন। উদাহরণস্বরূপ:

git switch main

আপনার রিপোজিটরির আসল ব্রাঞ্চের নাম যদি main না হয় তবে সেটি ব্যবহার করুন। Git যদি জানায় যে লোকাল পরিবর্তনগুলো ওভাররাইট হয়ে যাবে, তবে থামুন এবং প্রথমে সেগুলো সংরক্ষণ করুন: উপরের মতো একটি রিকভারি ব্রাঞ্চ তৈরি করুন, অথবা কাজটি কমিট করুন। লোকাল পরিবর্তন হারিয়ে যাওয়ার সম্ভাবনা থাকলে Git সাধারণত ব্রাঞ্চ সুইচ আটকে দেয়; পুনরুদ্ধারের সময় --discard-changes এড়িয়ে চলুন কারণ এটি টার্গেট ব্রাঞ্চের সাথে মেলানোর জন্য ইনডেক্স এবং ওয়ার্কিং ট্রি রিসেট করে দেয়। git switch ম্যানুয়াল এই সুরক্ষা ব্যবস্থা এবং বিকল্পগুলো ব্যাখ্যা করে।

আপনি যদি ভুলবশত কোনো ব্রাঞ্চ থেকে অন্য কোথাও চলে গিয়ে থাকেন, তবে git switch - Git-এর সাম্প্রতিক সুইচের ইতিহাস অনুসারে পূর্ববর্তী ব্রাঞ্চ বা কমিটে ফিরে যায়। সুইচের পরে আপনি কোথায় পৌঁছালেন তা নিশ্চিত করতে git status পরীক্ষা করুন।

৪. পূর্বে ছেড়ে আসা কোনো ডিটাচড কমিট খুঁজুন

আপনি যদি ইতিমধ্যে অন্য কোথাও চলে গিয়ে থাকেন এবং আপনার ডিটাচড কমিটটি কোথায় গেছে তা মনে করতে না পারেন, তবে লোকাল reflog পরীক্ষা করুন:

git reflog

reflog সাম্প্রতিক লোকাল রেফারেন্স আপডেটগুলো রেকর্ড করে, এবং HEAD reflog ব্রাঞ্চ সুইচের তথ্যও রেকর্ড করে। এমন একটি এন্ট্রি খুঁজুন যার কমিট মেসেজ বা সময় আপনার কাজের সাথে মেলে। কোনো কিছু পরিবর্তন না করে একটি সম্ভাব্য কমিট পরীক্ষা করতে, reflog থেকে এর সংক্ষিপ্ত কমিট আইডিটি কপি করুন এবং রান করুন:

git show --stat COMMIT_ID

COMMIT_ID-কে প্রকৃত আইডি দিয়ে প্রতিস্থাপন করুন—প্লেসহোল্ডারটি হুবহু টাইপ করবেন না। এটি যদি সঠিক কমিট হয়, তবে সেই কমিটে একটি ব্রাঞ্চ তৈরি করে এটি সংরক্ষণ করুন:

git switch -c recovered-work COMMIT_ID

এটি কমিটটিকে আবারও একটি ব্রাঞ্চের মাধ্যমে পৌঁছানোর যোগ্য করে তোলে। Reflog হলো লোকাল রেকর্ড, এবং এন্ট্রিগুলোর মেয়াদ শেষ হতে পারে; Git-এর ডকুমেন্টেশন এগুলোকে সাম্প্রতিক রেফারেন্স আপডেটের রেকর্ড হিসেবে বর্ণনা করে এবং এগুলোর মেয়াদ শেষ হওয়ার আচরণ উল্লেখ করে। দেখুন git reflog।

৫. এগিয়ে যাওয়ার আগে যাচাই করুন

বর্তমান ব্রাঞ্চ এবং সর্বশেষ কমিট নিশ্চিত করতে git status এবং git log -1 --oneline রান করুন। আপনার কাজটি যদি আনকমিটেড থেকে থাকে, তবে স্ট্যাটাস আউটপুটে এর ফাইলগুলো এখনও দেখা যাচ্ছে কি না তা পরীক্ষা করুন। reflog-এ কোনো সম্ভাব্য এন্ট্রি না দেখা গেলে, পুনরুদ্ধারের জন্য ড্যাংলিং অবজেক্টগুলো (dangling objects) পরীক্ষা করার প্রয়োজন হতে পারে; সেটি একটি পৃথক এবং আরও সতর্কতামূলক পদক্ষেপ, এবং খোঁজার সময় আপনার git gc-এর মতো ক্লিনআপ কমান্ড চালানো এড়িয়ে চলা উচিত।

একটি detached HEAD-এর অর্থ এই নয় যে আপনার কাজ হারিয়ে গেছে। সঠিক পুনরুদ্ধার নির্ভর করে আপনি বর্তমান কমিটটি সংরক্ষণ করতে চান, কোনো বিদ্যমান ব্রাঞ্চে ফিরে যেতে চান, নাকি অন্য কোথাও যাওয়ার পরে কোনো কমিট খুঁজে বের করতে চান তার ওপর। সঠিক কমিটে তৈরি একটি ব্রাঞ্চ আপনার কাজ চালিয়ে যাওয়ার জন্য Git-কে অনুসরণ করার মতো একটি নামযুক্ত রেফারেন্স প্রদান করে।

তথ্যসূত্র