Git – עבודה ראשונית

המאמר הקודם במדריך ה-git

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

אנו נפתח תיקיה כלשהי במחשב שלנו שעליה נתאמן. לצורך העניין: temp_project

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

$ git init
Initialized empty Git repository in /home/ran/temp_project/.git/

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

עכשיו ניצור קובץ בשם index.php שבו, איך לא, יהיה hello.world. אחרי היצירה, אנו נשתמש בפקודת git status כדי לראות אם יש שינויים בין העותק המקומי לבין ממה ששמור ב-git המקומי שלנו. זה מה שנראה:

$ git status
On branch master

Initial commit

Untracked files:
  (use "git add ..." to include in what will be committed)

	index.php

ועכשיו זה הזמן להסביר את ה-workflow של גיט. בניגוד ל-SVN, בכל דחיפה של קוד יש שני שלבים. השלב הראשון הוא הקומיט שמשמש אותנו לדחיפת קוד מקומית בלבד. ה-push משמש בעצם לדחיפת קוד אל תוך השרת. אנחנו עוסקים כרגע ב-commit מקומי. אז אנו רואים בעצם, באמצעות ה-git status, שיש לנו קובץ אחד שהוא untracked, כלומר ש-git לא עוקבת אחריו. שם הקובץ הוא index.php. בואו ונבקש מגיט להכניס אותו אל ה-repo שלנו. עושים את זה באמצעות פקודת git add שמקבל את שם הקובץ (או pattern, אבל זה סיפור אחר). אחרי שנכתוב git add index.php ונכתוב git status נוכל לראות שב-initial commit יש לנו קובץ חדש ששמו הוא index.php:

$ git add index.php 
$ git status
On branch master

Initial commit

Changes to be committed:
  (use "git rm --cached ..." to unstage)

	new file:   index.php

אני יכול להוסיף ולעדכן את ה-commit שלי. לעדכן את ה-index.php, להוסיף קבצים חדשים (לא נשכח להוסיף אותם עם git add אחרי יצירתם). אחרי שסיימתי וה-commit שלי מוכן, אני אשתמש בפקודת commit כדי להכניס את כל העבודה שלי אל ה-repo המקומי. הפקודה היא פשוטה מאוד: git commit ואז m- ומרכאות עם המסר שייכנס ללוג. ככה זה נראה:

$ git commit -m "Initial commit"
[master (root-commit) afe684e] Initial commit
 1 file changed, 3 insertions(+)
 create mode 100644 index.php

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

$ git status
On branch master
Changes not staged for commit:
  (use "git add ..." to update what will be committed)
  (use "git checkout -- ..." to discard changes in working directory)

	modified:   index.php

no changes added to commit (use "git add" and/or "git commit -a")

אם ארצה לעשות עוד קומיט, שוב אצטרך לעשות git add עם שם הקובץ (או git add –all לכל הקבצים במידה ויש כמה) ואז git commit עם ההודעה שנכנסת ללוג.

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

במידה ויש לי כמה קומיטים, יש לי כבר לוג שאני יכול להציץ בו:

$ git log
commit 228a8c3190429c61c8fde0c77a068ae25d2fed29
Author: Ran Bar-Zik 
Date:   Sat Nov 21 16:42:07 2015 +0200

    Change wording

commit afe684e746f36320d5aac9db039807051fe8877e
Author: Ran Bar-Zik 
Date:   Sat Nov 21 16:34:21 2015 +0200

    Initial commit

רואים את המספר הזה שאורכו כאורך הגלות? 228a8c3190429c61c8fde0c77a068ae25d2fed29 למשל? זה נקרא ה-hash וזה המזהה של ה-commit. בדיוק כמו ב-SVN או בכל מערכת אחרת לניהול קבצים. אני יכול להציג את השינויים בין הקומיטים עם diff:

$ git diff 228a8c3190429c61c8fde0c77a068ae25d2fed29 afe684e746f36320d5aac9db039807051fe8877e

לא חייבים להשתמש בכל ה-hash אלא ברוב המקרים אפשר להשתמש רק בחמש ספרות הראשונות. למשל:

$ git diff 228a8 afe68
diff --git a/index.php b/index.php
index b495a86..40f1dd2 100644
--- a/index.php
+++ b/index.php
@@ -1,3 +1,3 @@
 <?php
 
-print "Hello World!";
+print "hello world!";

אם עבדתם כבר עם SVN או עם מערכת אחרת לניהול גרסאות, אתם אמורים להכיר את הסינטקס של ה-diff ואפילו כמה כלים גרפיים שעובדים עם גיט בדיוק כמו SVN.

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

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

אהבתם? לא אהבתם? דרגו!

לא אהבתי בכלללא אהבתיבסדראהבתיאהבתי מאוד (13 הצבעות, ממוצע: 3.77 מתוך 5)

תגיות: פורסם בקטגוריה: Git

אל תשארו מאחור! יש עוד מה ללמוד!

10 comments on “Git – עבודה ראשונית
  1. ZG הגיב:

    לגיט יש איזושהי תוכנה שולחנית לווינדוס?

  2. משתמש אנונימי (לא מזוהה) הגיב:

    אני עובדת עם VS לאחר סנכרון קבצים ב GIT
    (את ה- GIT אנו לא מנהלים מ VS)
    אני מקבלת שגיאה ש DLLים מסוימים לא מנותבים כראוי
    שמנו כבר את הקבצים הבאים ב ignore :
    bin, obj, packages
    אבל עדין כשעושים PULL/PUSH
    זה קורה והאתר זורק שגיאה כי הוא לא מוצא את ה DLL
    מה אפשר לעשות?

  3. משתמש אנונימי (לא מזוהה) הגיב:

    אני עובדת עם VS לאחר סנכרון קבצים ב GIT
    (את ה- GIT אנו לא מנהלים מ VS)
    אני מקבלת שגיאה ש DLLים מסוימים לא מנותבים כראוי
    שמנו כבר את הקבצים הבאים ב ignore :
    bin, obj, packages
    אבל עדין כשעושים PULL/PUSH
    זה קורה והאתר זורק שגיאה כי הוא לא מוצא את ה DLL
    מה אפשר לעשות?

    • רן בר-זיק הגיב:

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

  4. התקנתי בוינדוס git ורסיה
    git version 2.8.4.windows.1

    קיבלתי שגיאה
    ‘git commit -m’Initial commit
    error: pathspec ‘commit” did not match any file(s) known to git.

    תיקנתי עם השורה
    “git commit -m “Initial commit
    כלומר יש רווח אחרי הm ויש מרכאות כפולות

  5. שמעון הגיב:

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

    • רן בר-זיק הגיב:

      תודה, המאמר הזה ספציפי בעייתי או כל הסדרה? והאם התחלת לקרוא את הסדרה מההתחלה?

      • שמעון הגיב:

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