git pull

المشاركة والتحديث

الجلب من مستودع آخر أو فرع محلي والدمج معه


يجلب الأمر 'git pull' المحتوى من مستودع بعيد ويدمجه فورًا في فرعك المحلي. هو في جوهره 'git fetch' يليه 'git merge' (أو 'git rebase' مع الخيار ‎--rebase). وهو الطريقة الأشيع لمزامنة مستودعك المحلي مع تغييرات الآخرين. حين تشغّل git pull، ينزّل Git أولًا كل الـ commits الجديدة من المستودع البعيد، ثم يدمجها في فرعك الحالي. إن كان فرعك متأخرًا فقط، يتقدّم بـ fast-forward؛ وإن كان لدى الطرفين commits جديدة، يتوقف Git الحديث ويطلب منك الاختيار بين merge وrebase (‎--no-rebase / ‎--rebase، أو إعداد pull.rebase). وإن وُجدت تغييرات متعارضة، يتوقف Git ويطلب منك حل التعارضات قبل إكمال الدمج.

الصيغة

git pull [--rebase | --no-rebase] [--ff-only | --ff | --no-ff] [--commit | --no-commit] [--autostash | --no-autostash] [-q | --quiet] [-v | --verbose] [--depth=<depth>] [--prune] [--tags | --no-tags] [--recurse-submodules[=yes|on-demand|no]] [<repository> [<refspec>...]]
[ ] اختياري| أو<arg> قيمة تُستبدل... قابل للتكرار--flag خيار

الخيارات

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

مبتدئ (7)

اسم المستودع البعيد الافتراضي. حين تستنسخ مستودعًا، يسمّي Git المستودع البعيد 'origin' تلقائيًا. يمكنك السحب من origin بتحديده صراحةً أو الاعتماد على إعداد التتبّع الافتراضي.

عند الحاجةيسمّي المستودع البعيد والفرع صراحةً؛ ويستخدم git pull العادي الـ upstream

مثال

git pull origin main

بعد fetch، أعد تأسيس الفرع الحالي فوق فرع الـ upstream. ينشئ هذا تاريخًا خطيًا بإعادة تطبيق commits المحلية فوق الـ commits المجلوبة، متجنّبًا commits الدمج.

موصى بهيعيد تطبيق commits غير المدفوعة في الأعلى، محافظًا على تاريخ خطي

مثال

git pull --rebase origin main

اختصار لـ ‎--rebase=false. يتجاوز أي إعداد يجعل rebase افتراضيًا ويفرض merge بدل rebase عند دمج التغييرات المجلوبة. ينشئ commit دمج إن تباعد التاريخان.

عند الحاجةيدمج صراحةً عندما تتباعد الفروع أو يكون الإعداد الافتراضي rebase

مثال

git pull --no-rebase origin main

حدّث فقط إن أمكن تقديم الفرع المحلي بـ fast-forward (لا commits محلية متقدّمة على البعيد). يفشل إن تباعد التاريخان، فيمنع الدمج العرضي ويدفعك إلى تقرير طريقة الدمج.

موصى بهلا ينشئ أبدًا دمجًا مفاجئًا؛ ويتوقف لتختار عندما تتباعد الفروع

مثال

git pull --ff-only origin main

وضع مفصّل. يعرض معلومات تفصيلية عن عمليات fetch والدمج، بما فيها المراجع التي تُحدَّث وإحصاءات نقل الكائنات.

عند الحاجةلتصحيح ما يفعله fetch والدمج

مثال

git pull -v origin main

أخفِ المخرجات أثناء عمليات fetch والدمج. لا تظهر إلا الأخطاء. مفيد في السكربتات التي يجب أن تعمل بصمت.

عند الحاجةللسكربتات؛ يخفي التقدّم ومخرجات الدمج

مثال

git pull -q origin main

خبّئ التعديلات المحلية تلقائيًا قبل السحب وأعد تطبيقها بعد اكتماله (يعمل مع السحب بـ merge وبـ rebase؛ وإن تعارضت إعادة التطبيق تبقى تغييراتك آمنة في الـ stash). مثالي حين تكون لديك تغييرات غير محفوظة وتحتاج إلى المزامنة مع البعيد.

عند الحاجةمريح مع عمل غير مسجّل؛ وتعارض إعادة التطبيق يُبقيه في الـ stash

