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>]
[ ] اختياري| أو<arg> قيمة تُستبدل... قابل للتكرار--flag خيار

الخيارات

انقر على أي خيار لتوسيعه

مبتدئ (4)

نفّذ fetch من كل المستودعات البعيدة المضبوطة دفعة واحدة. مفيد حين يكون لديك عدة مستودعات بعيدة مثل origin وupstream.

عند الحاجةمفيد مع عدة مستودعات بعيدة (fork + upstream)؛ وfetch العادي يغطي واحدًا

مثال

git fetch --all

قبل fetch، أزل أي فروع تتبّع بعيد لم تعد موجودة على المستودع البعيد. يُبقي مستودعك نظيفًا.

موصى بهيزيل مراجع origin/*‎ القديمة للفروع المحذوفة على المستودع البعيد

مثال

git fetch --prune

اجلب كل الوسوم من المستودع البعيد، إضافةً إلى كل ما سيُجلب أصلًا. مفيد للحصول على وسوم الإصدارات.

عند الحاجةالوسوم على الـ commits المجلوبة تصل أصلًا؛ استخدمه للوسوم على تاريخ آخر

مثال

git fetch --tags

اعرض ما سيحدث دون إجراء أي تغيير. مفيد لمعاينة ما سينزّله fetch.

عند الحاجةيعاين المراجع التي ستُحدَّث دون تغيير أي شيء

مثال

git fetch --dry-run

متوسط (1)

احصر الجلب في عدد الـ commits المحدد من رأس كل فرع بعيد. في الاستنساخ السطحي، يعمّق هذا التاريخ أو يقصّره.

عند الحاجةيوفّر الوقت في CI أو المستودعات الضخمة، لكن التاريخ السطحي يحدّ من log وmerge-base

مثال

git fetch --depth=1

اختيار الخيار المناسب

Fetch مقابل Pull

فهم الفرق الأساسي بين fetch وpull

الأمرينزّل الـ commitsيحدّث الفرع المحليآمن في أي وقت
git fetchنعملا - فروع التتبّع البعيد فقطنعم - لا يغيّر مجلد العمل أبدًا
git pullنعمنعم - يدمج في الفرع الحاليبحذر - قد يسبب تعارضات
git pull --rebaseنعمنعم - يعيد تأسيس الفرع الحاليبحذر - يعيد كتابة الـ commits المحلية

خيارات fetch للتنظيف

خيارات لإبقاء مستودعك مرتّبًا

الأمريزيل الفروع القديمةيجلب الوسومحالة الاستخدام
git fetchNoبعضها (القابلة للوصول)تحديث عادي
git fetch --pruneنعمبعضها (القابلة للوصول)تنظيف الفروع المحذوفة
git fetch --tagsNoكل الوسومجلب وسوم الإصدارات
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 وأزل فروع التتبّع البعيد التي لم تعد موجودة على المستودع البعيد.

أمثلة على سير العمل

1
git fetch origin

نزّل التغييرات البعيدة دون دمج

2
git log main..origin/main

اعرض الـ commits البعيدة غير الموجودة محليًا

3
git diff main...origin/main

راجع تغييرات الشيفرة على المستودع البعيد

4
git merge origin/main

ادمج حين تكون جاهزًا

1
git remote add upstream <original-repo-url>

أضف المستودع الأصلي كـ upstream (مرة واحدة)

2
git fetch upstream

اجلب أحدث ما في المستودع الأصلي

3
git checkout main

انتقل إلى فرع main الخاص بك

4
git merge upstream/main

ادمج تغييرات upstream في نسختك

5
git push origin main

ادفع النسخة المحدَّثة إلى GitHub الخاص بك

1
git fetch --prune

نفّذ fetch وأزل فروع التتبّع البعيد القديمة

2
git branch -vv

اعرض الفروع المحلية وحالة تتبّعها

3
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 خطوة التنزيل فقط.

الأسئلة الشائعة

A:

ينزّل fetch الـ commits لكنه لا يغيّر فروعك المحلية. أما pull = fetch + merge (أو rebase). fetch أكثر أمانًا لأنه يتيح لك مراجعة التغييرات قبل دمجها.

A:

يحدّث fetch فروع التتبّع البعيد فقط (مثل origin/main)، لا فروعك المحلية. تحتاج إلى merge أو rebase لتحديث فرعك المحلي.

A:

استخدم 'git log main..origin/main' لرؤية الـ commits البعيدة غير الموجودة في فرعك المحلي، أو 'git diff main...origin/main' لرؤية تغييرات الشيفرة التي أُجريت على المستودع البعيد.

A:

fetch حين تريد مراجعة التغييرات أولًا أو حين تعمل على فروع مهمة. pull للتحديثات السريعة حين تثق بالتغييرات الواردة.

A:

استخدم 'git fetch origin branch-name' لجلب ذلك الفرع فقط. مفيد في المستودعات الكبيرة التي لا تحتاج فيها إلى كل شيء.

A:

يزيل فروع التتبّع البعيد التي لم تعد موجودة على المستودع البعيد. يُبقي مستودعك نظيفًا حين يحذف زملاؤك فروعًا مدموجة.