המדריך האולטימטיבי למיזוג Git ו- Git Rebase

ברוך הבא למדריך האולטימטיבי שלנו לפקודות 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במאגר מקומי.

זה כל מה שאתה צריך לדעת כדי להתמזג ולהתחיל מחדש עם המיטב שבהם.