على جهاز Mac الخاص بك، افتح Terminal، وانتقل إلى مجلد المستودع، وشغّل git status -sb. إذا أظهر الفرع الحالي ahead 1 (أو أي رقم موجب آخر) مقارنةً بفرعه البعيد المتتبع (upstream)، فهذا يعني أن لديه إيداعات محلية غير ممثلة في فرع التتبع البعيد الذي يقارن Git به. قم بإجراء fetch أولاً لتحديث هذه المقارنة، ثم اعرض الإيداعات المحددة. يتحقق هذا الأمر من سجل الإيداعات المؤكدة؛ أما التعديلات التي لم يتم إيداعها بعد فهي نوع منفصل من التغييرات المحلية.
فحص الفرع الحالي مقارنةً بفرع التتبع البعيد الخاص به
في Terminal، انتقل إلى مجلد المشروع. يمكنك كتابة cd ، وسحب المجلد من Finder وإفلاته داخل نافذة Terminal، ثم الضغط على Return. شغّل:
git status -sb
نتيجة مثل ## main...origin/main [ahead 2] تعني أن الفرع المحلي main يتقدم بإيداعين على الفرع البعيد المضبوط لتتبعه، origin/main، وذلك استناداً إلى آخر حالة مسجلة لدى Git للمستودع البعيد. أما [behind 1] فتعني أن الفرع البعيد المتتبع يحتوي على إيداع واحد غير موجود محلياً. وإذا ظهر كلا العددين، فهذا يعني أن الفرعين قد تباعدا (diverged). توضح وثائق Git أن أمر status يمكنه إظهار أعداد التقدم والتأخر عند تعيين فرع upstream متاح للمقارنة. وثائق Git status
للحصول على الحالة الكاملة، استخدم git status. يُبلغ هذا الأمر أيضاً عن التغييرات في شجرة العمل (working tree) ومنطقة الإعداد (staging area). هذه الملفات المعدلة أو غير المتتبعة ليست دليلاً على وجود إيداعات غير مدفوعة: فهي ليست إيداعات بعد. يمكن لشجرة عمل نظيفة أن تحتوي على إيداعات غير مدفوعة، ويمكن لشجرة عمل بها تعديلات غير مؤكدة ألا تحتوي على أي إيداعات معلقة.
تحديث المقارنة، ثم فحص الإيداعات
اسم origin/main هو مرجع تتبع بعيد محلي؛ وليس عرضاً حياً ومباشراً للخادم. شغّل أمر fetch لتحديث المراجع من المستودعات البعيدة المضبوطة، ثم تحقق من الحالة مرة أخرى:
git fetch
git status -sb
يقوم git fetch بتحديث معلومات التتبع البعيد دون دمج تلك التغييرات المجلوبة في فرعك الحالي. وهو لا يدفع الإيداعات المحلية. قد يفشل أمر Fetch إذا تعذر الوصول إلى الخادم البعيد أو تعذرت المصادقة؛ وفي هذه الحالة، لن تتمكن المقارنة القديمة من إخبارك بما هو موجود على الخادم الآن. وثائق Git fetch
إذا أظهرت الحالة أن الفرع متقدم ولديه upstream، فاعرض الإيداعات التي يمكن الوصول إليها من فرعك الحالي ولكن ليس من هذا الـ upstream:
git log --oneline '@{u}..HEAD'
كل سطر في الناتج يمثل إيداعاً؛ الأول هو الأحدث في هذا النطاق. والنتيجة الفارغة تعني أن Git لم يعثر على أي إيداعات في ذلك النطاق. الاختصار @{u} يشير إلى فرع الـ upstream المضبوط للفرع الحالي، ونطاق النقطتين يحدد الإيداعات التي يمكن الوصول إليها من HEAD ولكن ليس من الـ upstream. وثائق تنقيحات Git
على سبيل المثال، إذا كانت الحالة تشير إلى [ahead 2] ويعرض السجل عنواني إيداعين، فهذان هما الإيداعان المتقدمان محلياً عن الفرع المتتبع. هذا تأكيد مفيد قبل اتخاذ قرار بشأن ما إذا كنت تنوي دفعهما أم لا. هذا الأمر في حد ذاته لا يرسل أي شيء.
إذا لم يتمكن Git من مقارنة الفرع
إذا أظهر git status -sb عدم وجود أعداد للتقدم/التأخر، فقد لا يكون للفرع upstream مضبوط. شغّل:
git branch -vv
يتم تمييز الفرع الحالي بعلامة *؛ ويحدد النص بين القوسين، عند وجوده، الـ upstream الخاص به وأعداد التباعد. إذا لم يظهر upstream، فلن يتوفر لدى Git مرجع التتبع المعتاد لهذه المقارنة. يمكن لأمر git remote -v إظهار أسماء الخوادم البعيدة وعناوين URL الخاصة بها، ولكنه لا يحدد الفرع البعيد المقصود كوجهة. توضح وثائق Git أن الفروع البعيدة المتتبعة (upstreams) هي إعدادات اختيارية للفرع تستخدمها أوامر مثل status. وثائق Git pull
تجنب تخمين origin/main: قد يتتبع فرعك فرعاً باسم مختلف أو مستودعاً بعيداً مختلفاً. إذا كنت تعرف الفرع البعيد المقصود، فقارن صراحةً بعد إجراء fetch، مع استبدال origin/main باسمه الفعلي:
git log --oneline origin/main..HEAD
يسرد هذا الإيداعات الموجودة في HEAD الحالي ولكنها غائبة عن ذلك المرجع. إذا كانت الوجهة غير مؤكدة، فافحص تكوين الفرع والمستودع البعيد قبل التعامل مع النتيجة كمعاينة للدفع. يسمح Git بأن تختلف وجهة الدفع المضبوطة عن الـ upstream المستخدم للمقارنة. وثائق تنقيحات Git
ما يثبته هذا الفحص وما لا يثبته
المقارنة دقيقة فقط بقدر حداثة آخر عملية fetch ناجحة. يمكن لشخص آخر دفع إيداعات جديدة بعد عملية الـ fetch الخاصة بك، أو قد يتغير الخادم قبل أن تقوم بالدفع. يمنحك الـ fetch الناجح مرجعاً أحدث لـ Git؛ لكنه لا يضمن نجاح عملية الدفع اللاحقة. وبالمثل، فإن الإيداع الغائب عن origin/main ليس بالضرورة غائباً عن كل فرع أو مستودع بعيد.
عندما تتأكد من الوجهة المقصودة وترغب في إرسال الإيداعات، استخدم أمر الدفع المناسب لإعدادات الفرع والمستودع البعيد لديك. إذا أبلغ Git بعدم ضبط أي upstream، فقد يتطلب ذلك تحديد المستودع البعيد والفرع بشكل صريح؛ تحقق من الوجهة بعناية قبل الدفع. تحدد الخطوات المذكورة أعلاه السجل المحلي مقابل السجل المتتبع حتى تتمكن من اتخاذ هذا القرار دون الخلط بين تعديلات الملفات غير المودعة والإيداعات الفعلية.
المصادر
وثائق Git status — Git
وثائق Git fetch — Git
وثائق تنقيحات Git — Git
وثائق Git pull — Git