עבודה במספר ענפים (Branch-ים)

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

1. קצת תיאוריה

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

בצד של גיט ראינו איך אנחנו תמיד יכולים לחזור לקומיטים ישנים בפרויקט באמצעות אופציית Checkout Commit. אמרתי לכם גם שכשאתם בוחרים באפשרות זו תצטרכו לחזור לקומיט האחרון לפני שתוכלו להוסיף קומיטים חדשים, כדי לא לאבד את כל הקומיטים שבוצעו אחרי אותו קומיט אליו חזרתם. אבל זה לא היה תיאור עד הסוף מדויק של מה שקורה. למעשה בגיט קומיטים אף פעם לא הולכים לאיבוד (גם אם לפעמים אנחנו לא מוצאים אותם). בשיעור זה ובשיעורים שאחריו נדבר על Branch-ים, שהם כמו מדבקות שאנחנו יכולים לשים על קומיטים כדי לחזור אליהם מהר. באמצעות מדבקות אלה נוכל לעבוד על מספר גירסאות במקביל וזה יעבוד בערך כך:

  1. ניצור מספר קומיטים בפרויקט.

  2. נבצע "שחרור גירסה", כלומר נשים מדבקה (בראנץ) בנקודה מסוימת שאומרת שזאת גירסה יציבה מספר 1 של הפרויקט.

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

  4. נדמיין שלקוח צלצל לדווח על בעיה בגירסה 1. נחזור לקוד של גירסה 1 דרך המדבקה, נתקן את הבעיה וניצור קומיט חדש. נוודא שהמדבקה שלנו (כלומר הבראנץ) זזה ומתייחסת לקומיט החדש והמתוקן.

  5. נחזור לעבוד על גירסה 2 ונבצע מספר קומיטים נוספים, כולל קומיט אחד לתיקון הבעיה שמצאנו בגירסה היציבה.

מוכנים? בואו נראה את זה בפעולה.

2. יצירת פרויקט דוגמה

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

print("Hi! I'm the smartest AI ever. How can I help you today?")

אפשר להריץ כדי לראות שזה עובד ולאחר מכן נכנס לאפליקציית Github Desktop וניצור Git Repository לפרויקט. הפעם ביצירת הפרויקט אני רוצה שנשים לב לעוד שתי תיבות בחירה:

  1. בחירת קובץ gitignore - בעת יצירת ריפוזיטורי חדש ב Github Desktop אני יכול לאתחל את הפרויקט עם קובץ .gitignore שמתאים לשפת התכנות בה אני עובד. מאחר ואני כותב בפייתון בחרתי קובץ .gitignore שמתאים לפייתון. זה חוסך לכתוב את הקובץ לבד ואני ממליץ להשתמש במנגנון זה.

  2. בחירת רישיון - כשאתם מפרסמים קוד ברשת כפרויקט ציבורי אנשים אחרים עשויים להגיע לקוד הזה. בשביל שהם ידעו מה מותר ומה אסור להם לעשות עם הקוד מקובל לפרסם רישיון בתור קובץ בשם LICENSE בתיקיית הפרויקט. יש המון רישיונות תוכנה לפרויקטים ציבוריים כאשר שני המרכזיים נקראים MIT ו GPL. רישיון MIT אומר שמי שרואה את הקוד יכול לקחת כל חלק ממנו ולעשות איתו מה שהוא רוצה, ורישיון GPL אומר שמי שלוקח חלק מהקוד למוצר שלו מחוייב גם הוא להפיץ את קוד המקור לאותו מוצר.

3. יצירת בראנץ לגירסה 1

אחרי יצירת הפרויקט אני רואה שנוצר באופן אוטומטי קומיט ראשון. אומנם הבוט החכם שלנו לא עושה יותר מדי בינתיים אבל המשקיעים רוצים לראות שאנחנו בכיוון ולכן החלטתי לשחרר אותו כגירסה ראשונה של הבוט. בשלב הזה אני עדיין לא חייב ליצור את הבראנץ, אבל זה כן יהיה לי נוח בעתיד בתור סימנייה כדי לחזור לאותו קומיט ראשוני. אני לוחץ כפתור ימני על הקומיט ובוחר באפשרות Create branch from commit. בתור שם הבראנץ אני בוחר v1 ושימו לב שעכשיו בתיבה האמצעית בפס העליון מתחת לכותרת current branch מופיעה המילה v1, כלומר השם שבחרתי.

