الفروع والدمج
تعلّم كيفية إنشاء الفروع للعمل على ميزات مختلفة ودمجها في الشيفرة الرئيسية.
الفروع والدمج
تُعدّ الفروع (branches) من أقوى ميزات Git. فهي تتيح تطوير الميزات بالتوازي، والتجريب دون أي مخاطرة، والحفاظ على سجل نظيف. سيعلّمك هذا الدرس كيفية إتقان الفروع وتقنيات الدمج.
ما هو الفرع؟
الفرع في Git هو مؤشر متحرك يشير إلى commit محدد. وهو يتيح الانفصال عن خط التطوير الرئيسي والعمل على ميزات معزولة.
المفاهيم الأساسية
HEAD
HEAD هو مؤشر يشير إلى الـ commit الحالي (وهو عادةً آخر commit في الفرع الحالي).
الفرع الافتراضي
- تاريخيًا:
master - حاليًا:
main - قابل للإعداد وفق تفضيلاتك
إدارة الفروع
عرض قائمة الفروع
# Branches locales
git branch
# Toutes les branches (locales et distantes)
git branch -a
# Branches distantes uniquement
git branch -r
# Avec informations détaillées
git branch -v
إنشاء فرع
# Créer une nouvelle branche
git branch nouvelle-fonctionnalite
# Créer et basculer vers la nouvelle branche
git checkout -b nouvelle-fonctionnalite
# Avec Git 2.23+ (recommandé)
git switch -c nouvelle-fonctionnalite
# Créer une branche depuis un commit spécifique
git branch nouvelle-branche abc1234
التبديل بين الفروع
# Méthode traditionnelle
git checkout nom-branche
# Méthode moderne (Git 2.23+)
git switch nom-branche
# Revenir à la branche précédente
git switch -
# Basculer avec création si n'existe pas
git switch -c nouvelle-branche
إعادة تسمية فرع
# Renommer la branche courante
git branch -m nouveau-nom
# Renommer une autre branche
git branch -m ancien-nom nouveau-nom
حذف فرع
# Supprimer une branche fusionnée
git branch -d nom-branche
# Forcer la suppression (même non fusionnée)
git branch -D nom-branche
# Supprimer une branche distante
git push origin --delete nom-branche
سير العمل مع الفروع
مثال عملي: تطوير ميزة
# 1. Partir de la branche principale
git switch main
git pull origin main
# 2. Créer une branche pour la fonctionnalité
git switch -c feature/login-system
# 3. Développer la fonctionnalité
echo "function login() { /* code */ }" > login.js
git add login.js
git commit -m "feat: add basic login function"
# 4. Continuer le développement
echo "function logout() { /* code */ }" >> login.js
git add login.js
git commit -m "feat: add logout function"
# 5. Revenir à main pour la fusion
git switch main
أنواع الدمج (Merge)
الدمج بالتقديم السريع (Fast-Forward Merge)
عندما لا يكون الفرع الرئيسي قد تغيّر:
git merge feature/login-system
الدمج ثلاثي الاتجاهات (Three-Way Merge)
عندما يكون كلا الفرعين قد تغيّر:
git merge feature/login-system
الدمج مع رسالة مخصصة
git merge feature/login-system -m "Merge login system feature"
الدمج دون تقديم سريع (No-Fast-Forward Merge)
فرض إنشاء commit دمج:
git merge --no-ff feature/login-system
Rebase: بديل عن merge
يعيد rebase كتابة السجل عبر نقل الـ commits:
# Rebaser la branche courante sur main
git rebase main
# Rebase interactif pour modifier l'historique
git rebase -i HEAD~3
الفرق بين Merge وRebase
Merge:
- يحافظ على السجل كما هو تمامًا
- يُنشئ commits دمج
- سجل أكثر تعقيدًا لكنه كامل
Rebase:
- سجل خطي ونظيف
- يعيد كتابة السجل
- قد يعقّد التعاون
حل التعارضات
ما هو التعارض؟
يحدث التعارض عندما يعجز Git عن دمج التعديلات تلقائيًا.
مثال على تعارض
# Fichier avec conflit
<<<<<<< HEAD
function greet() {
return "Hello World!";
}
=======
function greet() {
return "Bonjour le monde!";
}
>>>>>>> feature/french-translation
حل التعارض
# 1. Identifier les fichiers en conflit
git status
# 2. Éditer les fichiers pour résoudre les conflits
# Supprimer les marqueurs <<<<<<<, =======, >>>>>>>
# Garder le code désiré
# 3. Marquer comme résolu
git add fichier-resolu.js
# 4. Finaliser la fusion
git commit
أدوات حل التعارضات
# Configurer un outil de merge
git config --global merge.tool vimdiff
# Lancer l'outil de résolution
git mergetool
# Annuler une fusion en cours
git merge --abort
استراتيجيات الفروع
Git Flow
سير عمل منظّم يعتمد على فروع متخصصة:
main: شيفرة الإنتاجdevelop: دمج الميزاتfeature/*: الميزات الجديدةrelease/*: تحضير الإصداراتhotfix/*: الإصلاحات العاجلة
# Exemple Git Flow
git switch develop
git switch -c feature/user-profile
# ... développement ...
git switch develop
git merge feature/user-profile
GitHub Flow
سير عمل مبسّط:
main: شيفرة الإنتاجfeature/*: جميع التعديلات
# Exemple GitHub Flow
git switch main
git switch -c feature/new-header
# ... développement ...
git push origin feature/new-header
# ... Pull Request sur GitHub ...
التطوير القائم على الجذع (Trunk-Based Development)
التطوير مباشرةً على الفرع الرئيسي مع استخدام فروع قصيرة العمر.
أوامر متقدمة
Cherry-pick
تطبيق commit محدد من فرع آخر:
# Appliquer un commit spécifique
git cherry-pick abc1234
# Appliquer plusieurs commits
git cherry-pick abc1234 def5678
Stash مع الفروع
# Sauvegarder les modifications
git stash
# Basculer de branche
git switch autre-branche
# Appliquer le stash sur la nouvelle branche
git stash pop
مقارنة الفروع
# Voir les différences entre branches
git diff main..feature/login
# Voir les commits uniques à une branche
git log main..feature/login
# Voir les fichiers modifiés
git diff --name-only main..feature/login
تمارين عملية
التمرين 1: سير العمل الأساسي مع الفروع
# 1. Initialiser un projet
mkdir git-branches-demo
cd git-branches-demo
git init
echo "# Projet Demo" > README.md
git add README.md
git commit -m "Initial commit"
# 2. Créer une branche feature
git switch -c feature/add-calculator
echo "function add(a, b) { return a + b; }" > calculator.js
git add calculator.js
git commit -m "feat: add calculator function"
# 3. Revenir à main et créer une autre branche
git switch main
git switch -c feature/add-styles
echo "body { font-family: Arial; }" > styles.css
git add styles.css
git commit -m "style: add basic styles"
# 4. Fusionner les branches
git switch main
git merge feature/add-calculator
git merge feature/add-styles
# 5. Nettoyer
git branch -d feature/add-calculator
git branch -d feature/add-styles
التمرين 2: إدارة التعارضات
# 1. Créer un conflit intentionnel
git switch main
echo "Version main" > conflict.txt
git add conflict.txt
git commit -m "Add conflict file from main"
git switch -c feature/conflict-test
echo "Version feature" > conflict.txt
git add conflict.txt
git commit -m "Modify conflict file from feature"
# 2. Tenter la fusion (conflit attendu)
git switch main
git merge feature/conflict-test
# 3. Résoudre le conflit
# Éditer conflict.txt pour résoudre
echo "Version fusionnée" > conflict.txt
git add conflict.txt
git commit -m "Resolve conflict"
التمرين 3: Rebase مقابل Merge
# Préparer l'environnement
git switch main
echo "Line 1" > file.txt
git add file.txt
git commit -m "Add line 1"
# Branche avec merge
git switch -c branch-merge
echo "Line 2 from merge" >> file.txt
git add file.txt
git commit -m "Add line 2 via merge"
git switch main
echo "Line 3 from main" >> file.txt
git add file.txt
git commit -m "Add line 3 from main"
git merge branch-merge
# Branche avec rebase
git switch -c branch-rebase
echo "Line 4 from rebase" >> file.txt
git add file.txt
git commit -m "Add line 4 via rebase"
git switch main
echo "Line 5 from main" >> file.txt
git add file.txt
git commit -m "Add line 5 from main"
git switch branch-rebase
git rebase main
git switch main
git merge branch-rebase
# Comparer les historiques
git log --oneline --graph
أفضل الممارسات
تسمية الفروع
# Conventions courantes
feature/user-authentication
bugfix/login-error
hotfix/security-patch
release/v1.2.0
experiment/new-algorithm
سير العمل الموصى به
-
ابدأ دائمًا من main محدَّث
git switch main git pull origin main -
أنشئ فروعًا قصيرة ومركّزة
git switch -c feature/specific-task -
commits متكررة وذرّية
git commit -m "feat: add specific functionality" -
اختبر قبل الدمج
# Tests, linting, etc. -
نظّف بعد الدمج
git branch -d feature/completed-task
تجنّب الأخطاء الشائعة
- لا تطوّر مباشرةً على main
- تحقّق دائمًا من الفرع الحالي
- حلّ التعارضات بعناية
- لا تفرض push بعد rebase
- أبلغ الفريق عند إجراء rebase
الأدوات والواجهات
أدوات سطر الأوامر
# Voir l'arbre des branches
git log --oneline --graph --all
# Alias utile
git config --global alias.tree 'log --oneline --graph --all'
الأدوات الرسومية
- GitKraken: عرض ممتاز للفروع
- SourceTree: واجهة متكاملة
- VS Code: إضافة Git Graph
- GitHub Desktop: بسيط وفعّال
استكشاف الأخطاء وإصلاحها
الفرع المنفصل (Detached HEAD)
# Si vous êtes en HEAD détaché
git switch -c nouvelle-branche-sauvegarde
git switch main
التراجع عن دمج
# Annuler le dernier merge
git reset --hard HEAD~1
# Ou si le merge n'est pas encore commité
git merge --abort
استرجاع فرع محذوف
# Trouver le commit de la branche supprimée
git reflog
# Recréer la branche
git branch branche-recuperee abc1234
مصادر إضافية
التوثيق
أدوات تفاعلية
خاتمة
إتقان الفروع والدمج أمر أساسي لتطوير فعّال باستخدام Git. تتيح لك هذه المفاهيم العمل بالتوازي، والتجريب دون مخاطرة، والحفاظ على سجل نظيف.
في الدرس القادم، سنتعرّف على GitHub، المنصة التي أحدثت ثورة في التعاون حول Git.
وقت القراءة المقدَّر: 30 دقيقة
المستوى: متوسط
الخطوة السابقة: أوامر Git الأساسية
الخطوة التالية: مقدمة إلى GitHub