ادغام شاخه‌ها — git merge

ترکیب کار شاخه‌ها با git merge، تفاوت ادغام fast-forward و سه‌طرفه و نحوه merge درست.

ادغام چیست؟

وقتی کارتان روی یک شاخه تمام شد، باید نتیجه را به شاخه اصلی برگردانید. این کار ادغام (Merge) نام دارد — دستور git merge تغییرات یک شاخه را با شاخه فعلی شما ترکیب می‌کند.

قانون طلایی merge

همیشه به شاخه‌ای می‌روید که می‌خواهید کار در آن ادغام شود، بعد شاخه دیگر را merge می‌کنید. مثلاً برای آوردن feature به main: اول به main بروید، بعد git merge feature بزنید.

ادغام ساده: Fast-Forward

رایج‌ترین و ساده‌ترین حالت. فرض کنید:

  1. روی main بودید و شاخه feature-search ساختید
  2. در feature-search دو کامیت جدید زدید
  3. main از آن موقع هیچ کامیت جدیدی نگرفته

حالا:

# ۱. به main بروید:
git switch main

# ۲. ادغام کنید:
git merge feature-search
# Updating a1b2c3d..e5f6g7h
# Fast-forward
#  hello.txt | 5 ++++-
#  1 file changed, 4 insertions(+)

چون main تغییری نکرده بود، گیت فقط اشاره‌گر main را جلو می‌برد (Fast-Forward یعنی «سریع‌جلو»). تاریخچه صاف و خطی می‌ماند:

قبل از merge:
    A---B---C  (main)
             \
              D---E  (feature-search)

بعد از merge (fast-forward):
    A---B---C---D---E  (main, feature-search)

ادغام سه‌طرفه (Three-way Merge)

حالا سناریوی واقعی‌تر: بعد از ساخت شاخه، روی main هم کامیت جدید زده‌اید. حالا دو خط جدا از هم دارید:

    A---B---C---F  (main)
             \
              D---E  (feature-search)

گیت نمی‌تواند فقط اشاره‌گر را جلو ببرد — باید دو خط را واقعاً ترکیب کند:

git switch main
git merge feature-search

گیت یک کامیت ادغام (Merge Commit) می‌سازد که دو والد دارد:

    A---B---C---F---M  (main)
             \     /
              D---E  (feature-search)

اگر ویرایشگر پیام باز شد، پیام پیش‌فرض Merge branch 'feature-search' را نگه دارید و ذخیره کنید.

سوئیچ --no-ff

گاهی می‌خواهید حتی در حالت fast-forward هم یک کامیت merge ساخته شود (تا در تاریخچه مشخص باشد که اینجا یک شاخه ادغام شده):

git merge --no-ff feature-search -m "ادغام قابلیت جستجو"

بعد از merge چه کنیم؟

وقتی شاخه merge شد و دیگر لازم نیست، حذفش کنید:

git branch -d feature-search
# Deleted branch feature-search (was e5f6g7h).
حذف شاخه بعد از merge کاملاً امن است — کامیت‌هایش در تاریخچه main زنده‌اند!

دیدن شاخه‌های merge شده و نشده

# شاخه‌هایی که در شاخه فعلی merge شده‌اند:
git branch --merged

# شاخه‌هایی که هنوز merge نشده‌اند:
git branch --no-merged

خلاصه

این مبحث بخشی از دوره آموزش کامل Git است.

ابزارهای مرتبط