ענפים וניתוחים

אפשרויות מיזוג

מיזוג רגיל הוא כפתור אחד, ורוב הזמן זה כל הסיפור. העמוד הזה מיועד לפעמים האחרות: קובץ הנעילה שמתנגש בכל מיזוג, הקובץ שמישהו הזיח מחדש, הפרויקט המוטמע שהנתיבים שלו לא מסתדרים. ל־git יש מתגים לשלושת אלה כבר שנים; הם פשוט קבורים בעמוד מדריך שאף אחד לא פותח באמצע התנגשות.

לחיצה ימנית על ענף ← מיזוג עם אפשרויות… — בשורות הענפים והרימוטים של סרגל הצד וגם על תגי ה־refs הצבעוניים בגרף, שחולקים בלוק תפריט אחד — או ⌘K ← מיזוג עם אפשרויות.

אפשרויות המיזוג, כשפקודת git המדויקת מאויתת מתחת

הפקודה מודפסת תוך כדי שאתם בונים אותה. היא שם כדי שאפשר יהיה להצליב אותה מול המדריך — וכדי להריץ אותה מהטרמינל בפעם הבאה, בלי החלון הזה.

כשקטע מתנגש

בחירה דגל פירושה
עצור ושאל אותי — ברירת המחדל. אתם פותרים
שמור על הצד של הענף הזה -X ours קטעים מתנגשים נפתרים למה שכבר בצ׳קאאוט
קח את הצד הנכנס -X theirs קטעים מתנגשים נפתרים לענף שנכנס

-X ours אינו -s ours. המתג כאן מכריע רק את הקטעים שבאמת מתנגשים; כל שינוי אחר מהענף השני ממוזג כרגיל. האסטרטגיה שנקראת ours — ש־Gitcito אינו מציע — לוקחת את העץ שלכם בשלמותו וזורקת את הצד השני, ומייצרת קומיט מיזוג שטוען שהוא מכיל עבודה שאינה בו. ההבחנה הזו היא הדבר האחד הכי לא מובן במיזוגים של git.

הוא לא יכול להכריע הכול. התנגשות שינוי/מחיקה — צד אחד ערך קובץ, השני מחק אותו — אינה קטע תוכן, ו־-X משאיר אותה לכם. וזה נכון: אין גרסה של ״העדף את שלנו״ שעונה על השאלה אם קובץ שנמחק צריך לחזור.

רווחים לבנים

בחירה דגל
התעלם משינויים ברווחים לבנים קיימים -X ignore-space-change
התעלם מרווחים לבנים לגמרי -X ignore-space-at-eol, -X ignore-all-space

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

התוצאה שומרת על הרווחים הלבנים של הצד האחר בשורות שהוא נגע בהן, ולכן הרצה נוספת של מעצב הקוד אינה רעיון רע.

מה לתעד

בחירה דגל מה נשאר לכם
קידום מהיר כשאפשר — קומיט מיזוג רק כשההיסטוריה התפצלה
תמיד ליצור קומיט מיזוג --no-ff קומיט מיזוג גם בקידום מהיר, כך שהענף נראה בגרף לנצח
קידום מהיר בלבד, אחרת סירוב --ff-only כלום, אם היה נדרש מיזוג אמיתי. שימושי כבדיקה
מעיכה --squash השינויים בסטייג׳, בלי מיזוג מתועד, והקומיט שלכם לכתוב
מזג אבל אל תבצע קומיט --no-commit המיזוג בסטייג׳ ובעיצומו, כך שתוכלו לבדוק או לתקן אותו קודם

מעיכה ו־--no-commit אינם אותו דבר. מעיכה שוכחת שהיה מיזוג בכלל: git לא מתעד הורה שני, והענף ייראה לא ממוזג בפעם הבאה. --no-commit הוא מיזוג בעיצומו שפשוט מחכה לכם — MERGE_HEAD מוגדר, וקומיט מסיים אותו כרגיל.

--ff-only אינו נכשל בשקט. אם היה נדרש קומיט מיזוג, git מסרב ושום דבר לא זז, וזה בדיוק מה שהופך אותו לבדיקת שפיות טובה לפני מיזוג בסקריפט.

אסטרטגיה

אסטרטגיה בשביל
ברירת המחדל (ort) הכול. המיזוג התלת־כיווני המודרני של git
subtree שני הצדדים יושבים בנתיבים שונים — פרויקט שהוטמע לתת־תיקייה של זה
resolve המיזוג התלת־כיווני הישן. מדי פעם מצליח היכן ש־ort מרים ידיים על היסטוריה מצטלבת

-s subtree היא זו ששווה לזכור. מיזוג עדכונים מפרויקט שיושב ב־vendor/parser/ היה נקרא אחרת כ״כל קובץ נמחק, כל קובץ נוסף״; אסטרטגיית תת־העץ מחשבת קודם את הזזת הנתיב. ראו תת־עצים לתהליך העבודה המלא.

למה זה מתנגש

בתוך פותר ההתנגשויות יש כפתור למה זה מתנגש. הוא מריץ git log --merge על הקובץ שמולכם ומונה, לכל צד בנפרד, את הקומיטים שנגעו בו מאז שהענפים נפרדו.

הקומיטים מכל צד שנגעו בקובץ שבהתנגשות

סמני ההתנגשות אומרים מה מתנגש. זה אומר מי שינה, מתי ולמה — וזו בדרך כלל השאלה שבאמת מכריעה את הפתרון, והסיבה ללכת לשאול מישהו לפני שבוחרים צד.

אם זה לא מראה כלום, אף צד לא ביצע קומיט לשינוי בקובץ המדויק הזה: ההתנגשות מגיעה משינוי שם או מהעברת תיקייה גבוה יותר.

מגבלות ששווה להכיר

  • האפשרויות חלות על מיזוג אחד. הן אינן נזכרות, והן אינן משנות את הרשומה הפשוטה מיזוג אל הנוכחי או את תפריט הגרירה וההפלה.
  • ביטול עדיין עובד: מיזוג שרץ עם אפשרויות מתעד את אותה רשומת ביטול, שמאפסת אל ORIG_HEAD.
  • מיזוגי תמנון (יותר משני ענפים בבת אחת) אינם מוצעים כאן.
  • רשומות ה״מיזוג X לתוך Y״ לכל ref בתפריט הקומיט נשארות מיזוגים פשוטים. השתמשו בתג ה־ref עצמו כשאתם רוצים את האפשרויות.
  • -X מכריע בשקט. שום דבר לא מסמן אילו קטעים נפתרו אוטומטית, ולכן במיזוג חשוב קראו את הדיף אחר כך במקום לסמוך על היעדר התנגשויות.

ראו גם: מיזוג וריבייס · התנגשויות · תת־עצים · מכ״ם התנגשויות

שיפור התרגום הזה ב־GitHub