Git: دليل تفصيلي لعمليات الدمج وحل التعارضات في Git

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

1. المفاهيم الأساسية للاندماجات

(1) ما المقصود بالاندماج؟

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

100%
graph TB
    A[mainBranch] --> B[MergefeatureBranch]
    B --> C{Is there a conflict??}
    C -->|No conflict| D[Automatic merge successful]
    C -->|There is a conflict| E[Resolve conflicts manually]
    E --> F[Mark the conflict as resolved]
    F --> G[Complete the merger]
    
    style D fill:#d4edda
    style E fill:#fff3cd

(2) أنواع عمليات الاندماج

يدعم Git نوعين من عمليات الدمج:

(3) اتجاه الدمج

BASH
git merge feature  # Merge feature into the current branch

تؤدي عملية الدمج دائمًا إلى دمج الفرع المحدد في الفرع الحالي، لذا تأكد من التحقق من الفرع الحالي قبل إجراء الدمج.



2. الدمج السريع

(1) مبدأ الدمج السريع

عندما لا يحتوي الفرع المستهدف (مثل main) على أي عمليات التزام جديدة، في حين أن الفرع المراد دمجه (مثل feature) يحتوي على عمليات التزام جديدة، يمكن لـ Git ببساطة تحريك مؤشر main إلى الأمام؛ وهذا ما يُسمى بـ «الدمج السريع إلى الأمام».

100%
graph LR
    subgraph Before the merger
        C1[SubmitC1] --> C2[SubmitC2]
        C2 --> C3[SubmitC3]
        main1[main] --> C2
        feature1[feature] --> C3
    end
    
    subgraph After the merger
        C4[SubmitC1] --> C5[SubmitC2]
        C5 --> C6[SubmitC3]
        main2[main] --> C6
        feature2[feature] --> C6
    end
    
    style main1 fill:#fff3cd
    style main2 fill:#d4edda

(2) إجراء دمج سريع

▶ مثال: دمج سريع

100%
# View Current Status
git log --oneline --graph --all

# Output:
# * d4e5f6g (feature) Add feature
# * a1b2c3d (HEAD -> main) Initial commit

# Switch tomainBranch
git switch main

# MergefeatureBranch
git merge feature

# Output:
# Updating a1b2c3d..d4e5f6g
# Fast-forward
#  feature.js | 1 +
#  1 file changed, 1 insertion(+)
#  create mode 100644 feature.js

# View the merge results
git log --oneline --graph --all

# Output:
# * d4e5f6g (HEAD -> main, feature) Add feature
# * a1b2c3d Initial commit

(3) تعطيل الدمج السريع

في بعض الأحيان، حتى عندما يكون من الممكن إجراء عمليات دمج سريعة، أرغب في إنشاء «كوميت دمج» للحفاظ على سجل الفرع.

▶ مثال: تعطيل الدمج السريع

BASH
# Usage--no-ffDisable Fast-Forward Merge
git merge --no-ff feature

# Output:
# Merge made by the 'ort' recursive strategy.
#  feature.js | 1 +
#  1 file changed, 1 insertion(+)
#  create mode 100644 feature.js

# View History
git log --oneline --graph --all

# Output:
# *   a1b2c3d (HEAD -> main) Merge branch 'feature'
# |\
# | * d4e5f6g (feature) Add feature
# |/
# * h7i8j9k Initial commit


3. الاندماج الثلاثي

(1) مبدأ الدمج الثلاثي

عندما يحتوي كلا الفرعين على عمليات تسجيل جديدة، يتعين على Git العثور على سلف مشترك (قاعدة الدمج)، ثم إجراء دمج ثلاثي.

100%
graph TB
    A[Common Ancestor<br/>Merged Base] --> B[mainBranch Commit]
    A --> C[featureBranch Commit]
    B --> D[Three-Party Merger]
    C --> D
    D --> E[Merge Commit]
    
    style A fill:#fff3cd
    style E fill:#d4edda

(2) تنفيذ عملية اندماج ثلاثية الأطراف

▶ مثال: اندماج ثلاثي

BASH
# View Branch Status
git log --oneline --graph --all

# Output:
# * d4e5f6g (feature) Feature work
# | * a1b2c3d (HEAD -> main) Main work
# |/
# * h7i8j9k Initial commit

# MergefeatureBranch
git merge feature

# Output:
# Merge made by the 'ort' recursive strategy.
#  feature.js | 1 +
#  1 file changed, 1 insertion(+)

# View the merge results
git log --oneline --graph --all