مثال

git pull --rebase --autostash origin main

متوسط (6)

نفّذ الدمج لكن توقّف قبل إنشاء commit الدمج. يتيح لك فحص نتيجة الدمج وتعديلها إن لزم قبل الحفظ.

عند الحاجةيتوقف قبل commit الدمج لتفحص النتيجة

مثال

git pull --no-commit origin main

قبل fetch، أزل أي مراجع تتبّع بعيد لم تعد موجودة على المستودع البعيد. يساعد على إبقاء مستودعك المحلي خاليًا من الفروع القديمة. لا يشذّب إلا حين تُستخدم الـ refspecs المضبوطة للمستودع البعيد - 'git pull --prune origin main' لا يشذّب شيئًا.

عند الحاجةينظّف مراجع التتبّع البعيدة القديمة؛ ولا يفعل شيئًا مع refspec صريح

مثال

git pull --prune

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

عند الحاجةيجلب أيضًا وسومًا خارج التاريخ المسحوب؛ نادرًا ما تحتاجه

مثال

git pull --tags origin main

عطّل تتبّع الوسوم التلقائي: افتراضيًا تُجلب أيضًا الوسوم التي تشير إلى الـ commits المنزَّلة. يتجاوز إعداد remote.<name>.tagOpt. مفيد حين تريد تحديثات الفروع فقط.

عند الحاجةيتخطّى المتابعة التلقائية للوسوم لتحديثات الفروع فقط

مثال

git pull --no-tags origin main

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

عند الحاجةيُبقي النسخة السطحية سطحية (CI)؛ وترى الأوامر المعتمدة على التاريخ أقل

مثال

git pull --depth=1 origin main

اجلب من كل المستودعات البعيدة. بدل مستودع بعيد واحد، يجلب من كل المستودعات المضبوطة قبل الدمج.

عند الحاجةيجلب من كل المستودعات البعيدة لكنه يدمج الـ upstream الحالي فقط

مثال

git pull --all

متقدم (4)

تحكّم في جلب الوحدات الفرعية وتحديثها تكراريًا. القيم: 'yes' (دائمًا)، 'on-demand' (حين يحدّث المشروع الأب مرجع الوحدة الفرعية)، 'no' (أبدًا).

عند الحاجةفقط في المستودعات ذات الوحدات الفرعية، لإبقائها متزامنة

مثال

git pull --recurse-submodules=on-demand origin main

حوّل مستودعًا سطحيًا إلى كامل بجلب كل التاريخ الناقص. صالح فقط عند السحب إلى استنساخ سطحي.

عند الحاجةيحوّل النسخة السطحية إلى كاملة عندما تحتاج التاريخ كله

مثال

git pull --unshallow origin main

استخدم استراتيجية الدمج المحددة. الاستراتيجيات الشائعة: ort (الافتراضية)، resolve، octopus، ours، subtree. ما زال recursive مقبولًا لكنه مجرد مرادف لـ ort منذ Git 2.50.

عند الحاجةنادرًا ما تحتاجه؛ استراتيجية ort الافتراضية تناسب معظم عمليات pull

مثال

git pull -s ort origin main

اسمح بدمج تواريخ لا يجمعها سلف مشترك. مطلوب عند جمع مستودعين أُنشئا بشكل مستقل.

غير موصى بهفقط لوصل مستودعات منفصلة عن قصد؛ وإلا فإنه يخفي خطأً

مثال

git pull --allow-unrelated-histories origin main

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

استراتيجية السحب: merge أم rebase

الاختيار الأساسي الذي يؤثر في تاريخ الـ commits

الأمرينشئ commit دمجأسلوب التاريخالأنسب لـ
git pullيعتمد على الإعدادات (يفشل عند التباعد دون إعداد)يحدده pull.rebase / pull.fffast-forward حين تكون متأخرًا فقط
git pull --rebaseNoخطيفروع الميزات، تاريخ نظيف
git pull --no-rebaseنعم (عند التباعد)يحافظ على الفروعتجاوز إعداد rebase وفرض merge
git pull --ff-onlyNoخطي (يفشل عند التباعد)ضمان عدم حدوث دمج عرضي

خيارات الأمان والتحكم

خيارات لتجنّب الأخطاء والحفاظ على التحكم

