Git: دليل تفصيلي حول استنساخ Git والتحديثات الأمنية

"Fetch" هي عملية تقوم بتنزيل التحديثات من مستودع بعيد دون دمجها تلقائيًا. وبالمقارنة مع "pull"، تُعد "fetch" أكثر أمانًا وأسهل في التحكم، حيث تتيح لك مراجعة التحديثات أولاً قبل اتخاذ قرار بشأن دمجها. ويُعد فهم كيفية استخدام "fetch" أمرًا بالغ الأهمية للتعاون بين أعضاء الفريق.

1. فهم المفاهيم الأساسية

(1) ما المقصود بالاستحواذ؟

"Fetch" هي عملية تقوم بتنزيل التحديثات من مستودع بعيد دون إجراء أي تعديلات على الفرع الحالي:

100%
graph TB
    A[Remote Repository<br/>Remote] -->|git fetch| B[Remote Branch Replica<br/>origin/main]
    B --> C{View Updates}
    C -->|Satisfied| D[git merge]
    C -->|Not satisfied| E[Leave it as is]
    D --> F[Current Branch<br/>main]
    
    style A fill:#d4edda
    style B fill:#fff3cd
    style F fill:#c3e6cb

(2) fetch مقابل pull

ميزة جلب سحب
تنزيل التحديث
الدمج التلقائي
تغيير الفرع الحالي
السلامة عالية متوسطة
قابلية التحكم عالية منخفضة

(3) الغرض من الاسترجاع



2. عمليات الاسترجاع الأساسية

(1) الحصول على جميع التحديثات

▶ مثال: الحصول على التحديثات

BASH
# Get updates from all remote repositories
git fetch

# Output:
# remote: Enumerating objects: 8, done.
# remote: Counting objects: 100% (8/8), done.
# remote: Compressing objects: 100% (5/5), done.
# remote: Total 5 (delta 3), reused 0 (delta 0), pack-reused 0
# Unpacking objects: 100% (5/5), 1.23 KiB | 1.23 MiB/s, done.
# From https://github.com/user/repo
#    a1b2c3d..d4e5f6g  main        -> origin/main
#  * [new branch]      feature     -> origin/feature
#  * [new tag]         v1.0.0      -> v1.0.0

(2) استرداد جهاز تحكم عن بُعد معين

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

BASH
# GetoriginUpdates
git fetch origin

# GetupstreamUpdates
git fetch upstream

# Get all remote repositories
git fetch --all

# Output:
# Fetching origin
# Fetching upstream
# Fetching backup

(3) استرداد فرع معين

▶ مثال: استرداد فرع معين

BASH
# Get a Specific Branch
git fetch origin main

# Retrieve Multiple Branches
git fetch origin main develop

# Fetch a remote branch with a different name locally
git fetch origin main:local-main

# Retrieve and Create a Local Branch
git fetch origin feature:feature


3. عرض التحديثات التي تلقيتها

(1) عرض الفروع البعيدة

▶ مثال: عرض فرع بعيد

BASH
# Get Updates
git fetch origin

# View Remote Branches
git branch -r

# Output:
#   origin/HEAD -> origin/main
#   origin/main
#   origin/develop
#   origin/feature

# View All Branches
git branch -a

# Output:
# * main
#   develop
#   remotes/origin/HEAD -> origin/main
#   remotes/origin/main
#   remotes/origin/develop
#   remotes/origin/feature

(2) عرض محتويات التحديث عن بُعد

▶ مثال: عرض تفاصيل التحديث

BASH
# View the latest commit on a remote branch
git log origin/main

# Output:
# commit d4e5f6g7h8i9j0k1l2m3n4o5p6q7r8s9t0u1v2
# Author: Zhang San <zhangsan@example.com>
# Date:   Mon Jan 1 10:00:00 2026 +0800
#
#     feat: Add a New Feature

# View new commits on the remote repository(Not available locally)
git log main..origin/main

# Output:
# d4e5f6g (origin/main) feat: Add a New Feature
# h7i8j9k fix: FixBug

# View commits that exist locally but not remotely
git log origin/main..main

# View Bidirectional Differences
git log main...origin/main

(3) مقارنة بين "محلي" و"بعيد"

▶ مثال: مقارنة الاختلافات

BASH
# Compare the differences between local and remote
git diff main origin/main

# View Difference Statistics
git diff --stat main origin/main

# Output:
#  src/auth.js  | 10 ++++++++++
#  src/user.js  |  5 ++---
#  2 files changed, 12 insertions(+), 3 deletions(-)

