Git: دليل تفصيلي حول استنساخ Git والتحديثات الأمنية
"Fetch" هي عملية تقوم بتنزيل التحديثات من مستودع بعيد دون دمجها تلقائيًا. وبالمقارنة مع "pull"، تُعد "fetch" أكثر أمانًا وأسهل في التحكم، حيث تتيح لك مراجعة التحديثات أولاً قبل اتخاذ قرار بشأن دمجها. ويُعد فهم كيفية استخدام "fetch" أمرًا بالغ الأهمية للتعاون بين أعضاء الفريق.
1. فهم المفاهيم الأساسية
(1) ما المقصود بالاستحواذ؟
"Fetch" هي عملية تقوم بتنزيل التحديثات من مستودع بعيد دون إجراء أي تعديلات على الفرع الحالي:
- تنزيل المشاركات: استرداد المشاركات الجديدة من مستودع بعيد
- تحديث مراجع الفروع البعيدة: تحديث المراجع مثل origin/main
- لا تقم بتعديل الفرع الحالي: تظل مساحة العمل دون تغيير
- آمن وقابل للتحكم: يمكنك مراجعة التغييرات قبل دمجها
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) الحصول على جميع التحديثات
▶ مثال: الحصول على التحديثات
# 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) استرداد جهاز تحكم عن بُعد معين
▶ مثال: استرداد جهاز تحكم عن بُعد معين
# GetoriginUpdates
git fetch origin
# GetupstreamUpdates
git fetch upstream
# Get all remote repositories
git fetch --all
# Output:
# Fetching origin
# Fetching upstream
# Fetching backup
(3) استرداد فرع معين
▶ مثال: استرداد فرع معين
# 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) عرض الفروع البعيدة
▶ مثال: عرض فرع بعيد
# 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) عرض محتويات التحديث عن بُعد
▶ مثال: عرض تفاصيل التحديث
# 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) مقارنة بين "محلي" و"بعيد"
▶ مثال: مقارنة الاختلافات
# 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) دمج التحديثات عن بُعد
▶ مثال: دمج التحديثات
# 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) الدمج باستخدام إعادة التأسيس
▶ مثال: تحديث إعادة الترسيم
# 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) الدمج الانتقائي
▶ مثال: اختيار التزام معين
# 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) استرداد العلامات البعيدة
▶ مثال: استرداد علامة
# 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) استرداد علامة معينة
▶ مثال: استرجاع علامة معينة
# 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"
# 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) إزالة المراجع منتهية الصلاحية
▶ مثال: تنظيف المراجع البعيدة
# 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) سير عمل التحديثات الأمنية
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»
# 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) برنامج نصي للمزامنة الدورية
▶ مثال: برنامج نصي للمزامنة التلقائية
#!/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) فقط؛ ولا يقوم بتعديل الفرع الحالي أو دليل العمل. يجب عليك إجراء عملية دمج أو إعادة تأسيس يدويًا لتعديل الكود المحلي.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 لإزالة المراجع البالية للفروع البعيدة من جهازك المحلي. لا يؤثر ذلك على المستودع البعيد؛ بل يقتصر الأمر على إزالة المراجع المحلية فقط.📖 ملخص
- «Get» هي عملية تقوم بتنزيل التحديثات من مصدر بعيد دون دمجها تلقائيًا، مما يجعلها أكثر أمانًا وأسهل في التحكم.
- الاسترداد الأساسي:
git fetchتنزيل جميع التحديثات؛git fetch originاسترداد جهاز تحكم عن بُعد معين - عرض التحديثات: استخدم
logوdiffلعرض عمليات الالتزام الجديدة والاختلافات في المستودع البعيد - دمج التحديثات: دمج الالتزامات يدويًّا أو إعادة تأسيسها، أو انتقاء التزامات محددة
- استرداد العلامات:
--tagsلاسترداد جميع العلامات،--prune-tagsلمسح العلامات منتهية الصلاحية - سير عمل «Fetch»: أولاً، قم بالجلب والمراجعة، ثم قرر ما إذا كنت تريد الدمج أم لا — فهذا أكثر أمانًا.
📝 تمارين
-
تمرين أساسي: قم بإنشاء «كوميت» جديد في المستودع البعيد، واستخدم
fetchمحليًّا لاسترداد التحديثات، واطلع على «الكوميت» الجديد والاختلافات الموجودة في المستودع البعيد، ثم قم بدمجها يدويًّا. -
تمرين متقدم: قم بمحاكاة سير عمل عملية التفرع: أضف فرعين بعيدين، هما
originوupstream؛ احصل على التحديثات منupstream؛ راجع الاختلافات؛ قم بدمجها بشكل انتقائي في مستودعك المحلي؛ ثم قم بالنشر إلىorigin. -
التحدي: اكتب برنامجًا يقوم بشكل دوري باسترداد جميع المستودعات البعيدة، والتحقق من الاختلافات بين كل فرع والمستودع البعيد، وإنشاء تقرير مزامنة، والإشارة إلى الفروع التي تحتاج إلى المزامنة.