الأمريمنعالسلوكمتى تستخدمه
--ff-onlyعمليات دمج غير متوقعةيفشل إن تعذّر fast-forwardCI/CD، الفروع المحمية
--no-commitcommit تلقائييدمج لكنه يتوقف قبل الـ commitمراجعة الدمج قبل الحفظ
--autostashأخطاء مجلد العمل المعدَّلStash ← pull ← popمزامنة سريعة مع عمل غير محفوظ
--dry-runأي تغييراتيعرض ما سينزّله fetch؛ دون دمجمعاينة المراجع الواردة

ما الذي يُجلب

التحكم في المراجع والتاريخ الذي يُنزَّل

الأمريجلب الوسوميجلب التاريخ الكاملحالة الاستخدام
git pullتلقائي (الوسوم المتتبَّعة)نعمسير العمل المعتاد
--tagsكل الوسومنعممزامنة الإصدارات
--no-tagsNoنعمتوفير البيانات، مزامنة الفرع فقط
--depth=Nتلقائي (الوسوم المتتبَّعة)آخر N من الـ commits فقطالمستودعات الكبيرة، بناء CI
--unshallowتلقائي (الوسوم المتتبَّعة)يحوّل السطحي إلى كاملتحتاج إلى التاريخ الكامل بعد استنساخ سطحي

إدارة المستودعات البعيدة والفروع

خيارات للتعامل مع عدة مستودعات بعيدة ومراجع قديمة

الأمرالنطاقينظّفالسيناريو
git pull origin mainمستودع بعيد/فرع واحدNoسحب عادي من origin
--allكل المستودعات البعيدةNoالمزامنة من origin + upstream
--pruneمستودع بعيد واحدالفروع المحذوفةإزالة مراجع التتبّع القديمة

حالات متقدمة

خيارات للحالات المعقّدة أو غير المعتادة

الأمريحلمستوى الخطرالحالة المعتادة
--allow-unrelated-historiesلا سلف مشتركمتوسطدمج مستودعين منفصلين
-s <strategy>احتياجات دمج خاصة (لا يمنع التعارضات)منخفضفرض خوارزمية دمج محددة
--recurse-submodulesوحدات فرعية قديمةمنخفضمشاريع فيها وحدات git فرعية

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

1
git status

تحقّق من التغييرات غير المحفوظة التي قد تتعارض

2
git stash

خبّئ العمل غير المحفوظ إن لزم (أو استخدم ‎--autostash)

3
git pull --rebase origin main

اسحب مع rebase ليبقى التاريخ نظيفًا

4
git stash pop

استعد عملك المخبّأ إن كنت خبّأته سابقًا

1
git checkout feature-branch

انتقل إلى فرع ميزتك

2
git pull --no-rebase origin main

ادمج أحدث main في فرع ميزتك (صراحةً، لأن الفرعين تباعدا)

3
git push origin feature-branch

ادفع فرع الميزة المحدَّث

1
git fetch origin

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

2
git log HEAD..origin/main

اعرف الـ commits التي ستسحبها

3
git diff HEAD...origin/main

راجع التغييرات التي أُجريت على المستودع البعيد

4
git pull origin main

اسحب حين تكون راضيًا عن التغييرات

1
git pull --no-rebase origin main

جرّب سحبًا بـ merge - قد ينتج عنه تعارضات

2
git status

اعرف الملفات المتعارضة (المعلَّمة 'both modified')

3
(edit conflicted files)

افتح الملفات وحلّ علامات التعارض (<<<<<<<، =======، >>>>>>>)

4
git add <resolved-files>

جهّز الملفات المحلولة

5
git commit

أكمل الدمج بـ commit

1
git pull --rebase --autostash origin main

خبّئ التغييرات تلقائيًا، واسحب، ثم أعد تطبيقها

حل المشكلات

Your local changes would be overwritten by merge

السبب: لديك تغييرات غير محفوظة في ملفات سيعدّلها السحب

احفظ تغييراتك أولًا (git add . && git commit)، أو خبّئها (git stash)، أو استخدم git pull --rebase --autostash

git stash && git pull && git stash pop

Refusing to merge unrelated histories

السبب: ليس للمستودعين البعيد والمحلي سلف مشترك (مثلًا عند السحب إلى مستودع أُنشئ للتو)

اسمح بدمج تواريخ لا علاقة بينها، وهذا شائع عند إضافة مستودع بعيد إلى مستودع محلي موجود

