מה זה גיט סקווש?
אחד הדברים שמפתחים שומעים לעתים קרובות למדי בנוגע לבקשות המשיכה שלהם הוא משהו כמו "זה נראה לי טוב, בבקשה תמעוך ותמזג". החלק המהנה הוא שאין פקודה כזו כמו git squash
(אלא אם כן אתה יוצר לה כינוי).
כדי squash
למשוך אמצעי בקשה נפוץ קומפקטית כל יתחייב ב לבקשה זו לתוך אחד (לעיתים נדירות למספר אחרים) כדי להפוך אותו ליותר תמציתי, קריא ולא לזהם את ההיסטוריה של הענף הראשי. כדי להשיג זאת, מפתח צריך להשתמש במצב אינטראקטיבי של הפקודה Git Rebase.
לעתים קרובות למדי כשאתה מפתח תכונה חדשה כלשהי, אתה מקבל מספר התחייבויות לסירוגין בהיסטוריה שלך - אחרי הכל אתה מתפתח באופן הדרגתי. זה יכול להיות רק כמה שגיאות הקלדה או צעדים לפיתרון הסופי. לרוב אין כל תועלת בכך שכל ההתחייבויות הללו יהיו בגרסה הציבורית הסופית של הקוד שלך, ולכן מועיל יותר לדחוס את כולן לגרסה אחת, אחת ואחרונה.
אז נניח שיש לך את יומן ההתחייבות הבא בענף שברצונך למזג כחלק מבקשת המשיכה:
$ git log --pretty=oneline --abbrev-commit 30374054 Add Jupyter Notebook stub to Data Science Tools 8490f5fc Minor formatting and Punctuation changes 3233cb21 Prototype for Notebook page
ברור שאנחנו מעדיפים שתהיה כאן התחייבות אחת בלבד, מכיוון שאין שום תועלת לדעת מה התחלנו לכתוב ואילו שגיאות הקלדה תיקנו שם אחר כך. רק התוצאה הסופית חשובה.
אז מה שאנחנו עושים זה להתחיל סשן rebase אינטראקטיבי מה- HEAD הנוכחי (התחייבו 30374054 ) כדי לבצע 3233cb21 , מתוך כוונה לשלב את שלוש ההתחייבויות האחרונות לאחת:
$ git rebase -i HEAD~3
זה יפתח עורך עם משהו כזה:
pick 3233cb21 Prototype for Notebook page pick 8490f5fc Minor formatting and Punctuation changes pick 30374054 Add Jupyter Notebook to Data Science Tools # Rebase # # Commands: # p, pick = use commit # r, reword = use commit, but edit the commit message # e, edit = use commit, but stop for amending # s, squash = use commit, but meld into previous commit # f, fixup = like "squash", but discard this commit's log message # x, exec = run command (the rest of the line) using shell # # 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
כמו תמיד, גיט נותנת לנו הודעת עזרה נחמדה מאוד בה תוכלו לראות את squash
האפשרות אותה אנו מחפשים.
נכון לעכשיו את ההוראות נניח rebase אינטראקטיבית pick
לכל שצוין להתחייב ו לשמר את המסר להתחייב המתאים. כלומר - אל תשנה כלום. אבל אנחנו רוצים שיהיה רק התחייבות אחת בסופו של דבר.
אז אתה יכול פשוט לערוך את הטקסט שאתה עורך החלפה pick
עם squash
(או רק s
) הבא יו כל להתחייב שאנחנו רוצים להיפטר ולשמור / וצאו מהעורך. זה עשוי להיראות כך:
s 3233cb21 Prototype for Notebook page s 8490f5fc Minor formatting and Punctuation changes pick 30374054 Add Jupyter Notebook to Data Science Tools
כשתסגור את העורך שלך לאחר שמירת השינוי הזה, הוא ייפתח מחדש מייד ויציע לך לבחור ולעצב מחדש את ההודעות המחויבות. משהו כזה:
# This is a combination of 3 commits. # The first commit's message is: Prototype for Notebook page # This is the 2nd commit message: Minor formatting and Punctuation changes # This is the 3rd commit message: Add Jupyter Notebook to Data Science Tools # Please enter the commit message for your changes. Lines starting # with '#' will be ignored, and an empty message aborts the commit.
בשלב זה תוכלו למחוק את כל ההודעות שאינכם רוצים לכלול בגרסת ההתחייבות הסופית. אתה יכול גם לנסח מחדש אותם או פשוט לכתוב מסר התחייבות מאפס.
רק זכרו שהגרסה החדשה תכלול את כל השורות שלא מתחילות עם #
הדמות. שוב שמור וצא מהעורך שלך.
המסוף שלך אמור להציג הודעת הצלחה כולל Successfully rebased and updated
ויומן git צריך להראות היסטוריה נחמדה ודחוסה עם התחייבות אחת בלבד. כל ההתחייבויות המתווכות נעלמו ואנחנו מוכנים להתמזג!
אזהרה מפני חוסר התאמה בין היסטוריה מקומית ומרחוקה
פעולה זו מסוכנת מעט אם פרסמת כבר את הסניף שלך במאגר מרוחק - בכל זאת אתה משנה היסטוריית התחייבות. לכן עדיף לבצע את פעולת הסקווש בסניף מקומי לפני שתדחפו .
לפעמים זה כבר נדחק - איך בכל זאת היית יוצר בקשת משיכה? במקרה זה יהיה עליכם לכפות את השינויים על הענף המרוחק לאחר ביצוע הכווץ, מכיוון שההיסטוריה המקומית והיסטוריית הענפים במאגר המרוחק שונים:
$ git push origin +my-branch-name
עשה כמיטב יכולתך כדי לוודא שאתה היחיד שמשתמש בסניף מרוחק זה בשלב זה, או שתקשה על חייו של המפתח האחר כשיש להם אי התאמה בהיסטוריה. אך מכיוון שריסוק מתבצע בדרך כלל כפעולה סופית בסניף לפני שנפטרים ממנו, זה בדרך כלל לא כל כך חשוב.