טיפ גיט: ריבייס אחרי אמנד

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

פקודת git commit --amend היא דרך מאוד נוחה לשנות פרטים של קומיט או הודעת קומיט אחרי שיצרתי אחת בטעות. הבעיה איתה שאם כבר יצרתי ענף שיצא מהקומיט הישן אותו קומיט שחשבתי שמחקתי יחזור כשאני אמזג מחדש את הענף. בעזרת git rebase --onto אפשר לפתור את הסיפור יחסית בקלות ולתקן את הענף.

1. הריפו הבעייתי

בשביל הדוגמה ניצור ריפו בתיקיה חדשה עם הפקודות:

$ git init .
$ git commit --allow-empty -m c1
$ git commit --allow-empty -m c2
$ git commit --allow-empty -m c3
$ git switch -c dev
$ git commit --allow-empty -m d1
$ git commit --allow-empty -m d2
$ git commit --allow-empty -m d3
$ git commit --allow-empty -m d4

עכשיו נחזור ל main ונעדכן את הודעת הקומיט האחרונה:

$ git switch main
$ git commit --amend -m 'fixed commit message' --allow-empty

והלוג:

$ git log --oneline --graph --all

* cebfcab (HEAD -> main) fixed commit message
| * 784bb2c (dev) d4
| * 4f51f1e d3
| * 595d953 d2
| * cbcb09c d1
| * 707a378 c3
|/
* e09e80f c2
* aa0e4ca c1

2. מה יקרה ב merge

בואו נניח שלא ייחסתי חשיבות ל amend ואני רוצה למזג חזרה את ענף הפיתוח. אני מפעיל:

$ git merge dev

ולהפתעתי הקומיט לפני התיקון c3 נכנס ללוג ורק מבלבל אותי:

*   72ab395 (HEAD -> main) Merge branch 'dev'
|\
| * 784bb2c (dev) d4
| * 4f51f1e d3
| * 595d953 d2
| * cbcb09c d1
| * 707a378 c3
* | cebfcab fixed commit message
|/
* e09e80f c2
* aa0e4ca c1

3. מה יקרה ב rebase

נחזיר את המצב לאיך שהיה לפני ה merge עם:

$ git reset cebfcab

וננסה להשתמש ב rebase במקום ב merge. אני מפעיל:

$ git switch dev
$ git rebase main

אחרי הפעלה אני מסתכל שוב בלוג ולהפתעתי אני שוב רואה את c3, למרות שעשיתי לו amend וההודעה היתה צריכה להימחק:

* 1cbdec3 (HEAD -> dev) d4
* 9008326 d3
* c4c2918 d2
* 17683c9 d1
* e69bcf4 c3
* cebfcab (main) fixed commit message
* e09e80f c2
* aa0e4ca c1

4. תיקון עם rebase onto

נחזיר את המצב לאיך שהיה לפני ה rebase עם:

$ git reset 784bb2c

ועכשיו הגיע הזמן שנשים לב שיש בעיה ונתקן אותה. במקום להשתמש ב rebase רגיל אני מבקש מגיט שיעשה ריבייס רק לקומיטים שקרו אחרי c3 בענף dev וישים אותם על main. זה נראה ככה:

$ git switch dev
$ git rebase --onto main 707a378 dev
$ git log --oneline --graph --all

* c6a7432 (HEAD -> dev) d4
* d6071d0 d3
* 06107ec d2
* 2eb5f05 d1
* cebfcab (main) fixed commit message
* e09e80f c2
* aa0e4ca c1

וככה בדיוק רציתי שההיסטוריה תיראה. הקומיט הבעייתי תוקן והענף שיצא ממנו עודכן להיראות כאילו הוא יצא מהקומיט עם ההודעה הנכונה. אם לא היינו שמים לב ל hash-ים היה אפשר לדמיין שפשוט שיניתי את הודעת הקומיט בלי להשפיע על שום דבר אחר.