في هذا الدرس 6تصفّح المواضيع
إنشاء الالتزامات بالأمر git commit يحفظ اللقطات داخل قرصك المحلي فقط. ولنشر هذه الالتزامات إلى المستودع السحابي على GitHub، نستخدم الأمر git push <remote> <branch>. وفي المرة الأولى لرفع الفرع، نمرر الخيار -u أي --set-upstream ليقوم Git بربط فرعك المحلي بفرع التتبع البعيد، مما يتيح لك لاحقاً كتابة git push فقط دون تكرار اسم الرابط والفرع.
# Publish local main branch and set upstream tracking (-u)
git push -u origin main
# Subsequent pushes on main only require:
git push
عندما تنشئ فرع ميزة جديداً على جهازك بالأمر git switch -c feature-login، يظل هذا الفرع محلياً بالكامل ولا يظهر على منصة GitHub إلا بعد رفعه صراحةً بالأمر git push -u origin feature-login.
git switch -c feature-login
git add .
git commit -m "Implement login form validation"
git push -u origin feature-login
إذا رفع أحد زملائك التزامات جديدة إلى الفرع البعيد أثناء عملك المحلي، فسيرفض Git أمر الرفع التالي برسالة التنبيه ! [rejected] main -> main (non-fast-forward). يمنع Git هذا الرفع لحماية التزامات زميلك من المسح؛ والخطوة الهندسية الصحيحة لمعالجته هي جلب تعديلات الخادم أولاً بالأمر git pull --rebase origin main ثم إعادة تنفيذ git push.
# Step 1: Integrate remote commits on top of local work
git pull --rebase origin main
# Step 2: Push the unified linear history cleanly
git push origin main
بعد اكتمال دمج فرع الميزة في الفرع الرئيسي main، يُنصح بحذف الفرع المنتهي من الخادم السحابي لمنع تكدس الفروع القديمة، وذلك عبر الأمر git push origin --delete <branch> متبوعاً بحذف النسخة المحلية بالأمر git branch -d <branch>.
# Delete merged feature-login branch from GitHub remote
git push origin --delete feature-login
# Delete local branch copy cleanly
git switch main
git branch -d feature-login
عندما تعدّل التزاماً بـ --amend أو تعيد بناء قاعدة فرعك الخاص بعد رفعه مسبقاً، تتغير بصمات الالتزامات ويرفض الخادم الرفع العادي. إياك واستخدام القوة العمياء git push --force على الفروع المشتركة لأنها تمسح عمل زملائك دون تحذير؛ واستخدم بدلاً منها في فرعك الشخصي الخيار الآمن git push --force-with-lease الذي يتحقق أولاً من عدم وجود أي التزامات جديدة غير مرئية على الخادم.
# Safely update your own rebased feature branch
git push --force-with-lease origin feature-auth
# Check branch tracking status
git branch -vv
يوضح الجدول الشامل التالي جميع صيغ وخيارات الأمر git push ومستوى الأمان الهندسي لكل منها:
| الأمر والصيغة | نطاق التأثير | السلوك الأمني | السيناريو الهندسي الموصى به |
|---|---|---|---|
git push -u origin main | الفرع المحدد | يضبط ربط التتبع التلقائي | أول عملية رفع للفرع الرئيسي أو فرع ميزة جديد |
git push | الفرع المتتبع | آمن (يرفض الكتابة فوق عمل الغير) | النشر اليومي للالتزامات المحلية الجديدة |
git push origin --delete <br> | الفرع البعيد | يزيل مؤشر الفرع من السحابة | تنظيف فروع الميزات بعد دمجها بنجاح |
git push --force-with-lease | فرع الميزة | يتوقف فوراً إذا وُجدت التزامات غير مجلوبة | تحديث فرعك الخاص بعد التعديل أو إعادة القاعدة |
git push --force | تاريخ الفرع البعيد | خطير جداً (يمسح الالتزامات البعيدة قسرياً) | يُتجنب تماماً على الفروع المشتركة والفرع الرئيسي |
ملخص الدرس
حصاد الدرسمراجعة مركّزة لأهم المفاهيم والقواعد الهندسية التي أتقنتها في هذا الدرس قبل التطبيق العملي
ماذا تعلّمت في هذا الدرس؟
أتقنت في هذا الدرس نشر الالتزامات والفروع الجديدة عبر git push -u، ومعالجة رفض الرفع غير المتزامن بـ git pull --rebase، وحذف الفروع البعيدة المنتهية بـ --delete، واستخدام البديل الآمن --force-with-lease. الخطوة التالية: انتقل الآن إلى الوحدة السابعة والدرس 30 «نسخ المشاريع Fork والمساهمة في المصادر المفتوحة» لاحتراف آليات العمل الجماعي على GitHub.
سجّل الدخول لحفظ تقدمك
تابع إنجاز المواضيع والمصطلحات والمهام، وكمّل من آخر خطوة على أي جهاز.
المصطلحات4
راجع المعنى، اشرحه لنفسك، ثم علّم البطاقة كمفهومة.
- 01 git push أمر الرفع git push
- الأمر المسؤول عن رفع الالتزامات ومراجع الفروع المحلية ونشرها إلى المستودع البعيد.
- للمراجعة
- 02 Upstream Tracking (-u) ربط التتبع -u / --set-upstream
- خيار يربط الفرع المحلي بنظيره على الخادم البعيد أثناء أول عملية رفع لتسهيل المزامنة اللاحقة.
- للمراجعة
- 03 Non-Fast-Forward Rejection رفض الرفع غير المتزامن
- حاجز أمان يمنع رفع التزاماتك إذا كان الفرع البعيد يحتوي على التزامات جديدة لزملائك لم تجلبها بعد.
- للمراجعة
- 04 --force-with-lease الرفع المشروط --force-with-lease
- بديل آمن للرفع القسري يشترط عدم وجود أي التزامات جديدة على الخادم لم يطلع عليها مستودعك المحلي.
- للمراجعة
لا توجد بطاقات تطابق البحث والتصفية.
اقرأ البطاقات بحرية. سجّل الدخول لحفظ تقدم مراجعتك.
الاختصارات4
راجع المعنى، اشرحه لنفسك، ثم علّم البطاقة كمفهومة.
- 01 FF FF
- Fast-Forward
- تقدم مباشر لمؤشر الفرع البعيد عندما يكون تاريخك المحلي شاملاً لكل التزامات الخادم.
- للمراجعة
- 02 PR PR
- Pull Request
- طلب سحب ومراجعة كود يُفتح على GitHub عقب رفع فرع الميزة.
- للمراجعة
- 03 SSH SSH
- Secure Shell
- البروتوكول المشفر المستخدم لتوثيق عمليات الرفع السحابي بأمان.
- للمراجعة
- 04 CLI CLI
- Command-Line Interface
- بيئة سطر الأوامر التي توفر خيارات الرفع الدقيق والفحص.
- للمراجعة
لا توجد بطاقات تطابق البحث والتصفية.
اقرأ البطاقات بحرية. سجّل الدخول لحفظ تقدم مراجعتك.
مهامك قبل الاختبار
خطوة صغيرة كل مرة. وإنجاز تقدر ترجع له.
-
أنشئ فرعاً جديداً بـ git switch -c feature-login واحفظ التزاماً ثم ارفعه مع ربط التتبع بالأمر git push -u origin feature-login.
-
استعرض التبويبات الثلاثة في المختبر التفاعلي لملاحظة خطوات علاج رفض الرفع وحذف الفروع البعيدة.
تأشير المهمة إقرار منك بإتمامها، وليس تصحيحًا آليًا للكود. يُحفظ تقدمك في حسابك.
اختبر فهمك.
ووصلها للإتقان.
كل سؤال خطوة لقدّام. اختار، اكتب كود، وشوف نتيجتك فورًا.
أكمل المهام، واجمع كل الإجابات الصحيحة. أقل من 100%؟ راجع وأعد المحاولة.
الأسئلة متاحة للاطلاع. سجّل الدخول للتفاعل وحفظ تقدمك.
لمحة عن التحدي10 أسئلة تنتظرك +
ما وظيفة الخيار "-u" ("--set-upstream") في الأمر "git push -u origin main"؟
يرفع الفرع ويربطه بفرع التتبع البعيد origin/main بحيث تكفي كتابة git push أو git pull لاحقاً.
لماذا يرفض Git عملية الرفع برسالة الخطأ "! [rejected] main -> main (non-fast-forward)"؟
لأن الفرع البعيد يحتوي على التزامات جديدة رفعها عضو آخر في الفريق ولم تقم بجلبها ودمجها محلياً بعد.
ما الإجراء الهندسي الصحيح لمعالجة رفض الرفع (non-fast-forward) على فرع مشترك؟
نفّذ git pull --rebase لجلب ودمج تحديثات الخادم محلياً ثم أعد تنفيذ git push بأمان.
بمجرد إنشاء فرع محلي جديد بالأمر "git switch -c feature-nav"، يظهر الفرع تلقائياً على GitHub دون الحاجة لتنفيذ "git push".
خطأ؛ فالفروع المحلية تبقى داخل جهازك فقط حتى ترفعها صراحةً بالأمر git push.
أي أمر يحذف الفرع البعيد "feature-login" من منصة GitHub بعد الانتهاء من دمجه؟
يحذف الأمر git push origin --delete feature-login الفرع المحدد من الخادم البعيد.
لماذا يُعد الخيار "git push --force-with-lease" أكثر أماناً بكثير من "git push --force"؟
لأنه يتحقق أولاً من عدم وجود التزامات جديدة غير مجلوبة على الفرع البعيد ويرفض المسح إذا رفع زميلك تعديلاً جديداً.
قد يؤدي تنفيذ "git push --force" على الفرع المشترك "main" إلى مسح التزامات زملائك على الخادم البعيد.
صواب؛ فالرفع القسري على الفروع المشتركة يستبدل سجل الخادم ويمسح التزامات الآخرين.
أي أمر يعرض الفروع المحلية مع فروع التتبع البعيدة المرتبطة بها وعدد الالتزامات المتقدمة أو المتأخرة؟
يعرض الأمر git branch -vv تفاصيل كل فرع محلي مع مؤشر التتبع البعيد المرتبط به.
بعد تعديل التزام مرفوع مسبقاً باستخدام "git commit --amend" على فرعك الشخصي، لماذا يفشل أمر "git push" العادي؟
لأن التعديل بـ --amend ينشئ التزاماً ببصمة SHA-1 جديدة مختلفة عن البصمة الموجودة على الخادم البعيد.
تظل الالتزامات المنشأة بالأمر "git commit" محلية على جهازك فقط حتى تنفذ الأمر "git push".
صواب؛ لأن Git نظام موزع يفصل بين الحفظ المحلي في القرص وبين النشر الشبكي إلى السحابة.