Git: إدارة فروع Git والتطوير المتوازي
تعد الفروع من أقوى ميزات Git. فبفضل الفروع، يمكن للفرق تطوير ميزات مختلفة بشكل متوازٍ دون التأثير على بعضها البعض، ثم دمجها معًا لاحقًا. ويُعد إنشاء الفروع في Git أمرًا في غاية السهولة، مما يشجع على استخدامها بشكل متكرر.
1. المفاهيم الأساسية للفروع
(1) ما المقصود بـ«الفرع»؟
في Git، الفرع هو مؤشر قابل للتحريك يشير إلى عملية تسجيل محددة. في كل مرة يتم فيها إجراء عملية تسجيل، يتحرك مؤشر الفرع الحالي تلقائيًا إلى الأمام ليشير إلى عملية التسجيل الجديدة.
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 بايت:
- قيمة تجزئة SHA-1 مكونة من 40 بايت
- حرف تغذية السطر المكون من بايت واحد
ولهذا السبب يقوم Git بإنشاء الفروع بهذه السرعة.
# View Branch Files
cat .git/refs/heads/main
# Output:
# a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6q7r8s9t0
(3) مؤشر HEAD
HEAD هو مؤشر خاص يشير إلى الفرع الحالي:
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) عرض الفروع المحلية
▶ مثال: سرد الفروع
# 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) عرض جميع الفروع
▶ مثال: عرض فرع بعيد
# 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) عرض علاقات الفروع
▶ مثال: العرض البياني للفروع
# 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) إنشاء فرع جديد
▶ مثال: إنشاء فرع
# 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) سير العمل لإنشاء فرع
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) قواعد تسمية الفروع
▶ مثال: قواعد التسمية القياسية للفروع
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) أوامر لتبديل الفروع
▶ مثال: التبديل بين الفروع
# 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) كيف يعمل التبديل بين الفروع
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 بما يلي:
- تحديث HEAD ليشير إلى الفرع الجديد
- تحديث منطقة التجهيز لتعكس حالة الفرع الجديد
- تحديث الملفات الموجودة في مساحة العمل بمحتويات الفرع الجديد
(3) التعامل مع التغييرات غير المحفوظة
▶ مثال: معالجة التغييرات قبل التبديل بين الفروع
# 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) حذف الفروع المدمجة
▶ مثال: حذف فرع بأمان
# 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) الحذف القسري لفرع
▶ مثال: الحذف القسري للفروع غير المدمجة
# 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) تنظيف الفروع البعيدة
▶ مثال: تنظيف الفروع البعيدة المحذوفة
# 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:
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:
- الفرع الرئيسي قابل للنشر دائمًا
- إنشاء فرع ميزات من
main - قم بإنشاء طلب سحب بمجرد اكتمال عملية التطوير
- دمج التغييرات في الفرع الرئيسي بعد المراجعة
(2) توصيات بشأن تسمية الفروع
▶ مثال: قواعد تسمية الفروع
# 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) سير العمل في الفروع
▶ مثال: سير عمل الفرع الكامل
# 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.git switch هو أمر جديد أُضيف في الإصدار 2.23 من Git، وقد صُمم خصيصًا للتبديل بين الفروع ويوفر دلالات أكثر وضوحًا. أما git checkout فيوفر وظائف أكثر شمولية، بما في ذلك التبديل بين الفروع واستعادة الملفات وإنشاء الفروع. نوصي باستخدام git switch للتبديل بين الفروع.git diff main feature لمقارنة الاختلافات بين فرعين، واستخدم git diff main...feature لعرض التغييرات في فرع الميزة مقارنةً بالفرع الرئيسي.📖 ملخص
- الفرع هو مؤشر قابل للنقل يشير إلى عملية التثبيت، وتكلفة إنشاءه منخفضة للغاية.
- عرض الفرع:
git branchلعرض قائمة بالفروع المحلية،-aلعرض جميع الفروع - إنشاء فرع:
git branch <name>أوgit switch -c <name>، ثم إنشاؤه والانتقال إليه - التبديل بين الفروع:
git switch <name>تحديث HEAD ودليل العمل - حذف الفرع:
git branch -dحذف فرع تم دمجه؛-Dالحذف القسري - استراتيجيات التفرع: Git Flow، GitHub Flow، وغيرها. اختر الاستراتيجية التي تناسب فريقك بشكل أفضل.
📝 تمارين
-
تمرين أساسي: أنشئ مستودع Git وأنشئ عدة فروع (main، develop، feature). قم بتسجيل تغييرات مختلفة في كل فرع، واستخدم
git branchوgit log --graphلعرض هيكل الفروع. -
تمرين متقدم: قم بمحاكاة سير عمل متفرع كامل: أنشئ فرعًا خاصًا بالميزة من
main، وقم بتطوير الميزة، وحافظ على تزامنها معmain، وأخيرًا قم بدمجها مرة أخرى فيmainوحذف فرع الميزة. -
التحدي: قم بتطبيق استراتيجية التفرع «Git Flow» في مشروع حقيقي من خلال إنشاء فروع مثل
developوfeatureوreleaseوhotfix، واختبر عملية إدارة الفروع بالكامل.