במאמר הקודם הסברנו איך עובדים מול שרת מרוחק ובתור שרת מרוחק השתמשנו בגיטהאב. ראינו שיש בעצם עבודה בשני שלבים – קומיטים בגרסה המקומית ו-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 שכתבתי.
במאמר הבא נדבר על מיזוג ופיצול בין ענפים שונים.
5 תגובות
בלוג מעולה!!!
בדוגמא שהבאת כדי למשוך את כל הענפים המרוחקים מדוע צריך לעשות git feath –all אחרי הפקודה של clone.
האם clone לא מעתיק את כל ה- repository המרוחק ל- מקומי? אם לא אז איזה ענפים הוא מביא אם בכלל?
יוסי, clone ,נעשה רק פעם אחת כדי להביא את ה repository המרוחק אליך למחשב. אחרי שכבר יש לך את ה source אתה משתמש ב fetch כדי להביא עידכונים מה repository המרוחק . חשוב להבין את ההבדל בין fetch ל pull .Pull יבצע merge במידת הצורך בעוד ש fetch רק מעדכן את ה remotes על המחשב שלך.
אתה תותח ,
הסברים פשוטים שעושים המון סדר בבלגן
אחלה מדריך!
מאמרים ממש טובים!
יש דרך למחוק / לבטל branch שיצרתי?