מיזוג (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).
בדקו את עצמכם
נסו לענות לבד לפני שאתם פותחים את התשובה.
-
מה זה Fast-forward merge?
הצגת התשובה
תשובה ג. אין מה לשלב, ולכן ההיסטוריה נשארת ישרה.