Git – עבודה עם ענפים (branches)

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

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

ענפים משמשים אותנו לגרסאות שונות או תוספות שונות למוצר שלנו. למשל, אם יש לי repo של תוסף לוורדפרס ולקוח מעוניין בתוספת פונקציונלית, אני אפצל את הענף הראשי של המוצר (נקרא בדרך כלל master) לענף שעוסק בפיצ'ר, אני אעשה קומיטים מקומיים ואז אדחוף את הענף לשרת המרוחק. שם ה-QA והאוטומציה יוכלו לעבוד עליו. אם הכל תקין הענף ימוזג חזרה אל הענף הראשי (מעכשיו אני קורא לענף הראשי master). אפשר להתפרע יותר – יש במוצר שלנו כמה ענפים – ענף ה-master שהוא הענף הראשי והיציב. בתחילת תהליך הפיתוח אנחנו מפצלים את ענף ה-master לענף ה-development. ממנו אנחנו מצלים עוד ועוד ענפים שכל אחד מהם מוקדש לפיצ'ר אחר. ברגע שהמפתח מסיים לעבוד על הפיצ'ר, הוא דוחף את הענף שלו לשרת ה-git. שם ה-QA בודק אותו יחד עם האוטומציה. אם הכל תקין, הוא ימוזג ל-development. שאר המפתחים, שעובדים על ענפים משלהם יכולים להתעדכן בכל עת מענף ה-development. בסוף התהליך ה-development ממוזג עם ה-master וחוזר חלילה. ואם זה נשמע מבלבל, אל דאגה. זה יהיה פשוט עוד מעט.

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

git checkout -b develop

ה- b- הוא קריטי פה. כי הוא מייצר את הענף. מייד אקבל הודעה ש:

Switched to a new branch 'develop'

אם אכתוב git status אראה ש:

$ git status
On branch develop
nothing to commit, working directory clean

כל שינוי שאעשה עכשיו, כולל הקומיטים, יעשה בענף develop. על מנת לדחוף את הענף שלי אל השרת המרוחק, כל מה שאני צריך לעשות זה להשתמש בפקודת git push, שאליה אצרף שני ארגומנטים: הראשון הוא origin שהוא בעצם שם השרת המרוחק שהגדרתי (זוכרים? אם לא, דלגו אחורה שני מאמרים) והשני הוא שם הענף שאני רוצה לדחוף אליו בשרת המרוחק. git push origin develop

$ git push origin develop
Username for 'https://github.com': [email protected]
Password for 'https://[email protected]@github.com': 
Counting objects: 5, done.
Delta compression using up to 2 threads.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 319 bytes | 0 bytes/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To https://github.com/sometestuser2/temp.git
 * [new branch]      develop -> develop

בעצם מה עשינו? יצרתי ענף חדש. הענף החדש נוצר מהענף שבו הייתי (במקרה הזה master) והתפצל ממנו. עכשיו כל אחד שיש לו הרשאה מתאימה (ואם אני משתמש בגיטהאב זה כל אחד בעולם) יכול לעשות clone ל-repo שלי ולמשוך את הענף שלי. איך? לעשות clone למדנו במאמר הקודם – פשוט לקחת את ה-URL של השרת המרוחק ולעשות משהו כזה:

git clone https://github.com/sometestuser2/temp.git

ועכשיו הוא צריך לבקש מ-git להביא את כל הענפים המרוחקים שיש:

$ git fetch --all

ואז לעבור אל ה-branch:

git checkout develop

שימו לב שאין כאן b- – אני לא יוצר את הענף מחדש אלא מושך את הענף המרוחק אלי.

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

git pull origin develop

בדומה ל-push, גם כאן אני מכניס שני ארגומנטים – הראשון הוא שם השרת המרוחק שהגדרתי אותו כ-origin (זוכרים?) והשני הוא שם הענף.

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

במאמר הבא נדבר על מיזוג ופיצול בין ענפים שונים.

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

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

נגישות טכנית – פודקאסט ומבוא

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

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