# Output:
# *   k9l0m1n (HEAD -> main) Merge branch 'feature'
# |\
# | * d4e5f6g (feature) Feature work
# * | a1b2c3d Main work
# |/
# * h7i8j9k Initial commit

(3) عرض قاعدة الدمج

▶ مثال: تحديد سلف مشترك

BASH
# Find the common ancestor of two branches
git merge-base main feature

# Output:
# h7i8j9k

# View the content to be merged
git diff $(git merge-base main feature) feature

# Or use the three-point syntax
git diff main...feature


4. حل تعارضات الدمج

(1) أسباب النزاع

عندما يقوم فرعان بتعديل نفس الموقع في نفس الملف، لا يستطيع Git دمجهما تلقائيًا، مما يؤدي إلى حدوث تعارض.

▶ مثال: الصراع

BASH
# Modifying Files on a Branch
echo "main content" > file.js
git add file.js
git commit -m "Main modification"

# Switch tofeatureBranch
git switch feature

# Modify the same location in the same file
echo "feature content" > file.js
git add file.js
git commit -m "Feature modification"

# Switch back tomainCombine and Merge
git switch main
git merge feature

# Output:
# Auto-merging file.js
# CONFLICT (content): Merge conflict in file.js
# Automatic merge failed; fix conflicts and then commit the result.

(2) عرض حالة التعارض

▶ مثال: تحليل النزاعات

BASH
# View Status
git status

# Output:
# On branch main
# You have unmerged paths.
#   (fix conflicts and run "git commit")
# 
# Unmerged paths:
#   (use "git add <file>..." to mark resolution)
#   both modified:   file.js

# View Conflicting Files
cat file.js

# Output:
# <<<<<<< HEAD
# main content
# =======
# feature content
# >>>>>>> feature

# View Conflict Details
git diff

# Output:
# <<<<<<< HEAD
# -main content
# =======
# -feature content
# >>>>>>> feature

(3) حل النزاعات

▶ مثال: حل التعارضات يدويًّا

BASH
# Editing Files with Conflicts,Select the content to keep
cat file.js

# Method1:RetainmainChanges to
# main content

# Method2:RetainfeatureChanges to
# feature content

# Method3:Merge the changes from both
# main content
# feature content

# Mark the conflict as resolved
git add file.js

# Complete the merger
git commit

# Output:
# [main d4e5f6g] Merge branch 'feature'

(4) استخدام الأدوات لحل النزاعات

▶ مثال: استخدام أداة الدمج

BASH
# Using a Graphical Merge Tool
git mergetool

# Using Specific Tools
git mergetool --tool=vimdiff

# View available merge tools
git mergetool --tool-help

# UsagecheckoutSelect a Version
git checkout --ours file.js      # Select the current branch version
git checkout --theirs file.js    # Select a branch version to merge

(5) شرح مفصل لعلامات التضارب

TEXT 📖 للعرض فقط
<<<<<<< HEAD
Content of the current branch(HEAD)
=======
To merge the contents of the branches
>>>>>>> feature


5. استراتيجية الاندماج

(1) خيارات استراتيجية الدمج

يدعم Git مجموعة متنوعة من استراتيجيات الدمج:

الاستراتيجية الوصف حالة الاستخدام
تعاودي (الافتراضي) دمج ثلاثي التعاودي معظم الحالات
octopus دمج فروع متعددة يُستخدم تلقائيًا عند دمج فروع متعددة
الفرع الخاص بنا تجاهل الفروع الأخرى الاحتفاظ بالفرع الحالي
الخيار تجاهل الفرع الحالي الاحتفاظ بالفرع المراد دمجه
حل دمج ثلاثي بسيط حالات خاصة

▶ مثال: استخدام استراتيجية الدمج

BASH
# UsagerecursiveStrategy(Default)
git merge feature

# UsageoursStrategy(IgnorefeatureChanges to)
git merge -s ours feature

# UsagerecursiveStrategy Options
git merge -X ours feature    # In case of a conflict, prioritize the current branch
git merge -X theirs feature  # In the event of a conflict, prioritize the branch to be merged
git merge -X ignore-space-change feature  # Ignore changes in whitespace

(2) الضغط والدمج

دمج عدة عمليات التزام في عملية التزام واحدة ثم دمجها.

▶ مثال: الضغط والدمج

BASH
# Compress and Merge
git merge --squash feature

# View Status
git status

# Output:
# Changes to be committed:
#   new file:   feature1.js
#   new file:   feature2.js

# Commit the compressed changes
git commit -m "Merge feature branch (squashed)"

