إذا قمت بتجهيز ملف في مشروع Git على جهاز Mac الخاص بك ولكنك ترغب في استبعاده من عملية الإيداع التالية، فشغّل الأمر git restore --staged لذلك الملف من تطبيق Terminal. يؤدي هذا إلى تحديث منطقة التجهيز في Git مع إبقاء الملف في مجلد العمل الخاص بك، بحيث تظل تعديلاته متاحة لمراجعتها أو تجهيزها لاحقًا. تحقق من مسار الملف وأكّد النتيجة باستخدام git status قبل إجراء الإيداع.
ما الذي يغيّره "إلغاء التجهيز" (unstage)
يحتفظ Git بالإيداع التالي المقترح في الفهرس (index) الخاص به، والذي يُعرف أيضًا باسم منطقة التجهيز (staging area). يشتمل الإيداع عادةً على التغييرات المجهزة؛ أما التعديلات التي لم تقم بتجهيزها فتظل في شجرة العمل (working tree) الخاصة بك. وبناءً على ذلك، فإن إزالة ملف من الفهرس تغير ما تم تحضيره للإيداع، دون مطالبة Git بإعادة كتابة نسخة العمل. توضح وثائق Git أن الأمر git restore --staged يقوم باستعادة الفهرس من HEAD افتراضيًا. وثائق restore الخاصة بـ Git
هذا مفيد عندما تقوم بتجهيز ملف خاطئ، أو عندما تقرر استبعاد ملف معين من الإيداع. يكون الأمر مخصصًا لملف بعينه عند تزويده بمسار واحد. لا تضف الخيار --worktree: إذ تشير وثائق Git إلى أن استخدام كل من --staged و--worktree معًا يؤدي إلى استعادة كلا الموقعين، وهو ما يتعارض مع هدفك إذا كنت ترغب في الاحتفاظ بتعديلاتك.
إلغاء تجهيز ملف واحد من تطبيق Terminal
افتح تطبيق Terminal على جهاز Mac الخاص بك وانتقل إلى مجلد المستودع. غلاف الأوامر (shell) الافتراضي في Terminal هو zsh، على الرغم من أن جهاز Mac الخاضع لإدارة المؤسسات قد يستخدم غلافًا مختلفًا. دليل Terminal من Apple
شغّل الأمر git status أولاً. ابحث عن الملف المجهز تحت قسم "Changes to be committed" ولاحظ مساره بالنسبة إلى جذر المستودع. إذا رأيت مستودعًا مختلفًا أو كان المسار غير واضح، فتوقف وتحقق من موقعك قبل إجراء أي تغيير.
على سبيل المثال، لإلغاء تجهيز src/Feature.swift، شغّل:
git restore --staged -- src/Feature.swift
يفصل الرمز -- الخيارات عن المسار. وهو مفيد للأسماء التي قد تُفسر لولا ذلك كخيارات. ضع المسارات التي تحتوي على مسافات بين علامتي اقتباس حتى يمرر zsh المسار كمعامل واحد:
git restore --staged -- "Documentation/Setup Notes.md"
استخدم المسار تمامًا كما يعرضه Git، بما في ذلك حالة الأحرف وأي أسماء أدلة. إذا كنت موجودًا بالفعل داخل دليل فرعي للمستودع، فقد يكون تعامل Git مع المسارات أقل وضوحًا؛ لذا فإن تشغيل الأمر من جذر المستودع واستخدام المسار الكامل بالنسبة للمستودع يجعل التحقق من الهدف أسهل.
التأكد من بقاء التعديلات
شغّل git status مرة أخرى. بالنسبة لملف متتبع ومعدل، يجب أن يختفي التغيير المجهز من "Changes to be committed" ويظهر تحت "Changes not staged for commit". يعني هذا أن نسخة العمل لا تزال تختلف عن HEAD، لكن الفهرس لم يعد يحتوي على ذلك التغيير المقترح. يصف Git حالة status بأنها تعرض الفروق بين HEAD والفهرس، وبين الفهرس وشجرة العمل. وثائق add الخاصة بـ Git
يمكنك فحص التعديلات غير المجهزة باستخدام:
git diff -- "src/Feature.swift"
يقارن أمر diff هذا ملف العمل بالفهرس. ولأن الفهرس يتطابق الآن مع HEAD لهذا الملف المتتبع، فإنه يعرض التعديلات المحتفظ بها التي قمت بإزالتها من منطقة التجهيز. لتجهيز الملف لإيداع لاحق، قم بتجهيزه مجددًا باستخدام git add -- "src/Feature.swift".
ما يمكن توقعه بالنسبة للملفات الجديدة وعمليات الحذف
إذا كان الملف جديدًا ولم يتم إيداعه من قبل، فليس له إصدار في HEAD. بعد أن يقوم الأمر git restore --staged -- path/to/new-file بإزالته من الفهرس، يجب أن يظل الملف على القرص كملف غير متتبع (untracked). تحقق من ظهوره تحت "Untracked files" في ناتج git status؛ ولا تحذفه إذا كنت ترغب في الاحتفاظ به.
إذا قمت بتجهيز عملية حذف لملف متتبع، فإن استعادة الفهرس من HEAD تعيد الإصدار المتتبع إلى الفهرس، بينما تظل نسخة العمل محذوفة. يجب أن تُظهر الحالة (status) عملية حذف غير مجهزة. هذا الفارق مهم: فإلغاء التجهيز لا يجعل شجرة العمل تبدو دون تغيير بالضرورة، بل يحافظ على الحالة الموجودة حاليًا على القرص.
إذا قمت بتجهيز جزء فقط من الملف
يقوم الأمر نفسه بإلغاء تجهيز محتويات الملف المجهزة بأكملها. إذا كنت قد قمت عمدًا بتجهيز بعض الأجزاء (hunks) وترغب في إبقاء أجزاء محددة فقط مجهزة، فلا تشغّل أمر الملف بأكمله. يدعم أمر restore في Git وضع الترقيع التفاعلي (interactive patch mode)، لكن تحديد الاتجاه والأجزاء الصحيحة يتطلب عناية ودقة. راجع سلوك git restore --patch الموضح في وثائق Git قبل استخدامه؛ كما توثق Git أيضًا الأمر git add --patch لاختيار الأجزاء المراد تجهيزها بشكل تفاعلي. وثائق restore الخاصة بـ Git
تجنب استخدام git restore --worktree أو git restore --staged --worktree لهذه المهمة. تؤثر هذه الخيارات على شجرة العمل ويمكن أن تتخلص من التعديلات نفسها التي تحاول الاحتفاظ بها. إذا كانت النتيجة في git status تختلف عما توقعته، فتوقف مؤقتًا وافحص المسار والفارق (diff) قبل تشغيل أمر استعادة آخر.
المصادر
Git - وثائق git-restore — Git
Git - وثائق git-add — Git
تغيير غلاف الأوامر الافتراضي في Terminal على Mac — دعم Apple