שבוע 10 – יום 4: ניהול גרסאות ו־git

הקדמה

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

בכמה ימים האחרונים הספקתם לבנות מערכת ניהול גרסאות (Version Control System; VCS) בסיסית.
“מערכת לניהול גרסאות” זה שם כללי לתוכנות כמו wit, שמאפשרות לנו לנהל גרסאות שונות של הפרויקט שלנו, לשמור אותן ל"תמונה" בכל פעם שבה אנחנו מבצעים בפרויקט שינוי ולשחזר את התמונות ששמרנו במועד מאוחר יותר.

מערכות מודרניות לניהול גרסאות עוזרות לנו להתמודד עם אתגרים קשים במיוחד:

  1. שמירה ותיעוד של גרסאות – שימוש בתוכנה לניהול גרסאות מאפשרת לנו, ובכן… לשמור גרסאות. נוכל לעקוב אחר השינויים שביצענו בקוד של התוכנה, לשמור אותם בקלות ולראות מה היו השינויים בין גרסה לגרסה. כשיהיה באג, נוכל להסתכל אחורה ולראות איזו שורה גרמה לו, או פשוט לבטל את השינוי האחרון שעשינו. יש לנו “תמונה” של כל גרסה ששמרנו בעבר, והיא לא תלך לאיבוד.
  2. עבודה משותפת על קוד – מערכות לניהול גרסאות מקלות מאוד על עבודה של כמה אנשים במקביל על פרויקט. במקום להעביר קבצים אחד לשני ולפתור באופן ידני התנגשויות בעריכה, מערכות לניהול גרסאות פשוט ידעו לבצע מיזוג בין העבודה שלכם לבין העבודה של הקולגות שלכם. זה יחסוך לנו הרבה זמן שהיה מתבזבז על העברת קבצים ממחשב למחשב, מיזוג שינויים באופן ידני ובדיקה של מי ביצע איזה מהשינויים.
  3. גיבוי מרוחק – מערכות מודרניות לניהול גרסאות מאפשרות לנו לגבות יחסית בקלות את הפרויקטים שלנו לשירותים חיצוניים, שמבטיחים לשמור על הקוד שלנו גם אם נשליך את המחשב לחבית חומצה.

מערכת wit שכתבתם היא מערכת שכזו, עם פונקציונליות יחסית בסיסית (נניח – עדיין לא מימשתם גיבוי לאינטרנט. נכון שאני נחמד?).
המערכת הזו דומה באופן מעורר חשד למערכת ניהול גרסאות אחרת בשם git, שעליה אנחנו הולכים ללמוד בימים הקרובים.

אז מי זו git?

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

בהמשך השבוע אנחנו הולכים ללמוד להשתמש ב־git, לנהל את הקוד שלנו בעזרתה ולגבות אותו לאינטרנט.

התקנה

תוכלו להוריד את git מכאן ולהתקין אותה על המחשב שלכם לפי המדריך הזה.
המדריך ממש טוב; עקבו אחרי האפשרויות שהוא מדליק וסמנו אותן גם אצלכם.
עבור ה־Editor, בניגוד אליו, סמנו Visual Studio Code, אלא אם אתם מרגישים בנוח עם Vim.
אם אין לכם Visual Studio Code, בחרו עורך אחר מהרשימה שלדעתכם יהיה לכם נוח לערוך בו הודעות קצרות.

הגדרות ראשוניות

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

שנו את John Doe לשם שלכם, ואת johndoe@example.com לכתובת הדואר האלקטרונית שלכם.

git config --global user.name "John Doe"
git config --global user.email johndoe@example.com

שימוש

תיקייה שמנוהלת על ידי git נקראת Repository (“מאגר”), והיא תכיל את קובצי הפרויקט שלכם.
בתיקייה שכזו, תהיה תת־תיקייה שנקראת .git, מעין “במה אחורית” שבה git תנהל את כל הגרסאות והמידע על הפרויקט שלכם.

ל־git יש שלושה מצבים בהם הקבצים שלכם יכולים להיות:

  1. במצב modified – הקובץ נערך אבל לא ביקשנו מ־git לשמור אותו.
  2. במצב staged – ביקשנו מ־git לשמור את הגרסה הנוכחית של הקובץ, אבל עדיין לא “לקחנו תמונה”.
  3. במצב committed – הקובץ נשמר בהצלחה בגרסתו האחרונה.

