git fetch
تنزيل الكائنات والمراجع من مستودع آخر
ينزّل الأمر 'git fetch' الـ commits والملفات والمراجع من مستودع بعيد إلى مستودعك المحلي. يتيح لك رؤية ما عمل عليه الآخرون دون دمج تلك التغييرات في فروعك المحلية. بخلاف 'git pull'، فإن fetch آمن - لا يغيّر أبدًا مجلد عملك ولا فرعك الحالي. بعد fetch يمكنك مراجعة التغييرات وتقرير دمجها أو لا.
الصيغة
git fetch [<options>] [<repository> [<refspec>...]]
git fetch [<options>] <group>
git fetch --multiple [<options>] [(<repository> | <group>)...]
git fetch --all [<options>]الخيارات
اختيار الخيار المناسب
Fetch مقابل Pull
فهم الفرق الأساسي بين fetch وpull
| الأمر | ينزّل الـ commits | يحدّث الفرع المحلي | آمن في أي وقت |
|---|---|---|---|
git fetch | نعم | لا - فروع التتبّع البعيد فقط | نعم - لا يغيّر مجلد العمل أبدًا |
git pull | نعم | نعم - يدمج في الفرع الحالي | بحذر - قد يسبب تعارضات |
git pull --rebase | نعم | نعم - يعيد تأسيس الفرع الحالي | بحذر - يعيد كتابة الـ commits المحلية |
خيارات fetch للتنظيف
خيارات لإبقاء مستودعك مرتّبًا
| الأمر | يزيل الفروع القديمة | يجلب الوسوم | حالة الاستخدام |
|---|---|---|---|
git fetch | No | بعضها (القابلة للوصول) | تحديث عادي |
git fetch --prune | نعم | بعضها (القابلة للوصول) | تنظيف الفروع المحذوفة |
git fetch --tags | No | كل الوسوم | جلب وسوم الإصدارات |
git fetch --prune --tags | نعم | كل الوسوم | تنظيف الفروع + جلب كل الوسوم (تبقى الوسوم المحلية فقط) |
نطاق fetch
التحكم فيما يُجلب
| الأمر | يجلب من | الأنسب لـ |
|---|---|---|
git fetch | المستودع البعيد الافتراضي (origin) | الاستخدام الأشيع |
git fetch origin | مستودع بعيد محدد | حين يكون لديك عدة مستودعات بعيدة |
git fetch --all | كل المستودعات البعيدة | مزامنة نسخة (fork) مع upstream |
git fetch origin main | فرع واحد فقط | أقل تنزيل ممكن |
أمثلة
Fetch من المستودع البعيد الافتراضي
git fetchينزّل الـ commits الجديدة من المستودع البعيد الافتراضي (عادةً 'origin') دون دمج.
Fetch من مستودع بعيد محدد
git fetch originنفّذ fetch صراحةً من المستودع البعيد 'origin'.
Fetch من كل المستودعات البعيدة
git fetch --allنفّذ fetch من كل المستودعات البعيدة المضبوطة دفعة واحدة.
Fetch وتشذيب الفروع القديمة
git fetch --pruneنفّذ fetch وأزل فروع التتبّع البعيد التي لم تعد موجودة على المستودع البعيد.
أمثلة على سير العمل
git fetch originنزّل التغييرات البعيدة دون دمج
git log main..origin/mainاعرض الـ commits البعيدة غير الموجودة محليًا
git diff main...origin/mainراجع تغييرات الشيفرة على المستودع البعيد
git merge origin/mainادمج حين تكون جاهزًا
git remote add upstream <original-repo-url>أضف المستودع الأصلي كـ upstream (مرة واحدة)
git fetch upstreamاجلب أحدث ما في المستودع الأصلي
git checkout mainانتقل إلى فرع main الخاص بك
git merge upstream/mainادمج تغييرات upstream في نسختك
git push origin mainادفع النسخة المحدَّثة إلى GitHub الخاص بك
git fetch --pruneنفّذ fetch وأزل فروع التتبّع البعيد القديمة
git branch -vvاعرض الفروع المحلية وحالة تتبّعها
git branch -d old-featureاحذف الفروع المحلية التي كانت تتبّع فروعًا بعيدة محذوفة
حل المشكلات
fatal: 'origin' does not appear to be a git repository
السبب: لا يوجد مستودع بعيد مضبوط باسم 'origin'
تحقّق من المستودعات البعيدة بـ 'git remote -v'. وأضف واحدًا بـ 'git remote add origin <url>'
نفّذت fetch لكن فرعي المحلي لم يتحدّث
السبب: يحدّث fetch فروع التتبّع البعيد فقط، لا الفروع المحلية
هذا متوقع! شغّل 'git merge origin/main' أو 'git pull' لتحديث فرعك المحلي
error: cannot lock ref - unable to update local ref
السبب: مرجع تتبّع بعيد قديم يتصادم مع اسم فرع جديد (مثل 'feature' مقابل 'feature/login')
شغّل 'git remote prune origin' أو 'git fetch --prune' لإزالة المراجع القديمة، ثم نفّذ fetch مجددًا
ما زالت الفروع البعيدة المحذوفة تظهر
السبب: تحتاج إلى تشذيب فروع التتبّع البعيد القديمة
استخدم 'git fetch --prune' أو 'git remote prune origin'
fetch بطيء جدًا أو ينزّل الكثير
السبب: تجلب التاريخ كله بينما تحتاج إلى الـ commits الحديثة فقط
استخدم 'git fetch --depth=1' لجلب سطحي، أو اجلب فرعًا محددًا فقط
نصائح وأخطاء شائعة
أفضل الممارسات
- ✓نفّذ fetch قبل بدء العمل لترى إن كانت هناك تغييرات بعيدة يجب أن تعرفها
- ✓استخدم --prune بانتظام ليبقى مستودعك خاليًا من الفروع القديمة
- ✓فضّل fetch + merge على pull عندما تريد مراجعة التغييرات قبل دمجها
- ✓اضبط 'git config fetch.prune true' ليُنفَّذ التشذيب دائمًا مع fetch
- ✓استخدم 'git fetch --all' عند العمل مع النسخ (forks) لمزامنة origin وupstream معًا
أخطاء متكررة
- ✗توقّع أن يحدّث fetch مجلد عملك - إنه يحدّث فروع التتبّع البعيد فقط، لا فروعك المحلية.
- ✗نسيان تنفيذ merge أو rebase بعد fetch - ينزّل fetch التغييرات لكنه لا يدمجها.
- ✗عدم استخدام --prune بانتظام، فتتراكم فروع التتبّع البعيد القديمة في مستودعك.
- ✗الخلط بين fetch وpull - فـ pull = fetch + merge، بينما fetch خطوة التنزيل فقط.
الأسئلة الشائعة
ينزّل fetch الـ commits لكنه لا يغيّر فروعك المحلية. أما pull = fetch + merge (أو rebase). fetch أكثر أمانًا لأنه يتيح لك مراجعة التغييرات قبل دمجها.
يحدّث fetch فروع التتبّع البعيد فقط (مثل origin/main)، لا فروعك المحلية. تحتاج إلى merge أو rebase لتحديث فرعك المحلي.
استخدم 'git log main..origin/main' لرؤية الـ commits البعيدة غير الموجودة في فرعك المحلي، أو 'git diff main...origin/main' لرؤية تغييرات الشيفرة التي أُجريت على المستودع البعيد.
fetch حين تريد مراجعة التغييرات أولًا أو حين تعمل على فروع مهمة. pull للتحديثات السريعة حين تثق بالتغييرات الواردة.
استخدم 'git fetch origin branch-name' لجلب ذلك الفرع فقط. مفيد في المستودعات الكبيرة التي لا تحتاج فيها إلى كل شيء.
يزيل فروع التتبّع البعيد التي لم تعد موجودة على المستودع البعيد. يُبقي مستودعك نظيفًا حين يحذف زملاؤك فروعًا مدموجة.