الدفع يعني إرسال الالتزامات المحلية إلى مستودع Git عن بُعد، مما يجعلها متاحة لأعضاء الفريق الآخرين. بعد الدفع، تظهر التغييرات على GitHub أو GitLab أو Bitbucket. وفقًا لـ GitHub Octoverse 2024، يتم دفع أكثر من 10 ملايين التزام يوميًا على المنصة. Git push هو إجراء رئيسي لمزامنة العمل في فريق موزع.
النقاط الرئيسية
Git push هو أمر ينقل الالتزامات من مستودع محلي إلى مستودع عن بُعد. على عكس commit، الذي يحفظ التغييرات فقط على جهاز المطور المحلي، فإن الدفع ينشر هذه التغييرات للفريق بأكمله. Push هو خطوة إلزامية قبل إنشاء Pull Request والنشر.
تفترض بنية Git أن كل مطور يعمل في مستودعه المحلي الخاص. يتم إنشاء الالتزامات محليًا وتتراكم حتى يقرر المطور دفعها. وهذا يوفر حرية: يمكنك عمل العديد من الالتزامات المحلية والتجربة وإعادة كتابة التاريخ دون التأثير على الزملاء.
# ادفع إلى remote origin، فرع main
git push origin main
# ادفع الفرع الحالي إلى remote مع upstream
git push -u origin feature/new-dashboard
# ادفع جميع الفروع بأسماء متطابقة
git push --all origin
# الدفع القسري مع lease (دفع قسري آمن)
git push --force-with-lease
بعد الدفع، يقوم المستودع عن بُعد بتحديث المراجع (مؤشرات الفروع) بحيث تشير إلى الالتزامات الجديدة. يمكن للمطورين الآخرين استرداد هذه التغييرات عبر git pull أو git fetch. يشكل تبادل الالتزامات هذا أساس التطوير التعاوني.
يقارن أمر git push الفروع المحلية والبعيدة وينقل فقط الالتزامات المفقودة. لا يعيد Git إرسال جميع الملفات — بل ينقل فقط الفرق، مما يجعل الدفع سريعًا حتى للمستودعات الكبيرة. بروتوكول Git يستخدم النقل الذكي، مما يقلل من حجم البيانات المنقولة.
إذا كان الفرع البعيد يحتوي على التزامات غير موجودة محليًا، فسيتم رفض الدفع. هذه آلية حماية تمنع فقدان التغييرات. في هذه الحالة، يجب على المطور أولاً تشغيل git pull، دمج التغييرات، ثم الدفع مرة أخرى. البديل هو الدفع القسري، الذي يستبدل الفرع البعيد، ولكن يجب استخدامه بحذر.
| الأمر | الإجراء | متى تستخدمه |
|---|---|---|
| git push | دفع قياسي إلى الفرع المتتبع | إرسال التغييرات العادي |
| git push -u | دفع مع إعداد المنبع | أول دفع لفرع جديد |
| git push --force-with-lease | دفع قسري آمن | بعد إعادة تأسيس فرعك |
| git push --force | دفع إجباري | فقط إذا كنت متأكدًا من عدم وجود تعارضات |
| git push --delete | حذف الفرع البعيد | التنظيف بعد دمج الفرع |
فهم المستودعات البعيدة هو مفتاح الدفع الصحيح. عادةً ما يكون origin هو اسم المستودع البعيد الافتراضي. يعرض الأمر git remote -v قائمة المستودعات البعيدة وعناوين URL الخاصة بها. يمكنك إضافة عدة مستودعات بعيدة (مثل origin للمستودع الرئيسي و upstream للفork).
القاعدة الرئيسية: ادفع بعد كل مرحلة مكتملة منطقيًا من العمل. إذا أنهى المطور مهمة أو جزءًا منها — فقد حان وقت الدفع. ومع ذلك، لا يُنصح بدفع عمل غير مكتمل يكسر البناء. بناء غير معطل هو الحد الأدنى من المتطلبات للدفع إلى أي فرع.
في التطوير الجماعي، يتم اعتماد الإيقاع التالي: صباحًا — git pull للحصول على تغييرات الزملاء، خلال اليوم — عدة التزامات ودفع واحد أو اثنين، مساءً — دفع نهائي لجميع المهام المكتملة. كلما دفع المطور أكثر، قل خطر تعارضات الدمج وزادت شفافية تقدم العمل.
الدفع الآمن هو مجموعة من القواعد التي تمنع فقدان البيانات والتعارضات في الفريق. القاعدة الأولى والأهم: لا تدفع أبدًا مباشرة إلى فرع main أو master إذا لم يكن المشروع يحتوي على نشر مباشر. في الفرق الحديثة، يتم تكوين حماية فرع main على مستوى حماية فرع GitHub.
القاعدة الثانية: تزامن مع الفرع البعيد قبل الدفع. قم بتشغيل git pull --rebase لتجنب التزامات الدمج عند الدمج. هذا يبسط التاريخ ويجعله خطيًا. إذا تم رفض الدفع — لا تستخدم الدفع القسري المجرد، بل اكتشف أولاً أي الالتزامات ظهرت على الفرع البعيد.
القاعدة الثالثة: قم بإعداد خطافات ما قبل الدفع التي تشغل تلقائيًا الاختبارات وأدوات التحليل قبل الإرسال. إذا فشلت الاختبارات — يتم حظر الدفع. يتم تكوين هذه الخطافات عبر Husky أو خطافات Git (ملف pre-push في .git/hooks).
القاعدة الرابعة: لا تدفع ملفات ثنائية كبيرة. Git غير مصمم لتخزين القطع الأثرية الثنائية — فهي تضخم المستودع وتبطئ العمليات. للملفات الكبيرة، استخدم Git LFS (تخزين الملفات الكبيرة). إذا تم دفع ملف ثنائي بالفعل وهو في التاريخ، فيجب إزالته عبر git filter-branch.
السبب الأكثر شيوعًا لفشل الدفع هو أن الفرع البعيد يحتوي على التزامات غير موجودة محليًا. يحدث هذا عندما يدفع مطور آخر تغييراته إلى نفس الفرع. الحل: قم بتشغيل git pull، حل أي تعارضات، ثم ادفع مرة أخرى.
# تم رفض الدفع — قم بـ fetch و rebase أولاً
git fetch origin
git rebase origin/main
# حل التعارضات، ثم:
git push --force-with-lease
# أو ببساطة ادمج التغييرات البعيدة
git pull origin main
git push
السبب الثاني — عدم وجود صلاحيات الكتابة على الفرع. إذا كان الفرع main محميًا بقواعد حماية الفرع، فإن الدفع المباشر محظور. الحل: ادفع إلى فرع فرعي وأنشئ Pull Request. يتم إدارة إعدادات الحماية عادةً عبر إعدادات GitHub أو الفروع المحمية في GitLab.
السبب الثالث — مشكلات المصادقة. بيانات الاعتماد القديمة، التبديل إلى SSH أو تغيير رمز الوصول الشخصي. الحل: تحقق من عنوان URL البعيد (git remote -v) وقم بتحديث بيانات الاعتماد. منذ عام 2021، أوقف GitHub المصادقة بكلمة المرور لـ HTTPS — استخدم رمزًا مميزًا شخصيًا أو مفتاح SSH.
الأسئلة الشائعة
الدفع يعني إرسال الالتزامات المحلية من مستودع المطور إلى خادم بعيد (GitHub، GitLab). بعد الدفع، تصبح التغييرات متاحة للفريق، وتظهر في Pull Requests ويمكن نشرها. Push هو المرحلة النهائية من العمل المحلي على الكود قبل التعاون الجماعي.
Commit يحفظ التغييرات محليًا، في مستودع المطور. Push يرسل تلك الالتزامات المحلية إلى خادم بعيد. يمكنك عمل العديد من الالتزامات بدون دفع، ولكن لكي يرى الزملاء التغييرات، تحتاج إلى الدفع. Commit هو حفظ، push هو نشر.
يتم رفض الدفع إذا كان الفرع البعيد يحتوي على التزامات غير موجودة محليًا. الحل: قم بتشغيل git pull (أو git fetch + git rebase)، ادمج التغييرات وادفع مرة أخرى. إذا كنت تعمل في فرعك الفرعي الخاص وواثق من التغييرات، استخدم git push --force-with-lease.
نعم، ولكن بحذر. استخدم git revert <commit-hash> — ينشئ التزامًا يعكس التغييرات. ثم ادفع الالتزام الجديد. إذا كنت بحاجة إلى إزالة التزامات من التاريخ، استخدم git reset + git push --force-with-lease، ولكن فقط في فرعك الفرعي الخاص. git revert هو الخيار الآمن للفروع المشتركة.
الدفع المنتظم يمنع فقدان البيانات بسبب تعطل الجهاز المحلي، ويقلل من تعارضات الدمج ويعطي الفريق رؤية للتقدم. إذا لم يدفع المطور لمدة أسبوع، فقد تتباعد تغييراته بشكل كبير عن الفرع main، مما يؤدي إلى تعارضات معقدة أثناء الدمج.
الملخص
سنقوم بتطوير تطبيق جوال جاهز
تقدم IT Sectr تطبيقات iOS وAndroid للشركات الناشئة والشركات منذ عام 2017. سوف نقدم لك النصح ونقترح أفضل حل.