كل مطوّر جديد بيسمع "اعمل git pull" ويستخدمها يوميًا بدون ما يسأل شو فيه غيرها. لكن Git عنده أمر تاني قريب منها بالاسم — git fetch — وفهم الفرق بينهم بيوفّر عليك مفاجآت كتيرة، خصوصًا بمشاريع الفريق.
شو بيعمل git fetch؟
git fetch بينزّل كل التحديثات الجديدة من المستودع البعيد (commits، فروع، وسوم) — بس بدون ما يلمس فرعك الحالي أو ملفّاتك بشي:
git fetch origin
النتيجة: Git بيحدّث نسخته المحلية من الفروع البعيدة (زي origin/main)، لكن فرعك main المحلي يضل بالضبط متل ما كان. تقدر تراجع شو تغيّر براحتك:
git log main..origin/main # شو الـ commits الجديدة يلي عالريموت؟
git diff main origin/main # شو تغيّر بالضبط؟
شو بيعمل git pull؟
git pull بالضبط نفس git fetch، بس بيضيف خطوة تانية فورًا: يدمج التحديثات بفرعك الحالي — افتراضيًا عبر git merge (أو git rebase مع --rebase):
git pull origin main
# = git fetch origin + git merge origin/main
النتيجة: فرعك المحلي بيصير محدّث فورًا بآخر شي عالريموت، بدون ما تحتاج تعمل الدمج يدويًا.
جدول مقارنة سريع
| المعيار | fetch | pull |
|---|---|---|
| بينزّل التحديثات؟ | نعم | نعم |
| بيدمجها بفرعك تلقائيًا؟ | لا | نعم |
| بيلمس ملفّات مجلد شغلك؟ | لا أبدًا | نعم، فورًا |
| احتمال ظهور conflict فوري؟ | لا | نعم |
| الأنسب لـ | مراجعة قبل الدمج | تحديث سريع وواثق |
أيّهم تختار؟
- fetch: لو بدك تشوف شو تغيّر عند زملائك قبل ما تدمجه بشغلك — خصوصًا لو عم تشتغل بنفس الوقت على نفس الملفّات وبدك تتجنب مفاجآت.
- pull: للتحديث اليومي السريع لما تكون واثق إنه ما رح يصير تعارض كبير — أشيك أمر تبلّش فيه الصباح قبل ما تبلّش شغلك.
نصيحة عملية
لو بتفضّل تاريخ خطّي نظيف بدل commit دمج بكل مرة، فعّل pull يستخدم rebase تلقائيًا:
git config pull.rebase true
هيك git pull بيعمل fetch ثم rebase بدل merge — نفس فكرة الدرس عن rebase مقابل merge، بس مطبّقة تلقائيًا كل مرة تسحب فيها تحديثات.
الخلاصة
fetch هو الخيار "الآمن" — ينزّل وبس، وما بيغيّر إشي عندك. pull هو الخيار "السريع" — ينزّل ويدمج بخطوة وحدة. مافي وحدة أفضل مطلقًا؛ استخدم fetch لما بدك تراجع، وpull لما بدك تتحرّك بسرعة.
ابدأ مسار Git الكامل بالعربي — من الأساسيات لحد العمل مع المستودعات البعيدة بعمق.