حالة detached HEAD في Git: احتفظ بالعمل
تمثل المقاطع حالات مختلفة وليست سكربتاً واحداً. اختر الحالة المناسبة لمستودعك واستبدل أسماء الفروع والمسارات وVERIFIED_COMMIT قبل الاستخدام. أوامر الإلغاء تخص العملية النشطة المقابلة فقط؛ لا تنفذ البديلين معاً.
الجواب المختصر
تعني detached HEAD أن HEAD يشير مباشرة إلى commit بدلاً من اتباع فرع محلي. يمكنك الفحص والبناء وإنشاء commits. للاحتفاظ بعمل جديد، أنشئ فرعاً عند commit الحالي قبل المغادرة. الحالة نفسها ليست فقداناً؛ ترك commits جديدة دون مرجع دائم هو ما يخلق خطر الاستعادة.
المثال وشروطه
يستخدم المثال نسخة مؤقتة من إصدار قديم مع commitين جديدين لحفظهما كإصلاح. تختلف عن rebase نشط أو submodule منفصل عمداً. اقرأ status وأنهِ أو ألغِ العملية النشطة بقرار واضح قبل تطبيق هذا المسار، ولا تستخدمه لمقاطعة عملية أخرى عشوائياً.
افحص الحالة قبل التعديل
في الحالة العادية المنفصلة، تكون نتيجة branch --show-current فارغة. يشرح status الحالة ويعرض log التاريخ الحالي. سجل معرّف HEAD. الاسم الفارغ لا يعني أن المستودع بلا فروع أو أن الملفات غير متتبعة؛ المرجع ومحتوى شجرة العمل يجيبان عن سؤالين مختلفين.
git status
git branch --show-current
git log -3 --oneline
git rev-parse HEADاحتفظ بمرجع أو نسخة عمل منفصلة
أنشئ rescue/detached باستخدام switch -c وأنت عند commit المطلوب. يحافظ الفرع على التاريخ قابلاً للوصول، ولا يحول التعديلات غير المجهزة إلى commit. افحص واحفظ تلك التعديلات منفصلة عند الحاجة. اختر اسماً جديداً ولا تستبدل فرعاً موجوداً بخيار قوة.
git switch -c rescue/detached
git branch --show-currentالمسار الأول
تحقق من اسم الفرع والتاريخ والتغيير. يمكنك مواصلة العمل أو دمج الإصلاح بواسطة merge أو cherry-pick. ينسخ cherry-pick التغيير في commit جديد، بينما يجمع merge التاريخين. اختر بحسب المهمة وافحص النتيجة. الخروج الآمن من detached HEAD لا يتطلب push تلقائياً.
git log -3 --oneline --decorate
git show --stat HEADاختر النتيجة الأخرى عن قصد
إذا غادرت بالفعل، افحص reflog المحلي والمرشحين باستخدام show. اختر المعرّف الذي يطابق التغيير والأب، وأنشئ rescue/recovered عنده. VERIFIED_COMMIT عنصر نائب يجب استبداله. ليست HEAD@{1} دائماً commit المفقودة؛ العمليات اللاحقة تغير السجل الملائم.
git reflog --date=iso
git show VERIFIED_COMMIT
git branch rescue/recovered VERIFIED_COMMITالحدود والاستثناءات
يسجل reflog انتقالات المراجع المحلية وليس أرشيفاً بعيداً. قد تنتهي صلاحية السجلات والكائنات غير القابلة للوصول أو تُحذف. التعديلات غير المحفوظة لم تُسجل كـcommits. ابحث عن نسخة سابقة مثل نسخة المحرر أو stash متحقق منه، ولا تعد بإعادة محتوى الملفات غير المحفوظة بواسطة reflog.
التعارضات والتنظيف
غالباً يكون submodule في detached HEAD لاستخدام commit ثبتها الأب، وهذا طبيعي عند استهلاك التبعية. لتطوير المستودع الابن، أنشئ فرعه الخاص داخله واتبع مسار مساهمته. فرع الأب لا يسمي commits الابن تلقائياً؛ المراجع والتاريخ مستقلان في المستودعين.
تحقق من النتيجة
قبل حذف فرع الإنقاذ، تحقق أن فرعاً دائماً أو دمجاً مراجعاً ما زال يصل إلى العمل المطلوب. افحص الحالة والتغيير في الوجهة واحتفظ بالمرجع أثناء المراجعة. اسم الفرع يحفظ التاريخ المؤكد، وليس نسخة مادية ثانية لكل الملفات أو إثبات اجتياز الفحوص.
git log --oneline --decorate rescue/detached
git status --shortأسئلة شائعة
هل هي مشكلة؟ ليست كذلك عند فحص commit أو tag أو submodule مثبت عمداً. هل يمكن إنشاء commit؟ نعم، لكن سمّ التاريخ قبل المغادرة. هل يمكن استعادته لاحقاً؟ أحياناً إذا بقيت الكائنات والأدلة المحلية؛ افحص المرشحين دون ضمان حفظ دائم.
راجع العملية في FluxGit
استخدم عرض التاريخ والتغييرات في FluxGit لمراجعة العملية وcommits المعنية. احتفظ بفحوص الفرع والمشاركة والملفات المحلية في هذا المثال. تعرض صفحة التنزيل النسخ والمنصات المتاحة حالياً.