# Advantages:Keep the main branch history clean
# Disadvantages:LostfeatureDetailed History of the Branch

(3) دمج فقط، لا تقم بالتثبيت

▶ مثال: معاينة الدمج

BASH
# Merge but do not commit automatically
git merge --no-commit feature

# View the merge results
git status
git diff --staged

# If you're satisfied,Manual Submission
git commit -m "Merge feature branch"

# If you are not satisfied,Cancel Merge
git merge --abort


6. عمليات الدمج

(1) تعليق عملية الاندماج

▶ مثال: إلغاء عملية دمج جارية

BASH
# Conflicts Arising from Mergers
git merge feature
# CONFLICT (content): Merge conflict in file.js

# Cancel Merge,Restore to the state prior to the merge
git merge --abort

# Or usereset
git reset --merge

(2) عرض سجل عمليات الدمج

▶ مثال: عرض التزام مدمج

BASH
# View All Merge Commits
git log --merges --oneline

# Output:
# d4e5f6g Merge branch 'feature'
# a1b2c3d Merge branch 'develop'

# View Unmerged Commits
git log --no-merges --oneline

# View details of the merge
git show --stat d4e5f6g

(3) إلغاء عملية الاندماج

▶ مثال: التراجع عن عملية دمج مكتملة

BASH
# Undo the Last Merge(Merge requests are still available)
git reset --hard HEAD~1

# UsagerevertRevoke Merger(Create a New Commit)
git revert -m 1 HEAD

# -m 1 Indicates that the first parent commit is being preserved(mainBranch)

# View Results
git log --oneline --graph


❓ أسئلة شائعة

س ما الفرق بين الدمج السريع والدمج الثلاثي؟
ج يتم إجراء «دمج سريع» عندما لا يحتوي الفرع المستهدف على أي عمليات التزام جديدة؛ حيث يتم ببساطة تحريك المؤشر دون إنشاء عملية التزام دمج. أما «الدمج الثلاثي» فيتم إجراؤه عندما يحتوي كلا الفرعين على عمليات التزام جديدة؛ حيث يتم العثور على سلف مشترك للدمج وإنشاء عملية التزام دمج.
س كيف يمكنني حل تعارضات الدمج؟
ج قم بتحرير الملف الذي يحتوي على تعارضات، وأزل علامات التعارض (<<<<<<<، =======، >>>>>>>)، واحتفظ بالمحتوى الذي تريده، ثم استخدم git add لوضع علامة على أن التعارض قد تم حله، وأخيرًا استخدم git commit لإتمام عملية الدمج.
س متى يجب عليّ استخدام الخيار --no-ff؟
ج استخدم هذا الخيار عندما ترغب في الحفاظ على سجل الفرع والإشارة بوضوح إلى أن هذه عملية دمج. ويُستخدم عادةً عند دمج فرع ميزة في الفرع الرئيسي بحيث تظهر نقطة الدمج في السجل.
س كيف يمكنني إلغاء عملية دمج جارية؟
ج استخدم git merge --abort لإلغاء الدمج والعودة إلى الحالة التي كانت عليها قبل الدمج. إذا كنت قد قمت بالفعل بحل بعض التضاربات، فيمكنك أيضًا استخدام git reset --merge لإعادة الضبط.
س ما الفرق بين الدمج باستخدام تقنية "سكواش" (squash merge) والدمج العادي؟
ج تعمل عملية الدمج المدمجة (squash merge) على ضغط جميع عمليات التسجيل في فرع ما في عملية تسجيل واحدة، دون الحفاظ على السجل التفصيلي للفرع. وتتمثل الميزة في أن سجل الفرع الرئيسي يظل موجزًا؛ أما العيب فهو فقدان سجل عمليات التسجيل الخاصة بالفرع والمعلومات السياقية.

📖 ملخص


📝 تمارين

  1. تمرين أساسي: أنشئ فرعين، وقم بتعديل ملفات مختلفة في كل فرع، ثم قم بدمجهما لتجربة الفرق بين الدمج السريع والدمج الثلاثي.

  2. تمرين متقدم: قم بمحاكاة سيناريو تعارض: قم بإجراء تغييرات على نفس الموقع في نفس الملف على فرعين؛ وعند الدمج، يحدث تعارض؛ قم بحل التعارض يدويًّا وأكمل عملية الدمج.

  3. التحدي: دمج الفروع باستخدام استراتيجيات دمج مختلفة (--no-ff، --squash، -X ours، إلخ)، ومقارنة النتائج وحالات الاستخدام المناسبة لكل استراتيجية.

Web-Tutorial.com

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

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

100%