מיזוג (Merge)

Merge הוא הפעולה שמשלבת שינויים מ-branch אחד אל branch אחר. זוהי הדרך העיקרית להחזיר עבודה מ-feature branch אל main.

מבנה הפקודה

git switch main             # קודם עוברים ל-branch היעד
git merge feature/login     # ואז מבקשים למזג לתוכו את feature/login

חשוב לזכור: git merge X ממזג את X לתוך ה-branch הנוכחי, לא הפוך.

שני סוגי merge

1. Fast-forward merge

קורה כשה-branch היעד לא קיבל commits חדשים מאז שה-feature התפצל ממנו. במקרה הזה, git פשוט "מזיז" את המצביע של main קדימה - בלי commit חדש של merge.

לפני:
main:     A───B───C
                   \
feature:            D───E

אחרי merge:
main:     A───B───C───D───E
                       (feature)

2. Three-way merge

קורה כשגם ה-feature וגם ה-main קיבלו commits חדשים מאז הפיצול. git יוצר commit מיוחד שנקרא "merge commit" שיש לו שני הורים.

לפני:
main:     A───B───C───F───G
                   \
feature:            D───E

אחרי merge:
main:     A───B───C───F───G───M
                   \         /
feature:            D───E───

M הוא ה-merge commit. יש לו שני הורים: G (מ-main) ו-E (מ-feature).

דגלים שימושיים

git merge feature/login                    # merge רגיל (fast-forward אם אפשר)
git merge --no-ff feature/login            # יוצר תמיד merge commit, גם ב-fast-forward
git merge --ff-only feature/login          # רק fast-forward, אחרת fail
git merge --squash feature/login           # מאחד את כל ה-commits ל-commit אחד
git merge --abort                          # ביטול merge בעיצומו (בעת קונפליקט)

--no-ff

הדגל --no-ff יוצר תמיד merge commit, גם כשאפשר היה לעשות fast-forward. היתרון: ההיסטוריה משמרת את הקבוצה של ה-commits שהיו ב-feature. ארגונים רבים מעדיפים את הסגנון הזה כי הוא מתעד שהיה כאן פיצ'ר נפרד.

--squash

מאחד את כל ה-commits של ה-feature ל-commit אחד. שימושי כשעבדת על feature עם 20 commits מבולגנים ואתם רוצים שב-main זה ייראה כ-commit נקי אחד.

git switch main
git merge --squash feature/messy-feature
git commit -m "Add login form"

דוגמת זרימה מלאה

# 1. סיימת את הפיצ'ר ב-feature/login
git switch feature/login
git status              # נקי?

# 2. מסנכרנים את main לפני המיזוג
git switch main
git pull

# 3. ממזגים את feature/login לתוך main
git merge feature/login

# 4. דוחפים לשרת
git push

# 5. מוחקים את ה-feature branch
git branch -d feature/login
git push origin --delete feature/login

מה קורה כשיש קונפליקט?

אם git לא מצליח למזג אוטומטית - יש קונפליקט. הקובץ הבא (שיעור 10: פתרון קונפליקטים) מסביר איך להתמודד עם זה.

תקציר: עורכים את הקבצים, מסירים את הסימונים <<<<<<<, עושים git add ו-git commit. אם רוצים לבטל את כל ה-merge: git merge --abort.

merge מול rebase

יש דרך נוספת לשלב שינויים: rebase. ההבדל המרכזי:

  • merge - שומר את כל ההיסטוריה כפי שהיתה, יוצר merge commit
  • rebase - "משכתב" את ההיסטוריה כך שתהיה לינארית, בלי merge commits

נדבר על rebase בקובץ נפרד (שיעור 17: Rebase).

בדקו את עצמכם

נסו לענות לבד לפני שאתם פותחים את התשובה.

  1. מה זה Fast-forward merge?

    1. מיזוג מהיר עם קונפליקטים
    2. מיזוג בכוח
    3. כש-main לא התקדם, Git פשוט מזיז את המצביע קדימה בלי commit מיזוג
    4. מחיקת ענף
    הצגת התשובה

    תשובה ג. אין מה לשלב, ולכן ההיסטוריה נשארת ישרה.