מבוא לעבודה עם Git ו-Github למתכנתים ולמפתחים
לגרסה האנגלית של המדריך The essentials of Git and Github for web developers
מה זה Git?
git היא תוכנה שמאפשרת לנו לנהל גרסאות, ולחזור לגרסאות קודמות של הפרויקט שעליו אנחנו עובדים. כל פרויקט ב-git מכונה מאגר (repository), וכל מאגר יכול לכלול כמה קבצים ותיקיות.
יש ל-git עוד מספר היבטים, אבל נסתפק בתפקיד העיקרי ככלי לניהול גרסאות של תוכנה. נוסף ל-git שמנהל את המאגר המקומי, שיושב במחשב האישי שלנו, מומלץ לגבות את המאגר המקומי במאגר (repository) חיצוני, שיכול לשבת בשרתים של אתר דוגמת github.com. היתרון הוא בכך שיש לנו גיבוי של גרסאות הפרויקט שעליו אנחנו עובדים בענן, וגם שניתן לשתף אנשים נוספים בפיתוח הפרויקט.
מאגר מקומי ומאגר מרוחק
פיתוח תוכנה נעשה לרוב בצוותים, והבעיה היא כיצד לסנכרן את הקוד שכותב כל מתכנת בנפרד עם הפרויקט המלא. GIT הוא מערכת version control פופולרית שמאפשרת לנהל את הפרויקט לשמור את כל הגרסאות שלו מכול המתכנתים במקום אחד. ב-GIT משתמשים ביחד עם GitHub, שהוא אתר שמאחסן את הפרויקט בענן.
Repository הוא מאגר מידע, והוא עשוי מתיקיות ומקבצים.
קיים מאגר מרכזי (Central repository), שיושב ב-GitHub, ומרכז את כל הגרסאות מכל המתכנתים. וקיימים מאגרים מקומיים (Local repositories) על המחשבים של המתכנתים. נשתמש ב-GIT כדי לתווך בין המאגרים המקומיים על המחשבים של המתכנתים ובין המאגר המרכזי. המתכנת יכול לעדכן את המאגר המרכזי עם הקוד שהוא פיתח על המחשב שלו, וגם יכול להתעדכן בשינויים שערכו המתכנתים האחרים שמשתתפים בפרויקט.
את המאגר המרכזי יוצרים באתר GitHub, ואז ניתן ליצור את המאגר המקומי שיעבוד מולו.
התקנה
כדי לעבוד עם git ו-github צריך להירשם לאתר github.com, ולהוריד את git למחשב האישי.
איך מתחילים לעבוד?
יוצרים מאגר מרוחק חדש באתר github.com על ידי לחיצה על הכפתור הירוק הגדול New repository בחשבון ה-github שלכם.
כשיוצרים את המאגר החדש רצוי מאוד לזכור להוסיף לו קובץ README.
במחשב שלנו מנווטים דרך הטרמינל לתיקיית שבה תשב הגרסה המקומית של המאגר, ומקימים את המאגר באמצעות git clone, שמעתיק את קבצי הפרויקט מ-github.com לתיקייה במחשב שלנו.
$ git clone [repository_url]
נכנסים לתוך התיקייה שירדה למחשב האישי. תיקייה זו היא המאגר המקומי. כשנכנסים לתוך המאגר המקומי מוודאים שאכן הקבצים והתיקיות ירדו מהמאגר המרוחק וגם שהמאגר המרוחק הוא אכן המאגר הנכון.
נכנס למאגר המקומי:
$ cd [local_repo/]
נוודא שהקבצים והתיקיות שאנחנו מצפים להם אכן נמצאים
$ ls -la
וגם נוודא את כתובתו של המאגר המרוחק:
$ git remote -v
התוצאה היא:
>> origin [your_url]/[repo_name].git (fetch)
>> origin [your_url]/[repo_name].git (push)
בשורה הראשונה, fetch url, מיועד למשיכה של מידע מהמאגר המרוחק.
בשורה השנייה, push url, מיועד לדחיפה של מידע מהמחשב של המתכנת אל המאגר המרוחק.
בדרך כלל, שתי כתובות ה-URL יהיו זהות.
איך ממשיכים?
אחרי שהורדנו את המאגר למחשב המקומי ניתן להוסיף קבצים, לערוך, למחוק וכיו"ב. ובסוף אנחנו צריכים להעלות את השינויים למאגר המרוחק כדי לשתף עם יתר המתכנתים שעובדים איתנו על אותו הפרויקט.
איך מעלים את השינויים ל-github?
מדי כמה שעות נרצה לגבות את הקבצים, שיושבים במאגר המקומי במחשב שלנו, במאגר המרוחק באתר github.com. לצורך כך נשתמש בשלוש הפקודות הבאות:
$ git add –A
להוספת כל הקבצים בתיקייה
$ git commit –m "some descriptive text"
כדי לתייג את מה שאנו מעלים באמצעות שם ייחודי ותיאורי.
$ git push
כדי להעלות את קבצי הפרויקט מהמחשב המקומי לשרת github המרוחק
כיצד למנוע שיתוף של קבצים ותיקיות באופן גורף?
בדרך כלל אנחנו לא נרצה לשתף את כל הקבצים של הפרויקט עם יתר המתכנתים, בגלל שתי סיבות עיקריות:
- קבצים ותיקיות שאנחנו לא רוצים להעלות אותם אף פעם למאגר המרוחק. לדוגמה, פרטי גישה למסד הנתונים או תיקייה שמכילה את כל הספריות שבהם הפרויקט תלוי, לדוגמה, תיקיית תלויות שיצרנו באמצעות npm
- קבצים ותיקיות שאנחנו עדיין עובדים עליהם, ואנחנו לא רוצים לשתף עם יתר העולם.
סעיף זה מטפל במקרה הראשון, ומסביר כיצד למנוע העלאת קבצים ותיקיות באופן גורף:
כדי למנוע העלאת הקבצים, צריך להוסיף לתיקיית השורש של האתר קובץ .gitignore, ובתוכו לציין את שמות הקבצים והתיקיות שרוצים ש-git לא יעלה למאגר המרוחק:
.gitignore
----------
node_modules/
database_credentials.php
*.log
*.conf
ניתן לראות בדוגמה כיצד למנוע העלאת תיקייה או קובץ, אבל גם כיצד למנוע העלאת קבצים מסוג מסוים באמצעות ציון ההרחבה אחרי כוכבית נקודה, לדוגמה, כדי למנוע את העלאת כל הקבצים ששייכים לסוג log נשתמש ב:
*.log
כיצד לבחור אילו קבצים להעלות ל-GitHub?
בדוגמה הקודמת ראינו כיצד למנוע באופן גורף העלאת קבצים ותיקיות למאגר המרוחק, אבל לפעמים אנחנו רוצים להימנע מהעלאת קבצים באופן מוגבל בזמן, לדוגמה עד שנסיים לעבוד עליהם.
הפקודה git status אומרת לך אילו קבצים במאגר המקומי שונים מהמאגר המרוחק, וכך שאתה יכול להחליט אילו קבצים לדחוף. כשאתה מחליט לא לסנכרן קובץ מסוים אתה עושה לו unstage, והוא מופיע באדום. כשאתה עושה stage לקובץ הוא מופיע בירוק.
$ git status
בשלב זה, הקבצים שלא עשינו להם staging יופיע באדום.
כדי לעשות stage לקובץ : משתמשים בפקודה git add עם שם הקובץ.
$ git add [file_name]
עכשיו נשתמש בפקודה git status כדי לוודא שאכן הקובץ עבר staging.
הקובץ מופיע בירוק כי עשינו לו staging.
ניתן לעשות לקובץ unstage ובכך להסיר אותו מרשימת הקבצים שצריכים להסתנכרן עם המאגר המרוחק:
$ git reset [file_name]
השלב השני הוא commiting.
בשלב זה אתה נותן הוראה ל-git לתעד את השינויים שערכת במאגר שלך.
$ git commit -m [your message]
ההערה שאתה מוסיף מיועדת לעזור לך לזכור אילו שינויים ערכת במאגר.
בצעד השלישי נדחוף את השינויים שערכנו למאגר המרוחק.
$ git push
כיצד למשוך את המידע מ-GitHub?
בשלב זה נעדכן את המאגר המקומי על ידי משיכת השינויים מהמאגר המרוחק. זה שלב שתצטרך לעשות בכל פעם שתעדכן את המאגר שלך בקוד שמקורו במתכנת אחר שעובד על אותו פרויקט.
נכנס לתוך תיקיית הפרויקט, ונקליד את הפקודה:
$ git pull origin master
git ייבא את השינויים מהמאגר המרוחק אל המאגר המקומי.
כיצד לחזור לגרסאות קודמות?
בכל פעם שמעלים גרסה חדשה ל-Git נשמרות גם הגרסאות הקודמות, וכך אנחנו יכולים לחזור אחורה אל גרסאות קודמות של הפרויקט. לדוגמה, אם אתה רוצה לחזור למצב הפרויקט לפני 4 ימים אתה יכול לעשות זאת, וכל הקבצים והתיקיות של הפרויקט יחזרו בדיוק למצב שבו הם היו לפני ארבעה ימים. איך זה עובד? לכל גרסה שמעלים יש commit number שבאמצעותו git מזהה את הגרסה.
כדי לצפות בפירוט של כל הגרסאות בפרויקט נשתמש בפקודה:
$ git log
ניתן לחזור לגרסה קודמת על ידי שימוש בפקודה:
$ git checkout [commit_number]
diff
נשתמש בפקודה diff כדי להשוות את הגרסה המקומית של קובץ לגרסה במאגר המרוחק.
$ git diff [file]
ניגודי עניינים (merge conflict)
מכיוון שצורת העבודה הזו מאפשרת למספר מתכנתים לעבוד במקביל. כל אחד על העותק של המאגר שנמצא במחשבו האישי, יתכנו ניגודי עניינים כאשר שני מתכנתים משנים את אותה שורה בקובץ מסוים, ומנסים להעלות את השינויים למאגר המרוחק. מצב זה ידוע כ-merge conflict, והדרך לפתור אותו היא למשוך באמצעות pull את הגרסה מהאתר המרוחק, לעדכן את הקובץ, ורק אז לדחוף אותו חזרה ל-github באמצעות :
$ git add –A
$ git commit –m "message"
$ git push
לסיכום
במדריך זה למדנו איך ניתן לנהל מאגר מרוחק על שרתי github, כיצד להוריד אותו למחשב האישי, וכיצד לעבוד בצוות על אותו פרויקט. במדריך הבא נלמד כיצד לחזור לגרסאות קודמות של הפרויקט, וכיצד לעבוד עם יותר מענף אחד (branching).
אהבתם? לא אהבתם? דרגו!
0 הצבעות, ממוצע 0 מתוך 5 כוכבים
המדריכים באתר עוסקים בנושאי תכנות ופיתוח אישי. הקוד שמוצג משמש להדגמה ולצרכי לימוד. התוכן והקוד המוצגים באתר נבדקו בקפידה ונמצאו תקינים. אבל ייתכן ששימוש במערכות שונות, דוגמת דפדפן או מערכת הפעלה שונה ולאור השינויים הטכנולוגיים התכופים בעולם שבו אנו חיים יגרום לתוצאות שונות מהמצופה. בכל מקרה, אין בעל האתר נושא באחריות לכל שיבוש או שימוש לא אחראי בתכנים הלימודיים באתר.
למרות האמור לעיל, ומתוך רצון טוב, אם נתקלת בקשיים ביישום הקוד באתר מפאת מה שנראה לך כשגיאה או כחוסר עקביות נא להשאיר תגובה עם פירוט הבעיה באזור התגובות בתחתית המדריכים. זה יכול לעזור למשתמשים אחרים שנתקלו באותה בעיה ואם אני רואה שהבעיה עקרונית אני עשוי לערוך התאמה במדריך או להסיר אותו כדי להימנע מהטעיית הציבור.
שימו לב! הסקריפטים במדריכים מיועדים למטרות לימוד בלבד. כשאתם עובדים על הפרויקטים שלכם אתם צריכים להשתמש בספריות וסביבות פיתוח מוכחות, מהירות ובטוחות.
המשתמש באתר צריך להיות מודע לכך שאם וכאשר הוא מפתח קוד בשביל פרויקט הוא חייב לשים לב ולהשתמש בסביבת הפיתוח המתאימה ביותר, הבטוחה ביותר, היעילה ביותר וכמובן שהוא צריך לבדוק את הקוד בהיבטים של יעילות ואבטחה. מי אמר שלהיות מפתח זו עבודה קלה ?
השימוש שלך באתר מהווה ראייה להסכמתך עם הכללים והתקנות שנוסחו בהסכם תנאי השימוש.