git rebase ו-git stash מוסברים¶
רוב המדריכים לגיט מלמדים אתכם commit, push, pull, ואולי branch - ועוצרים שם, כאילו זה כל מה שצריך. בפועל, ברגע שאתם עובדים בצוות אמיתי, שתי פקודות אחרות נכנסות לשיחה כל הזמן - rebase ו-stash. הן לא קשות, אבל אף אחד לא טורח להסביר אותן טוב, אז בואו נעשה את זה כאן.
git stash - המגירה הזמנית¶
תארו לעצמכם שאתם באמצע כתיבת פיצ'ר, הקוד שלכם לא גמור ולא מוכן ל-commit, ופתאום מישהו אומר "יש באג דחוף, תעברו ל-branch הראשי ותתקנו". אתם לא רוצים לעשות commit לקוד חצי גמור, אבל אתם גם לא יכולים לעבור branch עם שינויים לא שמורים בלי לאבד אותם.
בדיוק בשביל זה קיים git stash. הפקודה לוקחת את כל השינויים שלא עשיתם להם commit, שומרת אותם בצד ב"מגירה" נפרדת, ומחזירה את התיקייה שלכם למצב נקי - כאילו לא נגעתם בכלום. עכשיו אתם חופשיים לעבור branch, לתקן את הבאג, ולחזור. כשאתם רוצים את הקוד בחזרה, פשוט מריצים git stash pop, וכל השינויים חוזרים בדיוק כמו שהיו.
זה שימושי במיוחד כי אפשר לצבור כמה stashes בו זמנית - git stash list מראה לכם את כולם, ואפשר לבחור איזה מהם להחזיר. הטעות הכי נפוצה של מתחילים היא לשכוח מה יש ב-stash ולגלות שבוע אחר כך שינויים חשובים "נעלמו" - הם לא נעלמו, הם פשוט מחכים שם.
git rebase - לשנות היסטוריה¶
rebase הוא פקודה חזקה יותר, ולכן גם מפחידה יותר בהתחלה. הרעיון הבסיסי - כשיש לכם branch שהתחיל מנקודה מסוימת, ובינתיים ה-branch הראשי התקדם עם קומיטים חדשים, rebase לוקח את הקומיטים שלכם ומדביק אותם מחדש כאילו התחלתם לעבוד מהנקודה העדכנית ביותר, במקום מהנקודה הישנה.
התוצאה - היסטוריית git נקייה וליניארית, בלי את מבנה ה"יהלום" המבלבל שנוצר מ-merge רגיל, שבו רואים כל הזמן קומיטים כמו "Merge branch main into feature". במקום זה, נראה כאילו כתבתם את כל הקומיטים שלכם ברצף אחד נקי, מעל הקוד העדכני ביותר.
החוק הכי חשוב ב-rebase¶
הכלל שאסור לשכוח - אף פעם אל תעשו rebase ל-branch ששיתפתם עם אחרים ושכבר עשו עליו pull. rebase לא רק מזיז קומיטים, הוא בפועל יוצר להם מזהים חדשים לגמרי. אם מישהו אחר כבר משך את הקומיטים הישנים למחשב שלו, ואתם עושים rebase ו-push בכוח, יצרתם התנגשות היסטוריה שקשה מאוד לפתור נקי, ולפעמים גורמת לאובדן קוד אצל חברי הצוות. הכלל הפשוט - rebase רק על ה-branch הפרטי שלכם, לפני ששיתפתם אותו עם אף אחד.
מתי להשתמש במה¶
Stash הוא כלי יומיומי, בלי סיכון אמיתי - השתמשו בו בכל פעם שצריך "לשמור הצידה" עבודה לא גמורה. Rebase הוא כלי לניקוי היסטוריה לפני שיתוף - שימושי כדי לסדר קומיטים מבולגנים ל-branch נקי לפני שפותחים pull request, אבל דורש זהירות ברגע שיש עוד אנשים על אותו branch.
למה בכלל להשקיע בזה¶
מתכנתים מתחילים לומדים commit ו-push ומרגישים שהם "יודעים גיט", אבל ברגע שנכנסים לצוות אמיתי, השליטה בפקודות האלה היא מה שמבדיל בין מישהו שמתמודד בביטחון עם conflict מורכב לבין מישהו שמפחד לגעת בגיט מרוב חשש לקלקל משהו.
בקורס תכנות בסיסי שלנו אנחנו מלמדים גיט לא כרשימת פקודות לשינון, אלא כדרך חשיבה על ניהול קוד - כולל התרגול המעשי שבאמת מקבע את זה בזיכרון.
נתקעתם באמצע rebase עם conflicts שלא ברור איך לפתור? בלי פאניקה, יש בקהילה שלנו אנשים שראו את זה כבר.