Menu
Coddy logo textTech

Git Squash: איחוד קומיטים

עודכן לאחרונה

squash מאחד כמה קומיטים לאחד, כך שסדרה מבולגנת של קומיטים כמו "wip", "fix typo", "actually fix it" הופכת לקומיט נקי אחד. הכלי הרגיל לכך הוא rebase אינטראקטיבי, git rebase -i, שבו מסמנים את הקומיטים שיש לאחד. מכיוון ש-squash משכתב היסטוריה, עשו אותו לפני שאתם דוחפים, או בענף שרק אתם עובדים עליו.

נסו את הפקודות האלה בעורך הטרמינל אונליין: shell אמיתי בדפדפן, בלי להתקין כלום.

squash מקפל רצף של קומיטים קטנים לקומיט נקי אחד בעזרת rebase אינטראקטיבי.

תחביר

פקודהמה היא עושה
git rebase -i HEAD~3rebase אינטראקטיבי ל-3 הקומיטים האחרונים
git rebase -i mainrebase לכל קומיט מאז main
git merge --squash featureאיחוד הקומיטים של ענף לאחד בזמן המיזוג
git reset --soft HEAD~3 && git commitאיחוד 3 הקומיטים האחרונים בלי rebase

פקודות ב-rebase אינטראקטיבי

בעורך שנפתח, שנו את pick לאחת מאלה.

מילת מפתחמה היא עושה
pickהשארת הקומיט כפי שהוא
squash (s)איחוד לקומיט הקודם ושילוב ההודעות
fixup (f)איחוד לקומיט הקודם וזריקת ההודעה של הקומיט הזה
reword (r)השארת הקומיט ועריכת ההודעה שלו

דוגמה מלאה

איחוד שלושת הקומיטים האחרונים לאחד לפני הדחיפה.

שלבפעולהתוצאה
1git 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 וסידור היסטוריה צעד אחר צעד.
איור של שפות התכנות ב-Coddy

ללמוד Git עם Coddy

להתחיל