# View the list of modified files
git diff --name-only main origin/main

# Output:
# src/auth.js
# src/user.js

# View detailed file status
git diff --name-status main origin/main

# Output:
# M  src/auth.js
# M  src/user.js


4. دمج التحديثات التي تم استردادها

(1) دمج التحديثات عن بُعد

▶ مثال: دمج التحديثات

BASH
# Get Updates
git fetch origin

# View Updates
git log main..origin/main

# Merge Remote Updates
git merge origin/main

# Output:
# Updating a1b2c3d..d4e5f6g
# Fast-forward
#  src/auth.js | 10 ++++++++++
#  1 file changed, 10 insertions(+)

(2) الدمج باستخدام إعادة التأسيس

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

BASH
# Get Updates
git fetch origin

# UsagerebaseMerge
git rebase origin/main

# Output:
# First, rewinding head to replay your work on top of it...
# Fast-forwarded main to d4e5f6g.

# If there is a conflict
# CONFLICT (content): Merge conflict in file.js
# After Resolving the Conflict
git add file.js
git rebase --continue

(3) الدمج الانتقائي

▶ مثال: اختيار التزام معين

BASH
# Get Updates
git fetch origin

# View new commits on the remote repository
git log main..origin/main --oneline

# Output:
# d4e5f6g feat: Add FeatureC
# h7i8j9k fix: FixBug
# k9l0m1n feat: Add FeatureB

# Merge only a specific commit
git cherry-pick h7i8j9k

# Or merge multiple commits
git cherry-pick k9l0m1n d4e5f6g


5. استرداد العلامات

(1) استرداد العلامات البعيدة

▶ مثال: استرداد علامة

BASH
# Get Updates(Including tags)
git fetch origin

# Output:
#  * [new tag]         v1.0.0      -> v1.0.0
#  * [new tag]         v1.1.0      -> v1.1.0

# View All Tags
git tag

# Output:
# v1.0.0
# v1.1.0

# View tag details
git show v1.0.0

(2) استرداد علامة معينة

▶ مثال: استرجاع علامة معينة

BASH
# Get a specific tag
git fetch origin refs/tags/v1.0.0:refs/tags/v1.0.0

# Get all tags
git fetch --tags

# Delete Local Tags(Remotely Deleted)
git fetch --prune-tags

# Or
git fetch -p --prune-tags


6. شرح مفصل للخيارات

(1) خيارات البحث الشائعة

الخيار الوصف حالة الاستخدام
--all استدعاء جميع أجهزة التحكم عن بُعد تحديث جميع أجهزة التحكم عن بُعد
-p تنظيف المراجع القديمة تم حذف الفرع البعيد
--tags الحصول على جميع العلامات مزامنة العلامات
--prune-tags تنظيف العلامات منتهية الصلاحية تم حذف العلامات
--dry-run محاكاة عملية الاسترجاع معاينة المحتوى المسترجع
--verbose الإخراج التفصيلي تصحيح الأخطاء

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

BASH
# Clean up expired remote branch references
git fetch -p

# Output:
# From https://github.com/user/repo
#  x [deleted]         (none)     -> origin/old-feature

# Delete Expired Tags
git fetch --prune-tags

# Simulated Acquisition
git fetch --dry-run

# Detailed Output
git fetch --verbose

# Gain Insight(Shallow Cloning)
git fetch --depth=1

# Get a single branch
git fetch --single-branch

(2) إزالة المراجع منتهية الصلاحية

▶ مثال: تنظيف المراجع البعيدة

BASH
# View the branches that need to be cleaned up
git remote prune origin --dry-run

# Output:
# * origin/deleted-branch would be pruned

# Perform Cleanup
git remote prune origin

# Or usefetch -p
git fetch -p

# Output:
# From https://github.com/user/repo
#  x [deleted]         (none)     -> origin/deleted-branch


7. سير عمل عملية الاسترداد

(1) سير عمل التحديثات الأمنية

100%
sequenceDiagram
    participant Developer
    participant Local Warehouse
    participant Remote Branch
    participant Remote Repository
    
    Developer->>Remote Repository: git fetch origin
    Remote Repository->>Remote Branch: Updateorigin/main
    Developer->>Remote Branch: git log main..origin/main
    Developer->>Remote Branch: git diff main origin/main
    Developer->>Local Warehouse: git merge origin/main

(2) سيناريوهات التطبيق في الواقع العملي

▶ مثال: سير عمل «fetch»

BASH
# Scene1:Check for Updates Before Starting Work
git fetch origin
git log main..origin/main --oneline

