טיפ גיט: מעיכת קומיטים

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

נתקעתם עם ענף שיש בו יותר מדי שינויים ואתם פשוט צריכים לקחת את כל הקוד משם בתור קומיט יחיד אליכם לעץ? ככה תוכלו להשתמש ב merge squash כדי לעשות בדיוק את זה.

1. מה אנחנו מנסים לחבר

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

הלוג מענף main נראה כך:

# [main] git log --oneline --graph
* cc5cec4 (HEAD -> main) FIXED readme
* 35e4d4d initial commit

והלוג מענף dev נראה כך:

# [dev] git log --oneline --graph
* 754149f (HEAD -> dev) add db/schema
* fe0c9e5 add stuff scaffold
* c3d8bcc FIXED readme
* 3d35a86 add activeadmin
* 35e4d4d initial commit

הקומיט המשותף האחרון ביניהם הוא 35e4d4d כלומר הקומיט הראשון במערכת ואחריו אנחנו רואים את הפיצול.

2. מיזוג ומעיכה

הגישה הפשוטה לחיבור ענף dev בתור קומיט יחיד נקראת Merge Squash Commits. הפעולה כאן בעצם לוקחת את כל הקוד מהקומיט האחרון בענף אחר ומעבירה אותו אליי לתיקיית העבודה, בלי כל ההיסטוריה של הענף. בצד שלי אם אני מרוצה מהתוצאה אוכל להפעיל commit אחרי ה merge ולקבל קומיט יחיד מכל השינויים בענף שאותו אני משלב.

נשים לב שבדוגמה שלנו יש קונפליקט: גם ענף main וגם ענף dev שינו את הקובץ README.md ולכן אני צריך לבחור איזה שינוי אני רוצה לקחת. ברוב המקרים כשיש קונפליקט נרצה להסתכל ממש על תוכן הקבצים ולקחת את השורות המתאימות מכל קובץ - בשביל שמצד אחד לא נפספס תיקון באג קריטי שבוצע על ענף main, אבל מצד שני כן נוותר על תיקוני באגים שהקוד שלנו הפך למיותרים.

בדוגמה שלנו אני יודע שהקונפליקט היחיד הוא בקובץ README.md ויודע שהקוד הנכון נמצא בענף main ולכן אפעיל את הפקודות הבאות:

$ git checkout main
$ git merge --squash dev

Auto-merging README.md
CONFLICT (content): Merge conflict in README.md
Squash commit -- not updating HEAD
Automatic merge failed; fix conflicts and then commit the result.

וזה הקונפליקט שידענו שיגיע. עכשיו אפשר לקחת את גירסת README.md מענף main ולהמשיך:

$ git checkout main -- README.md
$ git commit -m 'new feature from dev'
$ git log --oneline --graph

* 694f1cb (HEAD -> main) new feature from dev
* cc5cec4 FIXED readme
* 35e4d4d initial commit

קיבלתי קומיט יחיד עם כל השינויים מענף dev.