git bisect

פיצ׳ר של גיט שמאפשר לנו להבין מה השתבש בגרסה שלנו בקלות
Git logo

אחד מהכלים המגניבים ביותר שיש ב-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

גיט תמשיך לשנות את הגרסאות עד שהיא תמצא את הגרסה שבה הפיצ'ר נהרס.

תהליך של git bisect. בכל פעם אני צריך לכתוב git bisect good או git bisect bad - תלוי אם הפיצ'ר עובד או לא. המטרה: למצוא את הגרסה הראשונה שלא עבדה
תהליך של git bisect. בכל פעם אני צריך לכתוב git bisect good או git bisect bad – תלוי אם הפיצ'ר עובד או לא. המטרה: למצוא את הגרסה הראשונה שלא עבדה

ברגע שהגרסה הראשונה שלא עבדה נמצאה – אני יכול לעשות diff בקלות בינה לבין הגרסה שבאה אחריה ולראות מה השתבש. בכל רגע נתון אני יכול לצאת מה-bisect באמצעות:

git bisect reset

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

פוסטים נוספים שכדאי לקרוא

צילום מסך של סוואגר
יסודות בתכנות

openAPI

שימוש בתשתית הפופולרית למיפוי ותיעוד של API וגם הסבר בסיסי על מה זה API

גלילה לראש העמוד