Git מעבר לבייסיקס


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

1. מה זה קומיט?

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

$ git cat-file commit HEAD

כדי לראות מה כולל הקומיט האחרון. פלט לדוגמא נראה כך:

tree 26ed641e24d47a3da3b700bfc7d04376a86a54cd
parent b1830ab79020c75e56c22d7726fe6ed15e5465f7
author ynonp <ynonperek@gmail.com> 1534420429 +0300
committer ynonp <ynonperek@gmail.com> 1534420429 +0300

no need for this perl file

הפלט מורכב ממזהה של tree דרכו נוכל לראות את רשימת כל הקבצים בקומיט ומזהה parent דרכו נוכל להמשיך להסתכל בקומיט הקודם. כדי לראות את כל הקבצים בעץ נשתמש ב:

ynonperek tmp/git-webinar-demo$ git ls-tree 26ed64                                                 master 
100644 blob 1a2a13e7d51ae8e1d39d44c2f6aac3475bb6ed1e    README.txt
100644 blob f01803c8b941e6b2e894b982fb531a79b683c33f    foobar.txt

וכדי לראות את התוכן של כל אחד מהקבצים נשתמש ב:

ynonperek tmp/git-webinar-demo$ git cat-file blob 1a2a13                                           master 
put hello world print in a loop

וכמובן שאפשר להמשיך ולצפות בקומיט הקודם עם:

$ git cat-file commit b1830ab79020c75e56c22d7726fe6ed15e5465f7
ynonperek tmp/git-webinar-demo$ git cat-file commit b1830ab79020c75e56c22d7726fe6ed15e5465f7       master 

tree ccd561c086e0a74b70444a5d1f0b24fdb1ebc4a2
parent 8d44eb88c2b9a1006859179734a3df3e33909221
author ynonp <ynonperek@gmail.com> 1534405489 +0300
committer ynonp <ynonperek@gmail.com> 1534406278 +0300

new stuff with demo.pl

וכך להמשיך אחורה עד תחילת הבראנצ'.

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

2. מה זה בראנצ'?

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

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

$ git update-ref -m 'changing master' refs/heads/master b1830ab79

משנה את הענף master כך שיצביע על קומיט b1830ab79. כשמתחילים להזיז ענפים קומיטים עשויים ללכת לאיבוד אז דיברנו על:

$ git reflog

שמראה את כל הקומיטים כולל אלה שאי אפשר להגיע אליהם מאף ענף.

3. מה זה Staging Area? איך מבטלים קובץ שהוספתי לשם בטעות?

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

$ git add .

ורק אחרי זה ניזכר שאחד הקבצים או התיקיות שם בעצם לא ממש מתאים לקומיט הנוכחי. הפקודה add מוסיפה קבצים לאזור זמני שנקרא Staging שם הם יחכו עד שמישהו ישמור אותם כקומיט. אבל אין בעיה להוריד משם קבצים. הפקודה הבאה מוציאה את readme.txt מרשימת הקבצים שייכנסו לקומיט הבא:

$ git reset readme.txt

והפקודה:

$ git ls-files --stage

מציגה את כל הקבצים והגירסאות שלהם השמורים באינדקס בתור Staging Area.

4. איך מבטלים קומיט או משנים את ההודעה?

דרך קלה אם כך לבטל קומיט או לשנות הודעה עבור קומיט היא להחזיר את HEAD קומיט אחד אחורה בלי לשנות את הקבצים בתיקיה הנוכחית. זה בדיוק מה שעושה הפקודה reset עם המתג --soft:

$ git reset --soft HEAD^

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

5. טריקים נוספים וחומרים לקריאת המשך

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

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

  1. האתר https://learngitbranching.js.org ילמד אתכם על בראנצ'ים דרך משחקונים אינטרקטיביים והסברים והוא מאוד מומלץ.

  2. הספר https://git-scm.com/book/en/v2 כולל את כל מה שתצטרכו לדעת על גיט ועוד הרבה יותר.

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