# Output:
# d4e5f6g feat: New Features
# h7i8j9k fix: BugFix

# View Specific Changes
git diff main origin/main

# Decide whether to merge
git merge origin/main

# Scene2:There is unsubmitted work,Get it first, then decide
git fetch origin
git status

# Output:
# On branch main
# Your branch is behind 'origin/main' by 2 commits.

# View Updates
git log HEAD..origin/main

# Save the current work
git stash

# Merge Updates
git merge origin/main

# Return to Work
git stash pop

# Scene3:ForkWorkflow
git fetch upstream
git log main..upstream/main
git merge upstream/main
git push origin main

(3) برنامج نصي للمزامنة الدورية

▶ مثال: برنامج نصي للمزامنة التلقائية

BASH
#!/bin/bash
# sync.sh - Regularly Synchronize Remote Updates

# Get all remote updates
git fetch --all

# Check the status of each branch
for branch in $(git branch --format='%(refname:short)'); do
    upstream=$(git rev-parse --abbrev-ref $branch@{upstream} 2>/dev/null)
    if [ -n "$upstream" ]; then
        behind=$(git rev-list --count $branch..$upstream 2>/dev/null)
        ahead=$(git rev-list --count $upstream..$branch 2>/dev/null)
        if [ "$behind" -gt 0 ] || [ "$ahead" -gt 0 ]; then
            echo "$branch: behind $behind, ahead $ahead"
        fi
    fi
done

# Ask if it's synced
read -p "Sync main branch? (y/n) " -n 1 -r
echo
if [[ $REPLY =~ ^[Yy]$ ]]; then
    git checkout main
    git merge origin/main
fi


❓ أسئلة شائعة

س هل يجب أن أستخدم fetch أم pull؟
ج نوصي باستخدام fetch. يُعد fetch أكثر أمانًا لأنه يتيح لك مراجعة التغييرات قبل اتخاذ قرار بشأن دمجها. أما pull فيقوم بالدمج تلقائيًا، مما قد يؤدي إلى حدوث تعارضات غير متوقعة. من الأفضل أن تعتاد على استخدام fetch قبل الدمج.
س هل يقوم fetch بتعديل الكود المحلي؟
ج لا. يقوم fetch بتنزيل التحديثات الخاصة بمراجع الفروع البعيدة (مثل origin/main) فقط؛ ولا يقوم بتعديل الفرع الحالي أو دليل العمل. يجب عليك إجراء عملية دمج أو إعادة تأسيس يدويًا لتعديل الكود المحلي.
س كيف يمكنني الاطلاع على الملفات التي قام برنامج Fetch بتنزيلها؟
ج استخدم git log HEAD..origin/main لعرض عمليات الالتزام الجديدة على الخادم البعيد، وgit diff HEAD origin/main لعرض الاختلافات، وgit diff --stat HEAD origin/main لعرض الإحصائيات.
س كيف يمكنني إجراء عملية دمج بعد عملية جلب؟
ج استخدم git merge origin/main لدمج التحديثات عن بُعد، أو استخدم git rebase origin/main لإجراء دمج باستخدام إعادة التأسيس. نوصي باستخدام إعادة التأسيس للحفاظ على سجل خطي.
س كيف يمكنني إزالة الإشارات إلى الفروع البعيدة المحذوفة؟
ج استخدم git fetch -p أو git remote prune origin لإزالة المراجع البالية للفروع البعيدة من جهازك المحلي. لا يؤثر ذلك على المستودع البعيد؛ بل يقتصر الأمر على إزالة المراجع المحلية فقط.

📖 ملخص


📝 تمارين

  1. تمرين أساسي: قم بإنشاء «كوميت» جديد في المستودع البعيد، واستخدم fetch محليًّا لاسترداد التحديثات، واطلع على «الكوميت» الجديد والاختلافات الموجودة في المستودع البعيد، ثم قم بدمجها يدويًّا.

  2. تمرين متقدم: قم بمحاكاة سير عمل عملية التفرع: أضف فرعين بعيدين، هما origin وupstream؛ احصل على التحديثات من upstream؛ راجع الاختلافات؛ قم بدمجها بشكل انتقائي في مستودعك المحلي؛ ثم قم بالنشر إلى origin.

  3. التحدي: اكتب برنامجًا يقوم بشكل دوري باسترداد جميع المستودعات البعيدة، والتحقق من الاختلافات بين كل فرع والمستودع البعيد، وإنشاء تقرير مزامنة، والإشارة إلى الفروع التي تحتاج إلى المزامنة.

Web-Tutorial.com

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

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

100%