אני לוחץ על השם ומשנה אותו ל main כדי שאוכל להתקדם בפרויקט בזמן שהמשקיעים בודקים את ה MVP ששלחתי להם. בינתיים אני יוצר קובץ נוסף בשם repl.py עם התוכן הבא:

import sys

def start():
    while True:
        line = input()
        print(line)

ואז אני משנה את הקובץ main.py לתוכן הבא:

from repl import start

print("Hi! I'm the smartest AI ever. How can I help you today?")
start()

אני עושה קומיט אבל אחרי כמה משחקים מגלה שיש בעיה, כשאני יוצא מלולאת ה REPL עם Ctrl+D מופיעה הודעת שגיאה על המסך. בשביל לתקן אותה אני מתקן את הקובץ repl.py לתוכן הבא:

import sys

def start():
    try:
        while True:
            line = input()
            print(line)
    except EOFError:
        print("Leaving so soon? ok bye")

קומיט נוסף אחרי התיקון ובדיוק כשאני מתכונן לשלב את קוד האינטלגנציה המלאכותית אני מקבל טלפון מהמשקיעים. הם מבינים שהם קיבלו גירסה ממש ראשונית אבל הם מאוד לא מרוצים מהטקסט שהבוט כותב בשורת הפתיחה ומבקשים שורת פתיחה חדשה.

4. חזרה לגירסה 1 לצורך תיקון

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

מרגע שיש לי את הבראנץ אני לוחץ על התיבה האמצעית בפס העליון (עם הכותרת Current branch) ושם בוחר את הבראנץ אליו אני רוצה לעבור. במקרה שלנו זה v1. אני שם לב שבטאב ההיסטוריה אני רואה את העולם כפי שהיה בנקודת הזמן של הקומיט ממנו יצרתי את הבראנץ, וגם בפייצ'ארם כל הקבצים חזרו לאיך שנראו באותה נקודת זמן. רק בשביל המשחק אני חוזר לבראנץ main כדי לוודא ששום דבר לא הלך לאיבוד, ואחרי שנרגעתי אני חוזר ל v1 בשביל התיקון. אני פותח את הקובץ main.py ומשנה אותו ל:

print("Hi! I'm the smartest AI ever. What can I do for you today?")

וחוזר ל Github Desktop בשביל לעשות קומיט. שימו לב שהטקסט בכפתור הכחול הוא עכשיו Commit to v1, כלומר שם הבראנץ הוא חלק מהטקסט שעל הכפתור. אחרי הקומיט אני יכול לשלוח את הגירסה למשקיעים.

5. המשך עבודה על גירסה 2

סיימנו את התיקון ועכשיו אפשר לחזור לגירסה 2 באמצעות שינוי הבראנץ בתיבה Current branch חזרה ל main. אני רואה שכל הקבצים בפרויקט שלי עודכנו ושם לב שהודעת הפתיחה לא השתנתה - התיקון שעשיתי על גירסה v1 נשאר שם ולא עבר ל main. יש מספר דרכים בהן אפשר להעביר שינויים בין בראנצים. בשיעורים הבאים נראה אחת מהן ובקורס המתקדם נראה מספר דרכים נוספות. בינתיים בגלל שזה שינוי קטן אפשר לעדכן את הודעת הפתיחה ידנית גם ב main ולהמשיך לעבוד ולפתח את בוט ה AI הטוב בעולם.

6. עכשיו אתם

  1. קחו את הקומיט האחרון וצרו ממנו בראנץ בשם v2. וודאו שאתם מצליחים לחזור ל main ושהקבצים נראים אותו דבר בין v2 ל main.

  2. הוסיפו עוד מספר פיצ'רים ל main ועשו להם קומיט, כך שב main יהיו עוד 3 קומיטים אחרי הקומיט העדכני ביותר ב v2.

  3. חזרו לענף v2, תקנו בו משהו ובצעו קומיט.

  4. וודאו שאתם מצליחים לעבור בין שלושת הענפים: v1, v2 ו main ושהקבצים בפרויקט משתנים לפי הענף הנוכחי.