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

עבודה מקומית עם Git.
Git logo

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

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

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

תמונה של הבית הלבן עם מחשוב ענן וטקסט: FEDRAMP
פתרונות ומאמרים על פיתוח אינטרנט

FedRAMP & FIPS מבוא למתחילים

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

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

המנעו מהעלאת source control לשרת פומבי

לא תאמינו כמה אתרים מעלים את ה-source control שלהם לשרת. ככה תמצאו אותם וגם הסבר למה זה רעיון רע.

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