אחד מהכלים המגניבים ביותר שיש ב-git הוא git bisect. מדובר בכלי שמאפשר לנו לעשות ביעילות 'אריה במדבר'. מה הכוונה? מדובר בשיטת פתרון באגים, בדרך כלל באגים שהם ריגרסיה (משהו שעבד בעבר ולא עובד היום). בדרך כלל, הדרך המהירה ביותר למצוא פתרון לבאג כזה הוא למצוא גרסה קדומה שבה הוא עבד ולהתקדם בגרסאות על מנת לראות מתי הבאג נדפק.
בואו ונניח שיש לי אתר כלשהו שיש בו פיצ'ר שעבד בעבר וכיום לא עובד. אני נמצא על branch שנקרא master. הגרסה האחרונה לא עובדת. אך כשאני חוזר לגרסה קדומה יותר, באמצעות הפקודה
git checkout HASHNUMBER
כאשר ה- HASHNUMBER זה בעצם שם ה-Push האחרון, אז אני רואה שבגרסה הקדומה יותר הפיצ'ר עובד כמו שצריך. כלומר איפושהו בין הגרסה החדשה ביותר לגרסה הקדומה, משהו השתבש.
כלומר בדוגמה הזו, אם אני עושה
git checkout 588fba7
אני אחזור לגרסה קדומה בקוד ואעלה את המוצר ואראה שהפיצ'ר המקולקל עובד כמצופה. כמובן שחסרים המון פיצ'רים שפותחו ונדחפו מאז ועד עכשיו, אבל זה עובד. אני יכול להריץ git diff בין הגרסה שעובדת לגרסה הנוכחית, אבל בדרך כלל יש שינויים ממש ממש גדולים בקוד. מה שאני צריך זה את הגרסה האחרונה שעבדה. כך אני יכול להשוות בינה לבין הגרסה הראשונה שלא עבדה ולראות ממש בקלות מה נשבר.
מה שחלק גדול מהמתכנתים עושים זה להתקדם אחורה לאט לאט ולבדוק בכל פעם את הבאג. זו דרך לא יעילה. מתכנתים אחרים ישתמשו בשיטת 'אריה במדבר' – הם ילכו על גרסה כלשהי באמצע וינסו לצמצם את הטווח. אבל יש שיטה יותר טובה ואוטומטית שנקראת git bisect. השיטה היא פשוטה ביותר. יש לנו את git bisect שהשימוש הבסיסי בה הוא:
git bisect start BADCOMMIT GOODCOMMIT
כאשר BADCOMMIT זה ה-hash של הגרסה שלא עובדת. אם זו הגרסה החדשה ביותר של ה-master אז נקרא לה master (או בשם הענף). ה-GOODCOMMIT היא גרסה מסוימת שבה הפיצ'ר עובד.
למשל:
git bisect start master 588fba7
ברגע שאני מתחיל את תהליך ה-bisect, גיט מנסה למצוא את הגרסה הגרועה. היא עוברת אוטומטית לגרסה כלשהי נמצאת בין הגרסה הטובה הידועה לגרסה הרעה הידועה ושואלת אותי אם הפיצ'ר עובד. במידה ולא, אני כותב
git bisect bad
במידה וכן, אני כותב:
git bisect good
גיט תמשיך לשנות את הגרסאות עד שהיא תמצא את הגרסה שבה הפיצ'ר נהרס.
ברגע שהגרסה הראשונה שלא עבדה נמצאה – אני יכול לעשות diff בקלות בינה לבין הגרסה שבאה אחריה ולראות מה השתבש. בכל רגע נתון אני יכול לצאת מה-bisect באמצעות:
git bisect reset
אריה במדבר היא לא דרך ממש יעילה למצוא באגים אבל לפעמים היא דרך פשוטה מספיק. במקרה הזה, git bisect מאוד יקל על התהליך כיוון שגיט משתמשת בדרך היעילה ביותר 'לחתוך' את המדבר. כמובן שהמשק הנוח גם מונע טעויות אנוש. מומלץ להכיר וגם להשתמש.