الخطأتم رفض التحديثات لأن جهاز التحكم عن بعد يحتوي على عمل ليس لديك محليًا (خطأ غير سريع التقديم) يعني أن شخصًا ما دفع إلى الالتزام بالفرع البعيد الذي لا تملكه. يحظر Git دفعتك لمنع الكتابة فوق عملهم. وإليك كيفية حلها بأمان.
📋 Table of Contents
ماذا يعني هذا الخطأ
$ git push origin main
! [rejected] main -> main (non-fast-forward)
error: failed to push some refs to 'origin'
hint: Updates were rejected because the remote contains work that
hint: you do not have locally. This is usually caused by another
hint: repository pushing to the same ref.
قام شخص ما (أو أنت من جهاز آخر) بدفع الالتزام إلى الفرع البعيد بعد آخر عملية سحب. لقد تباعد فرعك المحلي وجهاز التحكم عن بعد. لن يسمح لك Git بالدفع لأنه سيتجاهل التزاماته.
الإصلاح 1: السحب ثم الدفع (الدمج)
# Fetch and merge the remote changes into your local branch
git pull origin main
# This creates a merge commit combining their work and yours.
# Resolve any conflicts if they occur, then:
git push origin main
هذا هو الافتراضي الآمن. إنه يدمج الالتزامات عن بعد مع التزاماتك عبر التزام الدمج، ثم تنجح الدفعة.
الإصلاح 2: السحب باستخدام Rebase (سجل المنظف)
# Replay YOUR commits on top of the remote's - linear history, no merge commit
git pull --rebase origin main
# If conflicts occur during rebase, resolve them, then:
git add
git rebase --continue
# Then push
git push origin main
توفر عملية إعادة التأسيس سجلًا خطيًا نظيفًا دون التزام بالدمج. العديد من الفرق تفضل هذا. يتم إعادة تنفيذ التزاماتك بالإضافة إلى آخر عمل عن بعد.
الإصلاح 3: الجلب والمراجعة أولاً (نهج دقيق)
# See what's on the remote before integrating
git fetch origin
# Compare your branch with the remote
git log HEAD..origin/main # commits on remote you don't have
git log origin/main..HEAD # your commits not on remote
# Then choose to merge or rebase
git merge origin/main # or: git rebase origin/main
git push origin main
قم بتعيين استراتيجية السحب الافتراضية
# Configure how git pull behaves (avoids the "divergent branches" warning)
# Merge (default) - creates merge commits
git config --global pull.rebase false
# Rebase - linear history
git config --global pull.rebase true
# Fast-forward only - fail if not possible (forces you to decide)
git config --global pull.ff only
عندما تكون متأكدًا من رغبتك في الكتابة فوق (خطير)
# ⚠️ ONLY if you're certain the remote commits should be discarded
# (e.g., your own feature branch nobody else uses)
# --force-with-lease is safer than --force:
# it fails if the remote changed since your last fetch
git push --force-with-lease origin my-feature-branch
# ❌ NEVER force push to shared branches (main, develop)
# It permanently deletes other people's commits
git push --force origin main # DON'T do this on shared branches
تحذير: يؤدي الدفع القسري إلى فرع مشترك إلى تدمير التزامات الآخرين. قم فقط بالدفع إلى فروع الميزات الخاصة بك التي لا يعمل عليها أي شخص آخر، وتفضل--force-with-lease.
فهم الفرق
# Before: your local and remote have diverged
# A---B---C (your local main)
# # D---E (remote main - someone else's commits)
# git pull (merge) creates:
# A---B---C---F (merge commit)
# \ /
# D---E
# git pull --rebase creates (cleaner):
# A---B---D---E---C' (your C replayed on top)
الأسئلة المتداولة
س: هل يجب علي الدمج أو إعادة الأساس لإصلاح ذلك؟
ج: يعد الدمج (git pull) هو الإعداد الافتراضي الآمن ويحافظ على السجل الدقيق. يوفر Rebase (git pull –rebase) تاريخًا خطيًا أنظف. بالنسبة للفروع المشتركة، إما يعمل؛ بالنسبة لفروع الميزات الخاصة بك قبل العلاقات العامة، فإن إعادة الأساس تحافظ على السجل مرتبًا. اتبع اتفاقية فريقك.
س: لماذا لا أستطيع الدفع بالقوة؟
ج: يؤدي فرض الدفع إلى فرع مشترك إلى حذف الالتزامات التي دفعها الآخرون بشكل دائم – ستفقد عملهم. قم فقط بفرض الدفع (مع –force-with-lease) إلى فروع الميزات الخاصة بك والتي لا يستخدمها أي شخص آخر. لا تجبر أبدًا على الدفع الرئيسي أو التطوير.
س: ما الذي يفعله –force-with-lease — الذي لا تفعله القوة؟
A: --force-with-lease يتحقق من أن جهاز التحكم عن بعد لم يتغير منذ عملية الجلب الأخيرة – إذا قام شخص ما بالدفع في هذه الأثناء، فإنه يفشل بدلاً من الكتابة فوقه. إنها شبكة أمان تمنع تدمير الالتزامات التي لم ترها عن طريق الخطأ. تفضلها دائمًا على القوة العادية.
س: لقد حصلت على تعارضات الدمج بعد السحب. ماذا الآن؟
ج: افتح الملفات المتعارضة، وقم بحل التعارضات (اختر التغييرات التي تريد الاحتفاظ بها)، ثمgit add الملفات التي تم حلها. للدمج،git commit. من أجل إعادة الأساس،git rebase --continue. ثم ادفع.
س: كيف أتجنب هذا الخطأ في المستقبل؟
ج: اسحب قبل أن تبدأ العمل وقبل أن تدفع. تواصل مع فريقك حول من يعمل على ماذا. في الفروع المشتركة النشطة، قم بالسحب بشكل متكرر للبقاء على اطلاع دائم وتقليل الاختلاف.
الخلاصة
يعني رفض الدفع غير السريع أن جهاز التحكم عن بعد لديه التزامات لم تكن لديك محليًا — يحمي Git تلك الالتزامات عن طريق حظر دفعك. الإصلاح بسيط:اسحب التغييرات عن بعد أولاً (git pullللدمج، أوgit pull --rebaseلتنظيف السجل)، وحل أي تعارضات، ثم اضغط على. لا تجبر أبدًا على الدفع إلى الفروع المشتركة – فهذا يدمر عمل الآخرين. إذا كان يجب عليك الكتابة فوق فرع الميزات الخاص بك، فاستخدم--force-with-lease (أكثر أمانًا من ). لتجنب هذا الخطأ، قم بالسحب بشكل متكرر وتواصل مع فريقك. إن فهم أن Git يحمي الالتزامات التي لم تراها يجعل الإصلاح أمرًا بديهيًا: قم بدمج العمل عن بعد، ثم الدفع.--force (أكثر أمانًا من ). لتجنب هذا الخطأ، قم بالسحب بشكل متكرر وتواصل مع فريقك. إن فهم أن Git يحمي الالتزامات التي لم تراها يجعل الإصلاح أمرًا بديهيًا: قم بدمج العمل عن بعد، ثم الدفع.
🔗 Share this article
✍️ Leave a Comment