בהתאם לשלושת המצבים האלו, יש 3 “מקומות” שבהם קובץ שלכם (או עותק שלו) יכול להיות:

  1. ב־Working Directory – התיקייה המקורית של הפרויקט שלכם.
  2. ב־Staging Area (נקרא גם “ה־Index”) – המקום שבו נשמרים הקבצים אחרי שנערכו ולפני ש"לוקחים תמונה".
  3. “מגובים” – מקום בתוך תיקיית .git שבו ישמרו ה"תמונות", שהן גרסאות מגובות של הפרויקט.

ודאי כבר הבנתם את הרעיון – המודל הזה זהה לחלוטין למודל שבניתם בעצמכם בימים האחרונים.
שיטת העבודה היא פשוטה: עורכים קבצים, מוסיפים רק את הקבצים שרוצים לשנות ל־staging area, לוקחים “תמונה” של הפרויקט אחרי שביצענו בו את השינויים, וחוזר חלילה.

שיטת העבודה עם git

שיטת העבודה הפופולרית היום במקומות עבודה שמשתמשים ב־git נקראת “feature branch workflow”. זו שיטת עבודה שנועדה לייעל את העבודה של מספר אנשים על אותה מערכת.

בשיטת העבודה הזו, כל המפתחים עובדים על מאגר git מנוהל שמשותף לכולם. הגרסה היציבה והעדכנית של המערכת מתוייגת תחת השם “master”. כל מפתח שרוצה לעשות שינוי למערכת – בין אם זה להוסיף פיצ’ר או לתקן באג, פותח “ענף” (branch) משלו ומפתח שם את הקוד שהוא רוצה להוסיף למערכת.

בזמן הזה יכולים להתבצע שינויים באופן בלתי תלוי לקוד שנמצא ב־master, אבל אותו מפתח עובד על הגרסה שלו שנגזרה מהנקודה בזמן שבה הוא פתח את הענף החדש שלו. כשאותו מפתח יסיים את עבודתו, הוא יוכל למזג (merge) את השינויים שביצע חזרה ל־master. בסיום התהליך, ה־master יעודכן עם הקוד החדש של המפתח.

אם נרצה לפתח פיצ’ר של בדיקת העתקות במערכת התרגילים, לדוגמה, נוכל להתפצל מהמקום אליו מצביע master כרגע, וליצור branch חדש ששמו find-cheaters. ה־branch הזה ישמש לפיתוח הפיצ’ר של בדיקת ההעתקות. כשנסיים לפתח את היכולת הזו נמזג את ה־branch שקראנו לו find-cheaters חזרה ל־master, והקוד שכתבנו יהפוך להיות חלק ממנו. כך גם אם master עבר שינויים בזמן הזה, git ידע למזג את השינויים שביצענו ונוכל לעבוד יחד בנוחות למערכת.

במקומות עבודה רבים יש שני branch־ים מרכזיים: master ו־develop, כאשר master מכיל גרסאות אפויות ובדוקות שיורדות ללקוח, ו־develop הוא ה־branch שממנו יוצאים הפיצ’רים.

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

מילון מונחים

  • מאגר – repository, repo – אוסף של קבצים שאנחנו רוצים לנהל בעזרת התוכנה לניהול גרסאות. ב־git, נכריז על תיקייה כזו באמצעות הפקודה git init.
  • תיקיית העבודה – working tree / working directory – התיקייה המקורית שמכילה את הקבצים שאותם אנחנו רוצים לנהל באמצעות git. זו התיקייה שבתוכה תיווצר תיקיית .git.
  • נקודת שמירה – commit – מה שקראנו לו “תמונה”. עותק של ה־repo בנקודת זמן מסוימת שנשמר בעזרת git, ושיהיה אפשר לחזור אליו בנקודת זמן מאוחרת יותר. זה גם השם של הפקודה שיוצרת את נקודת השמירה הזו.
  • הראש – HEAD – הדרך של git להתייחס ל"תמונה" הנוכחית.
  • ענף – branch – תווית בעלת שם שמוצמדת לאחד ה־commit־ים. אם התווית פעילה, היא תתקדם יחד עם ה־commit־ים. הרעיון מאחורי branch הוא לייצג תהליך פיתוח בלתי תלוי, שעשוי להתמזג אחר־כך חזרה לפרויקט המקורי. כל עוד החלטנו להיות “על” תהליך הפיתוח הבלתי תלוי (ה־branch “פעיל”), ה־branch יתקדם יחד איתנו ויצביע על ה־commit האחרון שנעשה.
  • הענף הראשי – master – זה הענף שנהוג לשמור בו גרסאות עובדות של הפרויקט שלנו, וממנו נהוג להתפצל ל־branch־ים.

