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 מאוד יקל על התהליך כיוון שגיט משתמשת בדרך היעילה ביותר 'לחתוך' את המדבר. כמובן שהמשק הנוח גם מונע טעויות אנוש. מומלץ להכיר וגם להשתמש.

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

מיקרו בקרים

בית חכם עם ESPHome ו Home Assistant

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

פתרונות ומאמרים על פיתוח אינטרנט

יישום של nonce על מנת להגן מפני התקפות injection

בפוסט הקודם הסברתי על hash עם CSP על משאבי inline – שזה נחמד ומעולה אבל פחות ישים בעולם האמיתי שבו בדרך כלל התוכן ה-inline (בין

ESP32 מאפס לילדים

מדריך ל-ESP32 לילדים ולהורים מאפס

אחד הדברים הכי כיפיים בעולם הוא תכנות ותכנות בעולם האמיתי – המפעיל אורות, ציוד אלקטרוני ומכשירים הוא מלהיב ממש. המדריך מיועד להורים שרוצים ללמד את הילדים שלהם לתכנת.

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