git pull --allow-unrelated-histories origin main

تعارض دمج في ملف أو أكثر

السبب: عدّلت أنت والمستودع البعيد الأسطر نفسها في ملف

افتح الملفات المتعارضة، وابحث عن العلامات (<<<<<<<، =======، >>>>>>>)، وعدّلها لحلّها، ثم git add وgit commit. أو ألغِ بـ git merge --abort

git add <resolved-file> && git commit

Not possible to fast-forward, aborting

السبب: استخدمت ‎--ff-only (أو ضُبط pull.ff=only) لكن فرعك المحلي تباعد عن البعيد

استخدم rebase بدلًا منه (git pull --rebase) أو اسمح بـ commit دمج (git pull --no-rebase)

git pull --rebase origin main

Cannot pull with rebase: You have unstaged changes

السبب: يحتاج السحب بـ rebase إلى شجرة عمل نظيفة، ولديك تعديلات غير محفوظة

احفظ تغييراتك أو خبّئها، أو استخدم autostash للتعامل معها تلقائيًا

git pull --rebase --autostash

No tracking information for the current branch

السبب: فرعك غير مضبوط لتتبّع فرع بعيد

عيّن فرع الـ upstream صراحةً، أو حدد المستودع البعيد والفرع في أمر السحب

git branch --set-upstream-to=origin/main main

'origin' does not appear to be a git repository

السبب: لا يوجد مستودع بعيد مضبوط باسم 'origin'

تحقّق من مستودعاتك البعيدة بـ git remote -v، ثم أضف origin أو استخدم اسم المستودع البعيد الصحيح

git remote add origin <url>

You have divergent branches and need to specify how to reconcile them

السبب: لدى الطرفين commits جديدة ولم يُضبط pull.rebase ولا pull.ff، فيرفض Git الحديث التخمين (كانت الإصدارات 2.27+ الأقدم تحذّر فقط)

حدد merge ‏(‎--no-rebase) أو rebase ‏(‎--rebase)، أو اضبط قيمة افتراضية بـ git config pull.rebase

git config --global pull.rebase true

نصائح وأخطاء شائعة

أفضل الممارسات

  • ✓راجع git status دائمًا قبل السحب لتجنّب التعارض مع تغييرات غير محفوظة
  • ✓استخدم git pull --rebase للحفاظ على تاريخ نظيف وخطي في فروع الميزات
  • ✓اضبط pull.rebase=true على مستوى النظام إن كنت تفضّل rebase افتراضيًا: git config --global pull.rebase true
  • ✓استخدم git fetch أولًا حين تريد مراجعة التغييرات قبل دمجها
  • ✓استخدم ‎--ff-only حين تريد ضمان عدم إنشاء commits دمج بالخطأ
  • ✓اضبط تتبّع الفرع بـ git push -u عند أول دفع لتبسيط عمليات السحب اللاحقة
  • ✓استخدم ‎--autostash حين تكون لديك تغييرات غير محفوظة وتحتاج إلى السحب بسرعة
  • ✓اسحب من main/master بانتظام لتجنّب عمليات دمج كبيرة ومعقّدة لاحقًا
  • ✓حلّ التعارضات فورًا - لا تترك مستودعك في حالة تعارض أبدًا
  • ✓استخدم git pull --prune لتنظيف فروع التتبّع البعيد القديمة
  • ✓فكّر في استخدام git fetch + git merge لتحكّم أكبر في عملية الدمج
  • ✓تحقّق دائمًا أنك على الفرع الصحيح قبل السحب لتجنّب خلط التغييرات

أخطاء متكررة

  • ✗السحب مع تغييرات غير محفوظة: قد يسبب هذا تعارضات أو يفشل تمامًا. احفظ تغييراتك في commit أو خبّئها أولًا، أو استخدم ‎--autostash للتعامل معها تلقائيًا.
  • ✗عدم فهم الفرق بين pull وfetch: 'git pull' يدمج تلقائيًا، وهذا قد يفاجئك. استخدم 'git fetch' أولًا إن أردت مراجعة التغييرات قبل دمجها.
  • ✗استخدام merge حين يكون rebase أنظف: في فروع الميزات، ينشئ 'git pull --rebase' تاريخًا خطيًا أنظف دون commits دمج غير ضرورية.
  • ✗تجاهل تعارضات الدمج: بعد سحب فيه تعارضات، يجب أن تحلّها وتحفظها. لا تترك مستودعك في حالة تعارض أبدًا.
  • ✗السحب إلى الفرع الخطأ: تحقّق دائمًا من فرعك الحالي بـ 'git status' قبل السحب. السحب إلى main بينما قصدت فرع ميزة قد يسبب مشكلات.

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

