Git: دليل تفصيلي لعمليات السحب في Git والتحديثات عن بُعد

يُقصد بـ«السحب» (pull) عملية استرداد التحديثات من مستودع بعيد ودمجها في فرع محلي. يتيح السحب لأعضاء الفريق مزامنة تغييراتهم والحفاظ على تزامن كودهم المحلي مع المستودع البعيد. ويُعد فهم الفرق بين «السحب» و«الجلب» أمرًا بالغ الأهمية لتعاون الفريق.

1. المفاهيم الأساسية لنظام «السحب»

(1) ما المقصود بـ«السحب»؟

يُعد «السحب» مزيجًا من عمليتين:

  1. fetch: تنزيل التحديثات من مستودع بعيد
  2. merge: دمج الفرع البعيد في الفرع الحالي
100%
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) سحب الفرع الحالي

▶ مثال: استرداد التحديثات

BASH
# 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) سحب الفرع المحدد

▶ مثال: سحب فرع معين

BASH
# 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) الفحص قبل السحب

▶ مثال: الفحص قبل السحب

BASH
# 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 (الافتراضي)

▶ مثال: دمج طلب السحب

BASH
# 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) السحب باستخدام إعادة التأسيس

▶ مثال: إعادة ربط طلب السحب

BASH
# 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)

100%
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) تحدث التضاربات أثناء عملية السحب

▶ مثال: تعارضات السحب

BASH
# 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) حل تعارضات عمليات السحب

▶ مثال: حل النزاعات

BASH
# 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) إلغاء السحب

▶ مثال: إلغاء عملية سحب

BASH
# 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 محاكاة عملية الاسترداد معاينة المحتوى المسترد

▶ مثال: استخدام خيار "السحب"

BASH
# 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) السحب من جهاز تحكم عن بُعد معين

▶ مثال: الاستلام من جهاز بعيد معين

BASH
# 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

BASH
# 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

100%
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

▶ مثال: مقارنة بين الطريقتين

BASH
# 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) سير عمل «السحب اليومي»

▶ مثال: مسار العمل الموصى به

BASH
# 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) أفضل الممارسات لحل تعارضات عمليات السحب

▶ مثال: عملية حل النزاعات

BASH
# 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) الحفاظ على تزامن الفروع

▶ مثال: المزامنة المجدولة

BASH
# 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 للسحب؟
ج استخدم هذه الطريقة عندما ترغب في الحفاظ على خطية سجل عمليات الالتزام وتجنب عمليات الالتزام الناتجة عن الدمج. تعمل عملية إعادة التأسيس (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 دمج السجلات غير المرتبطة ببعضها.

📖 ملخص


📝 تمارين

  1. تمرين أساسي: أنشئ «كوميت» في مستودعك المحلي وقم بدفعه إلى المستودع البعيد. بعد ذلك، قم باستنساخ المستودع إلى موقع آخر، وأجرِ التغييرات، ثم قم بدفعها. عد إلى المستودع الأصلي وقم بسحب التحديثات لتجربة عملية السحب بالكامل.

  2. تمرين متقدم: قارن بين عملية السحب باستخدام «merge» وعملية السحب باستخدام «rebase»: قم بإنشاء عمليات التثبيت في كل من المستودع المحلي والمستودع البعيد، ثم قم بعملية السحب باستخدام كل طريقة، ولاحظ الاختلافات في سجل الرسم البياني.

  3. التحدي: قم بمحاكاة سيناريو تعارض عند عملية السحب: قم بإجراء تغييرات على نفس الموقع في نفس الملف محليًّا وعن بُعد؛ وعند إجراء عملية السحب، يحدث تعارض؛ قم بحل التعارض يدويًّا وأكمل عملية الدمج.

Web-Tutorial.com

فريق Web-Tutorial التقني

منصة دروس برمجية يديرها عدة مطورين. كل درس يتم كتابته ومراجعته بواسطة مطورين متخصصين في المجال. نعمل على ضمان دقة وموثوقية المحتوى — إذا لاحظت أي مشكلة، فيرجى إخبارنا.

100%