0%
الدرس 4 من 10
اكتمل 40%

الفروع والدمج

تعلّم كيفية إنشاء الفروع للعمل على ميزات مختلفة ودمجها في الشيفرة الرئيسية.

الفروع والدمج

تُعدّ الفروع (branches) من أقوى ميزات Git. فهي تتيح تطوير الميزات بالتوازي، والتجريب دون أي مخاطرة، والحفاظ على سجل نظيف. سيعلّمك هذا الدرس كيفية إتقان الفروع وتقنيات الدمج.

ما هو الفرع؟

الفرع في Git هو مؤشر متحرك يشير إلى commit محدد. وهو يتيح الانفصال عن خط التطوير الرئيسي والعمل على ميزات معزولة.

mainfeature-bInitialFeature AFeature B-1Feature B-2HotfixRelease

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

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
mainfeatureABCD

الدمج ثلاثي الاتجاهات (Three-Way Merge)

عندما يكون كلا الفرعين قد تغيّر:

git merge feature/login-system
mainfeatureABCDEMerge

الدمج مع رسالة مخصصة

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:

  • سجل خطي ونظيف
  • يعيد كتابة السجل
  • قد يعقّد التعاون
mainfeatureABCDEC'D'

حل التعارضات

ما هو التعارض؟

يحدث التعارض عندما يعجز 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

سير العمل الموصى به

  1. ابدأ دائمًا من main محدَّث

    git switch main
    git pull origin main
  2. أنشئ فروعًا قصيرة ومركّزة

    git switch -c feature/specific-task
  3. commits متكررة وذرّية

    git commit -m "feat: add specific functionality"
  4. اختبر قبل الدمج

    # Tests, linting, etc.
  5. نظّف بعد الدمج

    git branch -d feature/completed-task

تجنّب الأخطاء الشائعة

  1. لا تطوّر مباشرةً على main
  2. تحقّق دائمًا من الفرع الحالي
  3. حلّ التعارضات بعناية
  4. لا تفرض push بعد rebase
  5. أبلغ الفريق عند إجراء 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