A:

يكتفي git fetch بتنزيل الـ commits الجديدة من المستودع البعيد دون تعديل مجلد عملك أو فروعك المحلية. أما git pull فينفّذ fetch ثم يدمج (أو يعيد التأسيس على) تلك التغييرات تلقائيًا في فرعك الحالي. استخدم fetch حين تريد مراجعة التغييرات قبل دمجها.

A:

استخدم ‎--rebase حين تريد تاريخًا نظيفًا وخطيًا (خصوصًا في فروع الميزات). يعيد هذا تطبيق commits المحلية فوق الـ commits المجلوبة بدل إنشاء commit دمج. واستخدم السحب العادي (merge) حين تريد الحفاظ على التاريخ الدقيق لوقت حدوث التغييرات.

A:

يحدث fast-forward حين لا يحتوي فرعك المحلي على commits جديدة ليست في المستودع البعيد. فيحرّك Git مؤشر فرعك إلى الأمام ليطابق البعيد - دون حاجة إلى commit دمج. إن كانت لديك commits محلية، فعلى Git إما إنشاء commit دمج أو تنفيذ rebase - وما لم تمرّر ‎--rebase/--no-rebase أو تضبط pull.rebase، يتوقف Git الحديث برسالة 'Need to specify how to reconcile divergent branches'.

A:

استخدم git pull --rebase لإعادة تطبيق commits المحلية فوق الـ commits البعيدة، فينشأ تاريخ خطي. أو استخدم git pull --ff-only الذي لا ينجح إلا إن أمكن fast-forward (يفشل إن كانت لديك commits محلية متقدّمة).

A:

يعتمد ذلك. مع سحب بـ merge، يسمح Git بذلك إن لم تمس الـ commits الواردة الملفات التي عدّلتها؛ وإلا يرفض برسالة 'Your local changes ... would be overwritten by merge'. ومع ‎--rebase، أي تغيير غير محفوظ يمنع السحب. أفضل ممارسة: احفظ تغييراتك أولًا، أو استخدم git pull --rebase --autostash لتخبئتها واستعادتها تلقائيًا.

A:

يوقف Git الدمج مؤقتًا ويعلّم الملفات المتعارضة. افتح كل ملف متعارض، وابحث عن علامات التعارض (<<<<<<<، =======، >>>>>>>)، وعدّله لحلّه، ثم نفّذ git add على الملف وgit commit لإكمال الدمج. استخدم git merge --abort للإلغاء (أو، مع git pull --rebase، ‏git rebase --continue / git rebase --abort).

A:

بعد السحب مباشرة، شغّل git reset --hard ORIG_HEAD - يحفظ Git رأسك السابق في ORIG_HEAD في عمليات الدمج وfast-forward وrebase. لا تستخدم HEAD~1: فقد يكون fast-forward جلب عدة commits. ويتخلّص ‎--hard أيضًا من التغييرات غير المحفوظة. وإن تحرّك ORIG_HEAD منذ ذلك، فاعثر على الرأس القديم بـ git reflog.

A:

يعني هذا عادةً أنك تسحب من الفرع أو المستودع البعيد الخطأ. تحقّق: git branch -vv لرؤية معلومات التتبّع، وgit remote -v للتأكد من المستودعات البعيدة، وgit fetch --all ثم git log origin/main لرؤية الـ commits البعيدة.

A:

يحدد git pull origin main صراحةً المستودع البعيد والفرع اللذين تسحب منهما. أما git pull (دون وسائط) فيستخدم فرع التتبّع المضبوط لفرعك الحالي. وإن لم يُضبط التتبّع، يظهر خطأ يطلب منك تحديدهما.

A:

على مستوى النظام: git config --global pull.rebase true (لـ rebase) أو git config --global pull.rebase false (لـ merge). ويمكنك أيضًا ضبطه لكل مستودع دون ‎--global، أو لكل فرع بـ git config branch.<name>.rebase true.