Git Merge
עודכן לאחרונה
git merge מכניס את הקומיטים מענף אחר לענף הנוכחי. כשהענף הנוכחי לא התפצל, Git מבצע fast-forward: פשוט מזיז את המצביע קדימה. כשבשני הענפים יש קומיטים חדשים, Git יוצר קומיט מיזוג שקושר את שתי ההיסטוריות יחד. בניגוד ל-rebase, merge משמר את ההיסטוריה המדויקת של שני הענפים.
נסו את הפקודות האלה בעורך הטרמינל אונליין: shell אמיתי בדפדפן, בלי להתקין כלום.
תחביר
| פקודה | מה היא עושה |
|---|---|
git merge feature | מיזוג feature לענף הנוכחי |
git merge --no-ff feature | תמיד ליצור קומיט מיזוג |
git merge --ff-only feature | מיזוג רק אם אפשר לבצע fast-forward |
git merge --squash feature | איחוד הקומיטים של הענף לקומיט אחד |
git merge --abort | ביטול מיזוג עם קונפליקטים |
Fast-forward מול קומיט מיזוג
| מצב | Fast-forward | קומיט מיזוג (--no-ff) |
|---|---|---|
| יוצר קומיט חדש | לא | כן |
| שומר תיעוד של הענף | לא | כן |
| קורה כאשר | הענף הנוכחי לא התפצל | בשני הענפים יש קומיטים חדשים |
פתרון קונפליקט במיזוג
כששני הענפים שינו את אותן שורות, Git עוצר.
| שלב | פקודה | תוצאה |
|---|---|---|
| 1 | עריכת הקבצים שיש בהם קונפליקט | בחירת השורות הנכונות והסרת הסימונים |
| 2 | git add <file> | סימון הקונפליקט כפתור |
| 3 | git commit | השלמת המיזוג |
שאלות נפוצות על git merge
איך ממזגים ענף לענף אחר ב-Git?
עברו לענף שאליו רוצים למזג (למשל
git switch main), ואז הריצו git merge feature. Git משלב את הקומיטים מ-feature לתוך main, או באמצעות fast-forward או באמצעות יצירת קומיט מיזוג אם שני הענפים התפצלו.מה ההבדל בין fast-forward לבין קומיט מיזוג?
fast-forward קורה כשהענף הנוכחי לא זז מאז שהענף השני התפצל ממנו: Git פשוט מחליק את המצביע קדימה, בלי קומיט חדש. קומיט מיזוג נוצר כשבשני הענפים יש קומיטים חדשים, והוא קושר את ההיסטוריות שלהם יחד. השתמשו ב-
--no-ff כדי ליצור תמיד קומיט מיזוג, או ב---ff-only כדי לדרוש fast-forward.איך פותרים קונפליקט במיזוג?
כשיש קונפליקט במיזוג, Git מסמן את הקטעים המתנגשים בקבצים הרלוונטיים בסימונים
<<<<<<<, ======= ו->>>>>>>. ערכו כל קובץ כך שיישאר התוכן הנכון והסירו את הסימונים, ואז הריצו git add על הקבצים שנפתרו ו-git commit כדי לסיים את המיזוג.איך מבטלים מיזוג?
אם המיזוג עדיין בתהליך (קונפליקטים שלא נפתרו), הריצו git merge --abort כדי לבטל אותו ולשחזר את המצב שלפני המיזוג. אם המיזוג כבר הסתיים מקומית,
git reset --hard ORIG_HEAD מחזיר את הענף למיקום שלפני המיזוג (בניגוד ל-HEAD~1, זה נכון גם אחרי fast-forward, אבל זה מוחק עבודה שלא נשמרה בקומיט). אם המיזוג נדחף, השתמשו ב-git revert -m 1 <merge-hash>.אפשר לתרגל את זה אונליין?
כן. פתחו את עורך הטרמינל אונליין כדי להריץ
git merge ב-shell אמיתי בדפדפן, בלי להתקין כלום. גם קורס ה-Git האינטראקטיבי והחינמי של Coddy מלמד מיזוג ופתרון קונפליקטים צעד אחר צעד.