Git: دليل تفصيلي لعمليات السحب في Git والتحديثات عن بُعد
يُقصد بـ«السحب» (pull) عملية استرداد التحديثات من مستودع بعيد ودمجها في فرع محلي. يتيح السحب لأعضاء الفريق مزامنة تغييراتهم والحفاظ على تزامن كودهم المحلي مع المستودع البعيد. ويُعد فهم الفرق بين «السحب» و«الجلب» أمرًا بالغ الأهمية لتعاون الفريق.
1. المفاهيم الأساسية لنظام «السحب»
(1) ما المقصود بـ«السحب»؟
يُعد «السحب» مزيجًا من عمليتين:
- fetch: تنزيل التحديثات من مستودع بعيد
- merge: دمج الفرع البعيد في الفرع الحالي
graph TB
A[Remote Repository<br/>Remote] -->|git fetch| B[Remote Branch Replica<br/>origin/main]
B -->|git merge| C[Current Branch<br/>main]
A -.->|git pull = fetch + merge| C
style A fill:#d4edda
style B fill:#fff3cd
style C fill:#c3e6cb
2. تفصيلي: «pull» مقابل «fetch»
| الإجراء | الوصف | الأثر |
|---|---|---|
| سحب | جلب + دمج | تعديل الفرع الحالي |
| fetch | تنزيل التحديثات فقط | عدم تعديل الفرع الحالي |
(3) الغرض من السحب
- رمز المزامنة: استرداد أحدث التغييرات التي أجراها أعضاء الفريق
- تحديث الفرع: الحفاظ على تزامن الفرع المحلي مع الفرع البعيد
- الحصول على ملصق: تنزيل ملصق جديد من مصدر بعيد
- عرض التحديثات: اطلع على التغييرات عن بُعد
3. عمليات السحب الأساسية
(1) سحب الفرع الحالي
▶ مثال: استرداد التحديثات
# Pull updates from the current branch
git pull
# Output:
# remote: Enumerating objects: 5, done.
# remote: Counting objects: 100% (5/5), done.
# remote: Compressing objects: 100% (3/3), done.
# remote: Total 3 (delta 1), reused 0 (delta 0), pack-reused 0
# Unpacking objects: 100% (3/3), 285 bytes | 285.00 KiB/s, done.
# From https://github.com/user/repo
# a1b2c3d..d4e5f6g main -> origin/main
# Updating a1b2c3d..d4e5f6g
# Fast-forward
# file.js | 1 +
# 1 file changed, 1 insertion(+)
(2) سحب الفرع المحدد
▶ مثال: سحب فرع معين
# Pull a specified remote branch
git pull origin main
# Pull a remote branch into a local branch with a different name
git pull origin remote-branch:local-branch
# Pull updates from all remote branches
git pull --all
# Pull and view details
git pull --verbose
(3) الفحص قبل السحب
▶ مثال: الفحص قبل السحب
# View differences between local and remote versions
git fetch
git diff main origin/main
# View new commits on the remote repository
git log main..origin/main
# Output:
# d4e5f6g (origin/main) feat: Add a New Feature
# h7i8j9k fix: FixBug
# View the files to be pulled
git diff --name-only main origin/main
# Output:
# src/auth.js
# src/user.js
# Confirm before pulling
git pull
4. استراتيجية السحب
(1) السحب باستخدام merge (الافتراضي)
▶ مثال: دمج طلب السحب
# Use by defaultmergePull
git pull
# Equivalent to
git fetch
git merge origin/main
# A merge commit will be created after the pull.(If there is a fork)
git log --oneline --graph
# Output:
# * a1b2c3d Merge branch 'main' of https://github.com/user/repo
# |\
# | * d4e5f6g (origin/main) Remote commit
# * | h7i8j9k Local commit
# |/
# * k9l0m1n Base commit
(2) السحب باستخدام إعادة التأسيس
▶ مثال: إعادة ربط طلب السحب
# UsagerebasePull
git pull --rebase
# Output:
# remote: Enumerating objects: 5, done.
# From https://github.com/user/repo
# a1b2c3d..d4e5f6g main -> origin/main
# First, rewinding head to replay your work on top of it...
# Fast-forwarded main to d4e5f6g.
# View History(Linear,No merged commits)
git log --oneline --graph
# Output:
# * h7i8j9k Local commit
# * d4e5f6g (origin/main) Remote commit
# * k9l0m1n Base commit
(3) الدمج مقابل إعادة التأسيس (Rebase)
graph TB
subgraph mergePull
A1[Local Commit] --> M1[Merge Commit]
B1[Remote Commit] --> M1
end
subgraph rebasePull
A2[Remote Commit] --> B2[Local Commit<br/>after rebase]
end
style M1 fill:#fff3cd
style B2 fill:#d4edda
دمج طلب السحب:
- الحفاظ على السجل الكامل
- إنشاء التزام دمج
- يوجد تفرع في الرسم البياني للتاريخ
إعادة الترسيم:
- الاحتفاظ بسجل متسلسل
- لا توجد عمليات التزام مدمجة
- الرسم البياني التاريخي أكثر وضوحًا
5. حل تعارضات طلبات السحب
(1) تحدث التضاربات أثناء عملية السحب
▶ مثال: تعارضات السحب
# The same file was modified both locally and remotely
git pull
# Output:
# remote: Enumerating objects: 5, done.
# From https://github.com/user/repo
# a1b2c3d..d4e5f6g main -> origin/main
# Auto-merging file.js
# CONFLICT (content): Merge conflict in file.js
# Automatic merge failed; fix conflicts and then commit the result.
(2) حل تعارضات عمليات السحب
▶ مثال: حل النزاعات
# View Conflict Status
git status
# Output:
# You have unmerged paths.
# (fix conflicts and run "git commit")
#
# Unmerged paths:
# (use "git add <file>..." to mark resolution)
# both modified: file.js
# View Conflict Details
cat file.js
# Output:
# <<<<<<< HEAD
# Local Changes
# =======
# Remote Content Editing
# >>>>>>> d4e5f6g
# Editing Files to Resolve Conflicts
# Keep the necessary content
# Mark the conflict as resolved
git add file.js
# Complete the merger
git commit
# Push to Remote
git push
(3) إلغاء السحب
▶ مثال: إلغاء عملية سحب
# Pull conflict,I want to cancel
git merge --abort
# Or
git reset --merge
# RegardingrebasePull
git rebase --abort
6. شرح مفصل لخيارات السحب
(1) خيارات السحب الشائعة
| الخيار | الوصف | حالة الاستخدام |
|---|---|---|
--rebase |
السحب باستخدام إعادة التأسيس | الحفاظ على سجل خطي |
--no-rebase |
سحب باستخدام merge |
الاحتفاظ بالسجل الكامل |
--ff-only |
عمليات الدمج السريعة فقط | ضمان عدم وجود تفرعات |
--force |
السحب القسري | الكتابة فوق التغييرات المحلية |
--all |
سحب جميع الأجهزة البعيدة | تحديث جميع الأجهزة البعيدة |
--dry-run |
محاكاة عملية الاسترداد | معاينة المحتوى المسترد |
▶ مثال: استخدام خيار "السحب"
# Only fast-forward merges are allowed
git pull --ff-only
# Output(If you can't fast-forward):
# fatal: Not possible to fast-forward, aborting.
# Simulated Pull
git pull --dry-run
# Pull all remote repositories
git pull --all
# Set the Default Pull Method
git config pull.rebase true # Use by defaultrebase
git config pull.rebase false # Use by defaultmerge
git config pull.ff only # Fast-forward only
(2) السحب من جهاز تحكم عن بُعد معين
▶ مثال: الاستلام من جهاز بعيد معين
# Pullorigin
git pull origin
# Pullupstream
git pull upstream main
# Pull a specific branch
git pull origin feature
# Pull and Set Upstream
git pull --set-upstream origin feature
7. مقارنة تفصيلية: pull مقابل fetch
(1) استخدام fetch
▶ مثال: استخدام fetch
# Get Remote Updates(Do not merge)
git fetch origin
# Output:
# remote: Enumerating objects: 5, done.
# From https://github.com/user/repo
# a1b2c3d..d4e5f6g main -> origin/main
# * [new branch] feature -> origin/feature
# View Remote Branches
git branch -r
# Output:
# origin/main
# origin/feature
# View Remote Updates
git log origin/main
# Compare Differences
git diff main origin/main
# Manual Merge
git merge origin/main
# Orrebase
git rebase origin/main
(2) متى يُستخدم fetch
graph TB
A[Need to check for remote updates] --> B[Usagefetch]
B --> C[View Differences]
C --> D{Merge or Not?}
D -->|Yes| E[Manualmerge/rebase]
D -->|No| F[Keep the current state]
style B fill:#d4edda
style E fill:#c3e6cb
متى يُستخدم الأمر fetch:
- عرض التحديثات عن بُعد دون دمجها على الفور
- التغييرات التي تتم عن بُعد تتطلب المراجعة
- هل تريد دمج التحديثات بشكل انتقائي؟
- لدي أعمال لم أرسلها بعد، ولا أريد أن أتسبب في أي خلافات
متى يُستخدم pull:
- تأكد من رغبتك في مزامنة التحديثات عن بُعد
- مساحة العمل المحلية نظيفة
- مزامنة أحدث نسخة من الكود بسرعة
(3) fetch + merge مقابل pull
▶ مثال: مقارنة بين الطريقتين
# Method1:Directlypull
git pull origin main
# Method2:fetch + merge(Safer)
git fetch origin
git diff main origin/main # View Differences
git merge origin/main # Merge after confirmation
# Method3:fetch + rebase
git fetch origin
git diff main origin/main
git rebase origin/main
8. أفضل الممارسات المتعلقة بطلبات السحب
(1) سير عمل «السحب اليومي»
▶ مثال: مسار العمل الموصى به
# 1. Pull the latest code before starting work
git checkout main
git pull --rebase origin main
# 2. Create a feature branch
git checkout -b feature/new-feature
# 3. Develop and Submit
git add .
git commit -m "feat: Add a New Feature"
# 4. Fetch updates again before pushing
git fetch origin
git rebase origin/main
# 5. Push
git push origin feature/new-feature
(2) أفضل الممارسات لحل تعارضات عمليات السحب
▶ مثال: عملية حل النزاعات
# Pull conflict
git pull
# 1. View Conflicting Files
git status
# 2. Using Tools to Resolve Conflicts
git mergetool
# 3. Or edit the file manually
# 4. Test Code
npm test
# 5. Mark the conflict as resolved
git add .
# 6. Complete the merger
git commit
# 7. Push
git push
(3) الحفاظ على تزامن الفروع
▶ مثال: المزامنة المجدولة
# Regularly Synchronize Remote Updates
git fetch origin
# View the status of all branches
git branch -vv
# Output:
# * main a1b2c3d [origin/main: behind 3] feat: Add Feature
# develop d4e5f6g [origin/develop: ahead 2] Fix: FixBug
# feature h7i8j9k [origin/feature] WIP: New Features
# Synchronize a Branch That Is Behind
git checkout main
git pull
# Or sync all branches
git pull --all
❓ أسئلة شائعة
pull وfetch؟git pull = git fetch + git merge سيؤدي إلى تنزيل التحديثات ودمجها في الفرع الحالي. أما git fetch فيكتفي بتنزيل التحديثات دون تعديل الفرع الحالي، وهو الخيار الأكثر أمانًا.--rebase للسحب؟git add لوضع علامة على التضارب باعتباره قد تم حله، ثم استخدم git commit لإتمام عملية الدمج. إذا كنت لا ترغب في حل التضارب، فيمكنك استخدام git merge --abort لإلغاء عملية السحب.git fetch لتنزيل التحديث، ثم استخدم git log HEAD..origin/main لعرض عمليات الإرسال البعيدة الجديدة، أو استخدم git diff HEAD origin/main لعرض الاختلافات.git pull --allow-unrelated-histories دمج السجلات غير المرتبطة ببعضها.📖 ملخص
- عملية السحب هي عملية استرداد التحديثات من مستودع بعيد ودمجها في المستودع المحلي (جلب + دمج)
- عملية سحب أساسية:
git pullسحب التحديثات من الفرع الحالي - استراتيجية السحب: تعمل عملية «merge» على سحب التغييرات مع الحفاظ على السجل الكامل؛ بينما تعمل عملية «rebase» على سحب التغييرات مع الحفاظ على سجل خطي
- تعارضات السحب: قم بتحرير الملف لحل التعارضات، ووضع علامة «تم حلها» عليها، ثم قم بالتسجيل
- «pull» مقابل «fetch»: تعمل «fetch» على التنزيل فقط دون دمج، مما يجعلها أكثر أمانًا وأسهل في التحكم
- أفضل الممارسات لعملية السحب: قم بالسحب قبل بدء العمل، وقم بالسحب قبل الدفع، وقم بالمزامنة بانتظام
📝 تمارين
-
تمرين أساسي: أنشئ «كوميت» في مستودعك المحلي وقم بدفعه إلى المستودع البعيد. بعد ذلك، قم باستنساخ المستودع إلى موقع آخر، وأجرِ التغييرات، ثم قم بدفعها. عد إلى المستودع الأصلي وقم بسحب التحديثات لتجربة عملية السحب بالكامل.
-
تمرين متقدم: قارن بين عملية السحب باستخدام «merge» وعملية السحب باستخدام «rebase»: قم بإنشاء عمليات التثبيت في كل من المستودع المحلي والمستودع البعيد، ثم قم بعملية السحب باستخدام كل طريقة، ولاحظ الاختلافات في سجل الرسم البياني.
-
التحدي: قم بمحاكاة سيناريو تعارض عند عملية السحب: قم بإجراء تغييرات على نفس الموقع في نفس الملف محليًّا وعن بُعد؛ وعند إجراء عملية السحب، يحدث تعارض؛ قم بحل التعارض يدويًّا وأكمل عملية الدمج.