ברוך הבא למדריך האולטימטיבי שלנו לפקודות git merge
ו git rebase
. מדריך זה ילמד אותך כל מה שאתה צריך לדעת על שילוב של מספר סניפים עם Git.
Git Merge
git merge
פקוד תתמזג כל שינויים שנעשו לבסיס הקוד על ענף נפרד הסניף הנוכחי שלך בתור חדש להתחייב.
תחביר הפקודה הוא כדלקמן:
git merge BRANCH-NAME
לדוגמה, אם אתה עובד כעת בענף בשם dev
וברצונך למזג שינויים חדשים שבוצעו בענף בשם new-features
, תנפיק את הפקודה הבאה:
git merge new-features
הערה: אם ישנם שינויים לא מחויבים בסניף הנוכחי שלך, Git לא תאפשר לך להתמזג עד שכל השינויים בסניף הנוכחי שלך בוצעו. כדי להתמודד עם שינויים אלה, תוכל:
צור סניף חדש והתחייב לשינויים
git checkout -b new-branch-name git add . git commit -m ""
סגרו אותם
git stash # add them to the stash git merge new-features # do your merge git stash pop # get the changes back into your working tree
נטוש את כל השינויים
git reset --hard # removes all pending changes
גיט ריבייס
החלפת ענף מחדש בגיט היא דרך להעביר את כל הענף לנקודה אחרת בעץ. הדוגמה הפשוטה ביותר היא העברת ענף במעלה העץ. נניח שיש לנו ענף שסטה מהענף הראשי בנקודה A:
/o-----o---o--o-----o--------- branch --o-o--A--o---o---o---o----o--o-o-o--- master
כשאתה מתחיל מחדש אתה יכול להזיז אותו כך:
/o-----o---o--o-----o------ branch --o-o--A--o---o---o---o----o--o-o-o master
כדי לבצע רישום מחדש, ודא שיש לך את כל ההתחייבויות שאתה רוצה בבסיס מחדש בסניף המאסטר שלך. בדוק את הענף שאליו ברצונך לבסס מחדש והקלד git rebase master
(איפה המאסטר הוא הענף עליו ברצונך לבנות מחדש).
אפשר גם לבנות מחדש על ענף אחר, כך שלמעשה ענף שהתבסס על ענף אחר (נקרא לזה תכונה) יונחה מחדש על בסיס מאסטר:
/---o-o branch /---o-o-o-o---o--o------ feature ----o--o-o-A----o---o--o-o-o--o--o- master
לאחר git rebase master branch
או לאחר git rebase master
שבדקתם את הסניף, תקבלו:
/---o-o-o-o---o--o------ feature ----o--o-o-A----o---o--o-o-o--o--o- master \---o-o branch
Git rebase אינטראקטיבי בקונסולה
כדי להשתמש git rebase
במסוף עם רשימת התחייבויות, אתה יכול לבחור, לערוך או להוריד את ה- rebase:
- הזן
git rebase -i HEAD~5
כאשר המספר האחרון הוא כל מספר התחייבויות מהאחור לאחור שתרצה לבדוק. - ב- vim, לחץ על
esc
ואזi
כדי להתחיל בעריכת הבדיקה. - בצד שמאל תוכלו להחליף את
pick
אחת מהפקודות למטה. אם ברצונך לרסק התחייבות לקודם ולמחוק את הודעת ההתחייבות, הזןf
במקוםpick
ההתחייבות. - שמור ועזב את עורך הטקסט שלך.
- לאחר הפסקת ריבייס, בצע את ההתאמות הנדרשות, ולאחר מכן השתמש בו
git rebase --continue
עד להצגת ריבייס. - אם הוא יופעל מחדש בהצלחה, עליך להכריח את השינויים שלך
git push -f
בכדי להוסיף את הגרסה המבוססת מחדש למאגר המרוחק שלך. - אם יש סכסוך מיזוג, ישנן מספר דרכים לתקן זאת, כולל ביצוע ההצעות במדריך זה. אחת הדרכים היא לפתוח את הקבצים בעורך טקסטים ולמחוק את חלקי הקוד שאתה לא רוצה. ואז השתמש
git add
ואחריוgit rebase --continue
. אתה יכול לדלג עלgit rebase --skip
ההתחייבות המסוכסכת על ידי כניסה , להפסיק את הריסה מחדש על ידי הפעלהgit rebase --abort
במסוף שלך.
pick 452b159 pick 7fd4192 pick c1af3e5 pick 5f5e8d3 pick 5186a9f # Rebase 0617e63..5186a9f onto 0617e63 (30 commands) # # Commands: # p, pick = use commit # r, reword = use commit, but stop to edit the commit message. # e, edit = use commit, but stop to amend or add commit. # s, squash = use commit, meld into previous commit and stop to edit the commit message. # f, fixup = like "squash", but discard this commit's log message thus doesn't stop. # x, exec = run command (the rest of the line) using shell # d, drop = remove commit # # These lines can be re-ordered; they are executed from top to bottom. # # If you remove a line here THAT COMMIT WILL BE LOST. # # However, if you remove everything, the rebase will be aborted. # # Note that empty commits are commented out
מיזוג סכסוכים
סכסוך מיזוג הוא כאשר אתה מתחייב על ענפים נפרדים המשנים את אותו קו בדרכים סותרות. אם זה קורה, Git לא יידע איזו גרסה של הקובץ לשמור בהודעת שגיאה הדומה להודעה הבאה:
CONFLICT (content): Merge conflict in resumé.txt Automatic merge failed; fix conflicts and then commit the result.
אם אתה מסתכל על resumé.txt
הקובץ בעורך הקוד שלך, אתה יכול לראות היכן התרחש הסכסוך:
<<<<<<>>>>>> updated_address
גיט הוסיף כמה שורות נוספות לקובץ:
<<<<<<< HEAD
=======
>>>>>>> updated_address
תחשוב =======
על הקו המפריד של הסכסוך. כל מה שבין <<<<<<< HEAD
לבין =======
הוא התוכן של הסניף הנוכחי כי השופט HEAD מצביע. מצד שני, כל מה שבין =======
לבין >>>>>>> updated_address
הוא התוכן בסניף שמוזג updated_address
,.
מיזוג Git לעומת Git Rebase
שתיהן git merge
והן git rebase
פקודות שימושיות מאוד, והאחת אינה טובה יותר מהשנייה. עם זאת, ישנם כמה הבדלים חשובים מאוד בין שתי הפקודות שאתה וצוותך צריכים לקחת בחשבון.
בכל פעם git merge
שמנוהל, נוצר התחייבות נוספת למיזוג. בכל פעם שאתה עובד במאגר המקומי שלך, אם יש לך יותר מדי התחייבויות מיזוג יכול לגרום להיסטוריית ההתחייבות להיראות מבלבלת. אחת הדרכים להימנע מההתחייבות למיזוג היא להשתמש git rebase
במקום זאת.
git rebase
היא תכונה חזקה מאוד. עם זאת, זה גם מסוכן אם לא משתמשים בו בצורה נכונה. git rebase
משנה את היסטוריית ההתחייבות, אז השתמש בה בזהירות. אם האתחול מחדש נעשה במאגר המרוחק, זה יכול ליצור הרבה בעיות כאשר מפתחים אחרים מנסים למשוך את שינויי הקוד האחרונים מהמאגר המרוחק. זכור לרוץ רק git rebase
במאגר מקומי.
זה כל מה שאתה צריך לדעת כדי להתמזג ולהתחיל מחדש עם המיטב שבהם.