إذا أظهر Git الحالة HEAD detached، فإن ملفاتك تظل مسحوبة عند نقطة حفظ (commit)، ولكن الالتزامات الجديدة لن تحرك أي فرع للأمام حتى تنشئ واحداً. على جهاز Mac، افتح Terminal، وانتقل إلى المستودع، وتحقق من وجود تعديلات غير مثبتة، ثم إما أن تربط عملك الحالي بفرع جديد أو تعود بأمان إلى الفرع الذي كنت تقصد استخدامه. يدعم أمر switch في Git كلا المسارين. يشرح دليل Terminal من Apple كيفية فتح Terminal؛ وتوضح وثائق switch في Git سلوك الفروع وحالة detached-HEAD.
1. تحقق مما قام Git بسحبه
افتح Terminal من التطبيقات > الأدوات المساعدة (Applications > Utilities)، ثم انتقل إلى المستودع الخاص بك. استبدل مسار المثال بالمجلد الذي يوجد به مشروعك؛ تتيح علامات الاقتباس استخدام المسافات في المسار. يستخدم Terminal في macOS غلاف zsh افتراضياً، وتعمل هذه الأوامر في zsh وكذلك في الأغلفة (shells) الشائعة الأخرى.
cd "/path/to/your/repository"
git status
إذا أظهر أمر git status العبارة “HEAD detached” أو “not on any branch”، فأنت في حالة HEAD منفصل (detached HEAD). لقد قام Git بسحب commit مباشرة بدلاً من فرع. تظل الـ commit وملفات العمل متاحة؛ الخطر يكمن في أن الالتزامات التي تتم هنا لا ترتبط تلقائياً بأي فرع. يصف دليل checkout في Git هذه الحالة وكيف يمكن للفرع الاحتفاظ بالالتزامات التي تمت هناك.
قبل الانتقال إلى أي مكان، اقرأ بقية مخرجات git status. إذا كانت تسرد ملفات معدلة أو غير متتبعة (untracked)، فهذه تغييرات لم يتم إيداعها (committed). يمكنك متابعة العمل في مكانك، أو إنشاء فرع الآن؛ إنشاء فرع عند الـ commit الحالي لا يؤدي في حد ذاته إلى تجاهل التعديلات. تجنب خيارات الإجبار أو الإلغاء أثناء الاستعادة.
2. الاحتفاظ بالعمل الحالي على فرع
إذا قمت بإجراء commit أثناء وجودك في حالة الانفصال—أو كنت تريد مواصلة العمل انطلاقاً من هذه اللقطة المحددة—فأنشئ فرعاً في مكان وجودك الآن:
git switch -c recovered-work
git status
استخدم اسماً وصفياً للفرع بدلاً من recovered-work. ينشئ Git الفرع عند الـ commit الحالي وينتقل إليه، وبذلك ستنتمي الالتزامات اللاحقة إلى هذا الفرع. تأكد من أن git status يذكر اسم الفرع الآن. هذه هي أقصر طريقة للاستعادة عندما تكون اللقطة المنفصلة هي العمل الذي ترغب في الاحتفاظ به. توثق Git أن switch -c يقوم بإنشاء فرع والانتقال إليه.
إذا كانت لديك تعديلات غير مثبتة، فإنها تظل عادةً في شجرة العمل (working tree) أثناء إنشاء الفرع. تحقق من git status بعد ذلك للتأكد من أنها لا تزال موجودة. إذا رفض الأمر التنفيذ لأن فرعاً بهذا الاسم موجود بالفعل، فاختر اسماً مختلفاً؛ ولا تضف خيار -C، حيث يمكن أن يعيد تعيين فرع موجود إلى نقطة بداية جديدة.
3. العودة إلى الفرع الذي كنت تنوي استخدامه
إذا كنت قد قمت بفحص commit فقط وليس لديك أي تغييرات للاحتفاظ بها، فانتقل إلى الفرع المقصود بالاسم. على سبيل المثال:
git switch main
استخدم اسم الفرع الفعلي لمستودعك إذا لم يكن main. إذا أفاد Git بأن التغييرات المحلية سيتم الكتابة فوقها، فتوقف واحتفظ بها أولاً: أنشئ فرعاً للاستعادة كما هو موضح أعلاه، أو قم بإيداع (commit) العمل. يمنع Git عادةً التبديل بين الفروع عندما يؤدي ذلك إلى فقدان التعديلات المحلية؛ تجنب استخدام --discard-changes أثناء الاستعادة لأنه يعيد تعيين الفهرس وشجرة العمل لتتطابق مع الفرع المستهدف. يوضح دليل git switch إجراءات الحماية والخيارات هذه.
إذا كنت قد انتقلت للتو بعيداً عن فرع عن طريق الخطأ، فإن الأمر git switch - يعود إلى الفرع السابق أو الـ commit المسجل في سجل التبديل الأخير لـ Git. تحقق من git status بعد التبديل لتأكيد المكان الذي وصلت إليه.
4. العثور على commit منفصل تركته سابقاً
إذا كنت قد بدلت الفرع بالفعل ولا تتذكر أين ذهب الـ commit المنفصل، فافحص الـ reflog المحلي:
git reflog
يسجل الـ reflog التحديثات المحلية الأخيرة للمراجع، كما يسجل reflog الخاص بـ HEAD عمليات تبديل الفروع أيضاً. ابحث عن إدخال يحتوي على رسالة commit أو وقت يطابق عملك. لمعاينة خيار محتمل دون تغيير أي شيء، انسخ معرف الـ commit المختصر الخاص به من الـ reflog وشغّل:
git show --stat COMMIT_ID
استبدل COMMIT_ID بالمعرّف الفعلي—ولا تكتب النص البديل حرفياً. إذا كان هو الـ commit الصحيح، فاحتفظ به عن طريق إنشاء فرع عند هذا الـ commit:
git switch -c recovered-work COMMIT_ID
يجعل هذا الـ commit قابلاً للوصول عبر فرع مرة أخرى. تُعد سجلات الـ reflog سجلات محلية، ويمكن أن تنتهي صلاحية الإدخالات؛ تصف وثائق Git هذه السجلات بأنها سجلات لتحديثات المراجع الأخيرة وتوضح سلوك انتهاء صلاحيتها. انظر git reflog.
5. التحقق قبل المتابعة
شغّل git status و git log -1 --oneline لتأكيد الفرع الحالي وأحدث commit. إذا كان عملك غير مثبت بعد، فتحقق من أن ملفاته لا تزال تظهر في مخرجات حالة المستودع. إذا لم يظهر أي مرشح في الـ reflog، فقد تتطلب الاستعادة فحص الكائنات المعلقة (dangling objects)؛ وهذه خطوة منفصلة وأكثر حذراً، وعليك تجنب تشغيل أوامر التنظيف مثل git gc أثناء البحث.
لا تعني حالة detached HEAD أن عملك قد اختفى. تعتمد طريقة الاستعادة الصحيحة على ما إذا كنت بحاجة إلى الاحتفاظ بالـ commit الحالي، أو العودة إلى فرع موجود، أو تحديد موقع commit بعد التبديل والابتعاد عنه. يمنح الفرع الذي يتم إنشاؤه عند الـ commit الصحيح Git مرجعاً مسمى يمكن متابعته أثناء مواصلة عملك.
المصادر
وثائق git-switch — Git
وثائق git-checkout — Git
وثائق git-reflog — Git
فتح Terminal أو إنهائه على Mac — دعم Apple