Git: إدارة فروع Git والتطوير المتوازي

تعد الفروع من أقوى ميزات Git. فبفضل الفروع، يمكن للفرق تطوير ميزات مختلفة بشكل متوازٍ دون التأثير على بعضها البعض، ثم دمجها معًا لاحقًا. ويُعد إنشاء الفروع في Git أمرًا في غاية السهولة، مما يشجع على استخدامها بشكل متكرر.

1. المفاهيم الأساسية للفروع

(1) ما المقصود بـ«الفرع»؟

في Git، الفرع هو مؤشر قابل للتحريك يشير إلى عملية تسجيل محددة. في كل مرة يتم فيها إجراء عملية تسجيل، يتحرك مؤشر الفرع الحالي تلقائيًا إلى الأمام ليشير إلى عملية التسجيل الجديدة.

100%
graph LR
    C1[SubmitC1] --> C2[SubmitC2] --> C3[SubmitC3]
    main[mainBranch] --> C3
    HEAD[HEAD] --> main
    
    style main fill:#d4edda
    style HEAD fill:#fff3cd

(2) طبيعة الفروع

فرع Git هو في الأساس ملف يحتوي على 41 بايت:

ولهذا السبب يقوم Git بإنشاء الفروع بهذه السرعة.

BASH
# View Branch Files
cat .git/refs/heads/main

# Output:
# a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6q7r8s9t0

(3) مؤشر HEAD

HEAD هو مؤشر خاص يشير إلى الفرع الحالي:

100%
graph TB
    HEAD[HEAD] --> main[mainBranch]
    main --> C3[SubmitC3]
    C3 --> C2[SubmitC2]
    C2 --> C1[SubmitC1]
    
    style HEAD fill:#f8d7da
    style main fill:#d4edda

(4) مزايا الفروع



2. عرض الفروع

(1) عرض الفروع المحلية

▶ مثال: سرد الفروع

BASH
# View local branches
git branch

# Output:
# * main
#   develop
#   feature

# * Indicates the current branch

# View Branches and Last Commit
git branch -v

# Output:
# * main    a1b2c3d feat: Add a login feature
#   develop d4e5f6g Fix: FixBug
#   feature h7i8j9k WIP: New Features

# View detailed branch information
git branch -vv

# The output includes information about the upstream branch:
# * main    a1b2c3d [origin/main] feat: Add a login feature

(2) عرض جميع الفروع

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

BASH
# View All Branches(Local+Remote)
git branch -a

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

# View only remote branches
git branch -r

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

(3) عرض علاقات الفروع

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

100%
# View the branch history graph
git log --oneline --graph --all

# Output:
# * a1b2c3d (HEAD -> main) feat: Add Login
# | * d4e5f6g (feature) WIP: New Features
# |/
# * h7i8j9k Initial commit

# View the commits included in a branch
git log --oneline --graph --decorate --all

# View Branch Fork Points
git merge-base main feature


3. إنشاء فرع

(1) إنشاء فرع جديد

▶ مثال: إنشاء فرع

BASH
# Create a Branch(Based on the current commit)
git branch feature

# Create a branch and specify its starting point
git branch feature a1b2c3d

# Create a branch based on a specific tag
git branch v1.1-branch v1.0.0

# Create a branch and switch to it immediately
git checkout -b feature

# New Grammar(Recommendations)
git switch -c feature

# Created from a remote branch
git checkout -b feature origin/feature

# Or
git switch -c feature origin/feature

(2) سير العمل لإنشاء فرع

100%
graph TB
    A[mainBranch] --> B[git branch feature]
    B --> C[New Branchfeature]
    C --> D[feature: Go to Development]
    D --> E[Submit Changes]
    E --> F[Merge back intomain]
    
    style A fill:#d4edda
    style C fill:#fff3cd
    style F fill:#c3e6cb

(3) قواعد تسمية الفروع

▶ مثال: قواعد التسمية القياسية للفروع

TEXT 📖 للعرض فقط
Feature Branch:feature/user-auth
         feature/shopping-cart
         feature/payment-integration

Fix Branch:fix/login-error
         fix/memory-leak

Thermal Repair Branch:hotfix/critical-security-issue
           hotfix/payment-failure

Release Branch:release/v1.0.0
         release/v2.1.0

Development Branch:develop

Main Branch: main (or master)


4. تبديل الفروع

(1) أوامر لتبديل الفروع

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

BASH
# Traditional Commands
git checkout feature

# New Command(Recommendations)
git switch feature

# Switch to the previous branch
git switch -

# Switch tomainBranch
git switch main

# Create and Switch
git switch -c new-feature

# Output:
# Switched to branch 'new-feature'

(2) كيف يعمل التبديل بين الفروع

100%
graph TB
    A[Before switching branches] --> B[UpdateHEADPointer]
    B --> C[Update the temporary storage area]
    C --> D[Update Workspace]
    D --> E[Switching complete]
    
    style A fill:#fff3cd
    style E fill:#d4edda

عند التبديل بين الفروع، سيقوم Git بما يلي:

  1. تحديث HEAD ليشير إلى الفرع الجديد
  2. تحديث منطقة التجهيز لتعكس حالة الفرع الجديد
  3. تحديث الملفات الموجودة في مساحة العمل بمحتويات الفرع الجديد

(3) التعامل مع التغييرات غير المحفوظة

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

BASH
# View Current Status
git status

# Method1:Submit Changes
git add .
git commit -m "WIP: Save as Draft"
git switch feature

# Method2:Save Changes Temporarily(stash)
git stash
git switch feature
# After completing other tasks
git switch main
git stash pop

# Method3:Cancel Edits
git restore .
git switch feature

