■ space · مسار النثر
git fetch upstream && git merge upstream/main && git push origin main — هذه هي المزامنة كلها.
تفضّل التاريخ الخطي؟ استبدل merge بـ git rebase upstream/main + push --force-with-lease.
الفورك "لا يتزامن"؟ Missing upstream remote الغائب هو السبب #1 — وصّله مرة واحدة، أدناه.
خط الأنابيب
المزامنة تسافر دائماً باتجاه واحد — upstream → main المحلي → origin. لا شيء من الفورك يرتجع إلى upstream؛ فهذا ما تصنع له طلبات السحب.
origin = فوركك · upstream = المشروع الذي افترعته — الخطأ الشائع توجيه الريموتين إلى فوركك؛ عندها "المزامنة" لا تفعل شيئاً بصمت، لأنك جلبت من نسخة بائسة مثل نسختك تماماً
الخطوة 1 — وصّل الريموت (مرة واحدة لكل استنساخ)
# داخل استنساخك المحلي للفورك
git remote add upstream https://github.com/ORIGINAL_OWNER/REPO.git
git remote -v # أكّد: origin -> فوركك، upstream -> الأصل
اعثر على العنوان الصحيح في صفحة المستودع الأصلي، تحت الزر الأخضر Code. هذا التوصيل دائم — كل ما يلي هو ما تكتبه في المرة القادمة.
الخطوة 2 — FETCH، MERGE، PUSH
git checkout main
git fetch upstream
git merge upstream/main
git push origin main
تحقق: git rev-list --count main..upstream/main → 12 قبل الدمج → 0 بعده
الـ fast-forward هو النتيجة الطبيعية — main لم يكن لديك شيء جديد، فينزلق ببساطة إلى الأمام حتى upstream/main ولا يُنشأ commit دمج. لترى مدى تخلفك قبل الدمج: git rev-list --count main..upstream/main بعد الجلب. هذه هي الروتينية كلها؛ والخطوة 3 هي أن تتذكر أنها موجودة: git fetch upstream && git merge upstream/main && git push origin main.
merge أم rebase؟
كلاهما يُهبط الكود نفسه في فوركك؛ يختلفان في التاريخ الذي يتركان خلفهما. اختر سياسة واحدة لكل مستودع وتمسّك بها:
| الطريقة | الأمر | نتيجة التاريخ | الأفضل لـ |
|---|---|---|---|
| دمج | git merge upstream/main | commit دمج إضافي على الفروع المتباعدة | فروع الميزات ذات طلبات السحب المفتوحة — لا يعيد كتابة شيء أبداً |
| إعادة أساس | git rebase upstream/main | تزاماتك مُعاد تشغيلها في الأعلى، تاريخ خطي | إبقاء main الفورك نظيفاً؛ الفوركات المتباعدة التي تريد إعادة ضبطها |
| واجهة GitHub | زر Sync fork / دمج طلب سحب | Same as merge | لحاق سريع دون فتح استنساخ |
# صيغة rebase، تاريخ خطي:
git fetch upstream
git rebase upstream/main
git push --force-with-lease origin main
الدفع القسري مطلوب لأن الـ rebase يعيد كتابة معرفات الالتزامات — فرع فوركك البعيد لم يعد ينحدر من المحلي. فضّل دائماً --force-with-lease over --force : يرفض الكتابة فوق البعيد إذا دفع أحد (أو آلة أخرى من أجهزتك) في الأثناء، ما يجعل الأمر الخطير آمناً افتراضياً. والقاعدة الذهبية: never rebase a branch that has an open pull request unless you know what you are doing — rebasing changes commit IDs, which can detach an open PR from its commits. Sync main بالدمج، وأبقِ فروع طلبات السحب خارج ذلك.
"فوركي لا يتزامن" — المشتبه بهم الأربعة المعتادون
- لا يوجد ريموت
upstream: —git remote -vshows onlyorigin. العرض:git fetch upstreamfails with'upstream' does not appear to be a git repository. Fix: step 1. - جُلب لكن لم يُدمج قط — الجلب يحدّث
upstream/mainمحلياً لكنه لا يلمس أي فرع عمل. العرض:git logيبدو قديماً بعد جلب ناجح. العلاج:git merge upstream/main. - تاريخ متباعد — you committed to your fork's
mainوتحرك upstream أيضاً. العلاج، إن أردت فوز upstream:git reset --hard upstream/main— يرمي التزاماتك الحصرية في main المحلي، فاحفظها نسخاً احتياطياً في فرع أولاً؛ وإذا وقع reset سيئ بالفعل،git reflogما زال يعرف الطرف القديم. - رفض الدفع بوصفه non-fast-forward بعد rebase — you rebased but pushed normally. Fix:
git push --force-with-lease origin main.
حالة خامسة نادرة: مُعاد تسمية مستودع upstream أو حذفه، فيعيد حتى عنوان الخطوة 1 رمز 404. تعيد GitHub توجيه المستودعات المُعاد تسميتها، لذا فالفشل القاسي يعني عادةً الحذف أو التخصيص — لا شيء يتزامن معه بعد الآن.
الزر
نعم، الموقع يفعلها: في صفحة فوركك تُظهر قائمة الفروع المنسدلة زر Sync fork button whenever your branch is behind; one click pulls upstream in. Below the fold, the same thing works as a pull request from كلما تأخر فرعك؛ ونقرة واحدة تسحب upstream. وأدناه، ينفع الأمر نفسه كطلب سحب من into your fork's main. حدود الزر تشرح متى تعود إلى سطر الأوامر: إنه لا يفعل سوى fast-forward أو merge — لا يعيد الأساس، ويرفض رفضاً قاطعاً حين تتباعد الفروع، إذ يطلب منك إسقاط الالتزامات أو استخدام سطر الأوامر. وهو أيضاً لا يتزامن إلا مع الفرع الافتراضي. لكل ما يتجاوز اللحاق البسيط، الأوامر الثلاث هي الأداة.
كم مرة؟
قبل كل عمل جديد هو الجواب الصادق: افترع من main طازج، فلا يبدأ أي طلب سحب تفتحه بـ"هذا مبني على نسخة عمرها ثلاثة أسابيع". للفوركات التي تساهم فيها بنشاط، مزامنة يومية أو لكل جلسة لـ main تكلف ثوانٍ. وللفورك الذي تقرؤه أو تنشر منه فقط، زامِن حين يُطلق upstream شيئاً تريده — اشترك في موجز إصدارات المستودع الأصلي وزامِن عند كل إصدار. المزامنة رخيصة لأنها روتينية بالضبط؛ والفورك المتأخر ستة أشهر يحتاج جراحة لا دمج، وهكذا يتحول "زامِن فوركي" إلى عصرية كاملة.
08ورقة الغش
# إعداد لمرة واحدة
git remote add upstream https://github.com/ORIGINAL_OWNER/REPO.git
# مزامنة روتينية (سياسة الدمج)
git fetch upstream && git merge upstream/main && git push origin main
# مزامنة روتينية (سياسة إعادة الأساس، تاريخ خطي)
git fetch upstream && git rebase upstream/main && git push --force-with-lease origin main
# كم أنا متأخر؟
git fetch upstream && git rev-list --count main..upstream/main
# تبايَن دون رجعة — اجعل main مطابقاً لـ upstream (مُخرِّب)
git fetch upstream && git reset --hard upstream/main && git push --force-with-lease origin main
احفظ السطرين الروتينيين في ذاكرتك العضلية، يبقى الفورك المتباين فضولاً تقرأ عنه لا مشكلة تصلحها.
نهاية صفحة المزامنة · لم يُجلب شيء · كل شيء محلي