Git Squash: איחוד קומיטים
עודכן לאחרונה
squash מאחד כמה קומיטים לאחד, כך שסדרה מבולגנת של קומיטים כמו "wip", "fix typo", "actually fix it" הופכת לקומיט נקי אחד. הכלי הרגיל לכך הוא rebase אינטראקטיבי, git rebase -i, שבו מסמנים את הקומיטים שיש לאחד. מכיוון ש-squash משכתב היסטוריה, עשו אותו לפני שאתם דוחפים, או בענף שרק אתם עובדים עליו.
נסו את הפקודות האלה בעורך הטרמינל אונליין: shell אמיתי בדפדפן, בלי להתקין כלום.
תחביר
| פקודה | מה היא עושה |
|---|---|
git rebase -i HEAD~3 | rebase אינטראקטיבי ל-3 הקומיטים האחרונים |
git rebase -i main | rebase לכל קומיט מאז main |
git merge --squash feature | איחוד הקומיטים של ענף לאחד בזמן המיזוג |
git reset --soft HEAD~3 && git commit | איחוד 3 הקומיטים האחרונים בלי rebase |
פקודות ב-rebase אינטראקטיבי
בעורך שנפתח, שנו את pick לאחת מאלה.
| מילת מפתח | מה היא עושה |
|---|---|
pick | השארת הקומיט כפי שהוא |
squash (s) | איחוד לקומיט הקודם ושילוב ההודעות |
fixup (f) | איחוד לקומיט הקודם וזריקת ההודעה של הקומיט הזה |
reword (r) | השארת הקומיט ועריכת ההודעה שלו |
דוגמה מלאה
איחוד שלושת הקומיטים האחרונים לאחד לפני הדחיפה.
| שלב | פעולה | תוצאה |
|---|---|---|
| 1 | git rebase -i HEAD~3 | פותח את 3 הקומיטים האחרונים בעורך |
| 2 | שנו את קומיטים 2 ו-3 ל-squash | מסמן אותם לאיחוד לתוך הראשון |
| 3 | שמרו וערכו את ההודעה המאוחדת | שלושה קומיטים הופכים לקומיט נקי אחד |
שאלות נפוצות על איחוד קומיטים ב-Git
מה זה squash לקומיטים?
squash הופך כמה קומיטים לקומיט אחד שמכיל את כל השינויים שלהם. הקבצים נשארים בדיוק אותו דבר; רק ההיסטוריה משתנה, כך שמי שעושה code review רואה קומיט אחד עם הודעה אחת במקום שובל של תיקונים קטנים.
איך מאחדים את N הקומיטים האחרונים ב-Git?
הריצו
git rebase -i HEAD~N (למשל HEAD~3 לשלושת האחרונים). בעורך, השאירו את הקומיט הראשון כ-pick ושנו את השאר ל-squash (או ל-fixup כדי לזרוק את ההודעות שלהם). שמרו, ערכו את הודעת הקומיט המאוחדת, והקומיטים יתאחדו לאחד.מה ההבדל בין squash לבין fixup?
שניהם מאחדים קומיט לתוך הקודם לו.
squash שומר את הודעת הקומיט ומאפשר לשלב אותה עם האחרות בעורך. fixup זורק את הודעת הקומיט לגמרי ושומר רק את ההודעה של הקומיט הקודם: שימושי לקומיטים של "אופס, תיקון קטן" שלא רוצים בהודעה הסופית.איך מאחדים ענף שלם בזמן מיזוג?
השתמשו ב-
git merge --squash feature, ואז ב-git commit. זה מחיל את כל השינויים של הענף כשינויים מוכנים ומאפשר לשמור אותם כקומיט יחיד בענף היעד, בלי להביא את הקומיטים הנפרדים של הענף. הכפתור "Squash and merge" של GitHub עושה את אותו הדבר.אפשר לעשות squash בלי rebase אינטראקטיבי?
כן.
git reset --soft HEAD~N מחזיר את הענף N קומיטים אחורה ומשאיר את כל השינויים שלהם מוכנים, ואז git commit יחיד שומר אותם כקומיט אחד. זו דרך מהירה לאחד את הקומיטים האחרונים בלי לפתוח את עורך ה-rebase.כדאי לאחד קומיטים לפני מיזוג?
צוותים רבים עושים זאת, כך שכל פיצ'ר נכנס כקומיט אחד שקל לקרוא וקל לבטל עם revert. המחיר הוא אובדן ההיסטוריה צעד אחר צעד. עשו squash בחופשיות בענף שרק אתם משתמשים בו; בענף משותף, תאמו קודם, כי קומיטים שנכתבו מחדש מאלצים את כל השאר לאפס את העותק שלהם.
אפשר לתרגל את זה אונליין?
כן. פתחו את עורך הטרמינל אונליין כדי להריץ rebase אינטראקטיבי ב-shell אמיתי בדפדפן, בלי להתקין כלום. גם קורס ה-Git האינטראקטיבי והחינמי של Coddy מלמד rebase וסידור היסטוריה צעד אחר צעד.