# Method4:Carry, Modify, Toggle(If there is no conflict)
git switch feature
# If the changes do not conflict with the new branch,Changes will be saved


5. حذف فرع

(1) حذف الفروع المدمجة

▶ مثال: حذف فرع بأمان

BASH
# Delete Merged Branches
git branch -d feature

# Output:
# Deleted branch feature (was a1b2c3d).

# Delete Multiple Branches
git branch -d feature1 feature2

# Delete a merged remote branch
git push origin --delete feature

# Or
git push origin :feature

(2) الحذف القسري لفرع

▶ مثال: الحذف القسري للفروع غير المدمجة

BASH
# Try deleting the unmerged branch
git branch -d feature

# Output Error:
# error: The branch 'feature' is not fully merged.
# If you are sure you want to delete it, run 'git branch -D feature'.

# Forced Deletion
git branch -D feature

# Output:
# Deleted branch feature (was a1b2c3d).

(3) تنظيف الفروع البعيدة

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

BASH
# View remote branch references
git branch -r

# Delete a local reference to a remote branch(Remotely Deleted)
git fetch -p

# Or
git remote prune origin

# View which remote branch references need to be cleaned up
git remote prune origin --dry-run


6. أفضل الممارسات في إدارة الفروع

(1) استراتيجية الفروع

استراتيجيات التفرع الشائعة:

Git Flow:

100%
graph TB
    main[main Production] --> release[release Published]
    release --> develop[develop Development]
    develop --> feature[feature Features]
    main --> hotfix[hotfix Thermal Repair]
    
    style main fill:#d4edda
    style develop fill:#fff3cd
    style feature fill:#e1f5ff
    style hotfix fill:#f8d7da

تدفق GitHub:

(2) توصيات بشأن تسمية الفروع

▶ مثال: قواعد تسمية الفروع

BASH
# Feature Branch
feature/user-authentication
feature/shopping-cart
feature/payment-integration

# BugFix
fix/login-validation-error
fix/memory-leak-issue

# Thermal Repair
hotfix/security-vulnerability
hotfix/critical-bug

# Published
release/v1.0.0
release/v2.1.0

# Experiment
experiment/new-architecture
spike/performance-optimization

(3) سير العمل في الفروع

▶ مثال: سير عمل الفرع الكامل

BASH
# 1. Create a feature branch from main
git checkout main
git pull origin main
git checkout -b feature/user-auth

# 2. Developing on a feature branch
echo "auth code" > auth.js
git add auth.js
git commit -m "feat: Add User Authentication"

# 3. Stay in touch withmainSynchronize
git fetch origin
git merge origin/main
# or userebase
git rebase origin/main

# 4. Push Feature Branch
git push -u origin feature/user-auth

# 5. Create Pull Request (on GitHub)

# 6. Delete feature branches after merging
git checkout main
git pull origin main
git branch -d feature/user-auth
git push origin --delete feature/user-auth


❓ أسئلة شائعة

س هل سيتأثر الفرع الأصلي بعد إنشاء فرع جديد؟
ج لا. إن إنشاء فرع ما يعني ببساطة إنشاء مؤشر جديد يشير إلى الالتزام الحالي؛ أما الفرع الأصلي فيبقى دون أي تأثير على الإطلاق. ويمكن للفرعين أن يتطورا بشكل مستقل عن بعضهما البعض.
س كيف يمكنني معرفة الفرع الذي تم إنشاء فرع ما منه؟
ج استخدم git log --oneline --graph --all لعرض الرسم البياني لتاريخ الفرع، أو استخدم git merge-base <branch1> <branch2> لعرض نقطة الانقسام بين الفرعين.
س هل ستُفقد عمليات التسجيل بعد حذف فرع ما؟
ج إذا تمت الإشارة إلى عملية تسجيل ما من قبل فرع آخر (على سبيل المثال، إذا تم دمجها في main)، فإن حذف الفرع لن يؤدي إلى فقدان تلك العملية. أما إذا كانت عملية التسجيل موجودة فقط على الفرع الذي يتم حذفه، فستُفقد عند الحذف، ولكن يمكن استعادتها باستخدام git reflog.
س ما الفرق بين "checkout" و"switch"؟
ج git switch هو أمر جديد أُضيف في الإصدار 2.23 من Git، وقد صُمم خصيصًا للتبديل بين الفروع ويوفر دلالات أكثر وضوحًا. أما git checkout فيوفر وظائف أكثر شمولية، بما في ذلك التبديل بين الفروع واستعادة الملفات وإنشاء الفروع. نوصي باستخدام git switch للتبديل بين الفروع.
س كيف يمكنني مقارنة الاختلافات بين الفروع؟
ج استخدم git diff main feature لمقارنة الاختلافات بين فرعين، واستخدم git diff main...feature لعرض التغييرات في فرع الميزة مقارنةً بالفرع الرئيسي.

📖 ملخص


📝 تمارين

  1. تمرين أساسي: أنشئ مستودع Git وأنشئ عدة فروع (main، develop، feature). قم بتسجيل تغييرات مختلفة في كل فرع، واستخدم git branch وgit log --graph لعرض هيكل الفروع.

  2. تمرين متقدم: قم بمحاكاة سير عمل متفرع كامل: أنشئ فرعًا خاصًا بالميزة من main، وقم بتطوير الميزة، وحافظ على تزامنها مع main، وأخيرًا قم بدمجها مرة أخرى في main وحذف فرع الميزة.

  3. التحدي: قم بتطبيق استراتيجية التفرع «Git Flow» في مشروع حقيقي من خلال إنشاء فروع مثل develop وfeature وrelease وhotfix، واختبر عملية إدارة الفروع بالكامل.

Web-Tutorial.com

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

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

100%