ניהול הקוד שלכם בעזרת git

נווטו בעזרת cmd לתיקייה בה ניהלתם את קוד ה־wit שלכם.
כדי להגדיר אותה כתיקייה שמנוהלת בעזרת git, הקלידו git init.
צרפו קבצים בעזרת git add, ובצעו את השמירה הראשונה בעזרת git commit.

טיפ: תוכלו לקבל עזרה על פקודה אם תוסיפו -h אחריה. לדוגמה – git init -h.
טיפ 2: אפשר להוסיף את כל הקבצים לפרויקט בעזרת git add -A.
טיפ 3: אפשר לכתוב הודעה קצרה ב־commit בעזרת git commit -m "Message".

שחקו קצת עם git. נסו לערוך קובץ ולעשות commit־ים נוספים.
הריצו בין לבין פקודת git status כדי לבדוק מה מצב ה־repository שלכם.
אתם אמורים להרגיש די בנוח לשחק עם ה־repository, שכן אתם כבר מכירים היטב את הפקודות ואיך הוא עובד.
כדי לראות את המקבילה הפחות חגיגית של git graph שבניתם, כיתבו git log --graph --all.
הרגישו בנוח לעשות checkout ל־commit־ים שראיתם, ולנסות לבצע שינויים ולסבך את הגרף.

רגע! לפני האינטרנט

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

במילותיו של משתמש טוויטר חביב עליי במיוחד:

“גיט נהיה ממש קל כשמבינים שברנצ’ים הם אנדופנקטורים הומומורפים שממפים תתי יריעות של מרחב הילברט.”
Isaac Wolkerstorfer

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

תרגיל 1 – עֲנַף? עֵץ עָבֹת

האתר https://learngitbranching.js.org/ מאפשר לתרגל משחקים בסיסיים עם git.
סיימו את תרגילים 1, 2 ו־3 תחת הכותרות Introduction Sequence ו־Ramping Up.
הגישו את הפקודות שהרצתם כדי לסיים כל אחת מהתרגילים.

הרגישו בנוח, כמובן, לסיים שם תרגילים נוספים אם תרצו להרחיב את הידע שלכם על שימוש ב־git.

תרגיל 2 – וְהָ־git בּוֹ יוֹמָם וָלַיְלָה

כתבו בעברית מה כל אחת מהפקודות הבאות עושה.

  • git init
  • git add
  • git commit
  • git status
  • git checkout
  • git branch
  • git reset
  • git revert
  • git diff
  • git rm
  • git tag
  • git log
  • git merge

עבור הפקודות checkout, add, reset, rm, log צרפו הסבר על שימוש מעניין בפקודה (דגלים נוספים, פרמטרים מעניינים) שאפשר למצוא בתיעוד של git.

לדוגמה:

  • הפעולה git log מציגה את היסטוריית ה־commit־ים ב־repo. שימוש מעניין בפקודה הוא שאפשר לספק לה את הדגל --oneline, שבמקום להביא את המידע המלא על כל commit מביא את ה־id המקוצר של ה־commit, את ההודעה של ה־commit ואת הענף אליו הוא שייך.

ענו גם על השאלות:

  • מה ההבדל בין branch לבין tag?
  • מה ההבדל בין reset לבין revert?

מקורות נוספים ללמידה

  1. הרצאה נפלאה שסידרה לי הרבה דברים בראש בתחילת הדרך – Git For Ages 4 And Up.
  2. מדריך ויזואלי לפקודות git בסיסיות.
4 לייקים

גם זה מדריך טוב , בעברית :

https://www.codebrain.co.il/מדריך-ל-git-ניהול-גרסאות-קוד/

איך מגישים בדיוק את התרגיל?

כתוב בהוראות:

הגישו את הפקודות שהרצתם כדי לסיים כל אחת מהתרגילים.

אני כתבתי את הפקודות כהערות בקובץ .py (בעצת הפוסט הזה).
לדוגמה:

# Introduction Sequence
# 1
# comand
# comand

# 2
# comand 
# comand
3 לייקים

תודה רבה , באיזה פורמט אני אמור לעלות את שאלה 2? זה טיפה יותר מורכב מכמה פקודות.

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

לייק 1