Git – יצירת pull request

עדכון ופתרון קונפליקטים ב-git עם git pull וגם מעט על pull request.
Git logo

במאמר הקודם למדנו על יצירת ענף חדש – ראשית מקומית (באמצעות branch -b) ואז בשרת (באמצעות git push). נותרו לנו כמה שאלות פתוחות – הראשונה היא עדכון הענף שלי. נניח והתפצלתי מה-master אל develop. בינתיים מישהו אחר עידכן את ה-master. איך אני מבצע עדכון? יש כמה דרכים לעשות את זה. הדרך הפשוטה יותר היא לבצע משיכה של הענף אלי באמצעות pull.

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

git pull origin master

מה יש שם? git pull הוא מוכר, ה-origin הוא השם של השרת המרוחק כפי שהוא בדרך כלל מוגדר. master הוא שם של ה-branch:

מייד כל הקומיטים שנעשו לשרת המרוחק נמשכים אלי ואם יש קונפליקטים (ויש), הם יוצגו בדיוק כמו ב-SVN. אני נדרש לבצע תהליך resolve (בדיוק כמו ב-SVN) ואחרי כן, לבצע add ו-commit לתיקונים עצמם שנחשבים שינוי קוד. איך זה נראה? בדיוק ככה:

משיכת השינויים שנעשו בקומיט אחר אלינו. פתרון הקונפליקטים נעשה בענף שלנו.
משיכת השינויים שנעשו בקומיט אחר אלינו. פתרון הקונפליקטים נעשה בענף שלנו.

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

אם אני עושה git pull origin master לפני שאני אדחוף ולא יהיו קונפליקטים, מן הסתם לא אצטרך לפתור, אבל כאשר אני אעשה push, בלוג אני אראה שיש לי קומיט ריק. נשאלת השאלה למה? התשובה היא שכאשר אני עושה git pull אני תמיד תמיד לא רק מביא את השינויים מהגרסה המרוחקת, אלא גם עושה merge וזה חייב להרשם בלוג גם אם אין שום קונפליקט. יש דרך להמנע מזה והיא נקראת rebase. אדבר עליה במאמר הבא.

אם אנחנו יודעים למשוך repo מרוחק, לבצע שינויים, לעדכן אותו באופן סדיר וגם לדחוף אותו ל-master. הגיע הזמן לדעת איך עושים אותו בעולם האמיתי. בעולם האמיתי לעולם לעולם לא דוחפים קוד ישירות לתוך ה-master או ה-develop או ענף מרכזי אחר. כל השינויים בענפים מרכזיים נעשים באמצעות pull requets. כאשר כל השינויים לענפים המרכזיים לא נעשים עם push אלא אך ורק עם merge.

איך עושים את זה? נניח ויש לי master שהוא הגרסה המרכזית. אני רוצה להוסיף תכונה כלשהי. אני אפתח את ה-master אצלי באמצעות clone או (אם יש לי את master במחשב) אני אעדכן אותו באמצעות pull. אחרי זה אני אצור ממנו ענף באמצעות checkout -b. אני מבצע את השינויים בקוד שנדרשים על מנת להוסיף את התכונה, דוחף את השינויים כענף מרוחק. אם יש לי גיטהאב, באמצעות הממשק הגרפי אני מבקש pull request. אם יש לי מערכת אחרת (כמו stash) אני מבצע את ה-pull request באמצעות המערכת הזו. זה שיש לו את הרשאות הכתיבה ל-master בוחן את הקוד, יכול להעיר את ההערות שלו, אני יכול לתקן (ולדחוף את התיקונים לאותו branch כמובן) ואחרי שהכל תקין, ה-pull request יאושר והגרסה שלי תתמזג עם ה-master.

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

במאמר הבא אנו נלמד על rebase ואיך הוא שונה באופן מהותי מ-git pull.

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

ESP32 מאפס לילדים

מדריך ל-ESP32 לילדים ולהורים מאפס

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

צילום מסך של סוואגר
יסודות בתכנות

openAPI

שימוש בתשתית הפופולרית למיפוי ותיעוד של API וגם הסבר בסיסי על מה זה API

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

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

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

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

יישום של nonce על מנת להגן מפני התקפות injection

בפוסט הקודם הסברתי על hash עם CSP על משאבי inline – שזה נחמד ומעולה אבל פחות ישים בעולם האמיתי שבו בדרך כלל התוכן ה-inline (בין

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