ברוך הבא למדריך האולטימטיבי שלנו לפקודות git reset
ו git revert
. מדריך זה ילמד אותך כל מה שאתה צריך לדעת על תיקון טעויות נפוצות וביטול התחייבויות רעות בעת השימוש ב- Git.
הבן את שלושת החלקים של פרויקט גיט
פרויקט גיט כולל את שלושת החלקים העיקריים הבאים:
- ספריית Git
- ספריית עבודה (או עץ עובד)
- אזור בימוי
ספריית Git (ממוקמת YOUR-PROJECT-PATH/.git/
) היא מקום שבו הכל בחנויות Git שהוא צריך במדויק כדי לעקוב אחר הפרויקט. זה כולל מטא נתונים ומסד עצמים הכולל גרסאות דחוסות של קבצי הפרויקט.
ספריית העבודה היא המקום שבו שמשתמש מבצע שינויים מקומיים פרויקט. ספריית העבודה שולפת את קבצי הפרויקט ממאגר האובייקטים של ספריית Git ומניחה אותם במחשב המקומי של המשתמש.
הערה: מדריך ידוע גם בשם מאגר או ריפו טופס קצר. הדוח החוזר במכונה המקומית של המשתמש נקרא "ריפו מקומי" ואילו ריפו בשרת git נקרא "ריפו מרחוק".
לאזור ההכנה הוא קובץ (המכונה גם "מדד", "במה", או "מטמון") מאחסן מידע על מה ייכנס שלך באות להתחייב. התחייבות היא כשאתה אומר לגיט לשמור את השינויים המבוימים האלה. Git מצלם תמונת מצב של הקבצים כמו שהם ומאחסן את תמונת המצב הזו באופן קבוע בספריית Git.
עם שלושה חלקים, יש שלוש מצבים עיקריים שקובץ יכול להיות בהם בכל זמן נתון: שונה, מחויב או מבוים. אתה משנה קובץ בכל פעם שאתה מבצע בו שינויים בספריית העבודה שלך. לאחר מכן, הוא מבוים כשאתה מעביר אותו לאזור הבימוי. לבסוף, זה מחויב לאחר התחייבות.
Git Reset
git reset
פקוד מאפשרת לך לאפס את הראש הנוכחי שלך למצב מצוין. באפשרותך לאפס את מצב הקבצים הספציפיים וכן ענף שלם. זה שימושי אם עדיין לא דחפת את התחייבותך ל- GitHub או למאגר מרוחק אחר.
אפס קובץ או קבוצת קבצים
הפקודה הבאה מאפשרת לך לבחור באופן סלקטיבי גושי תוכן ולבטל או לבטל אותו.
git reset (--patch | -p) [tree-ish] [--] [paths]
בטל את הקובץ
אם העברת קובץ לאזור ההיערכות עם git add
, אך אינך מעוניין עוד שהוא יהיה חלק git reset
מההתחייבות , תוכל להשתמש כדי לבטל את הבמה של הקובץ:
git reset HEAD FILE-TO-UNSTAGE
השינויים שביצעת עדיין יהיו בקובץ, פקודה זו פשוט מסירה את הקובץ מאזור ההיערכות שלך.
אפס סניף להתחייבות קודמת
הפקודה הבאה מאפסת את ה- HEAD של הסניף הנוכחי שלך לנתון COMMIT
ומעדכנת את האינדקס. זה בעצם מחזיר את מצב הסניף שלך לאחור, ואז כל ההתחייבויות שאתה מבצע בהמשך כותבות על כל מה שהגיע אחרי נקודת האיפוס. אם תשמיט את MODE
, ברירת המחדל היא --mixed
:
git reset MODE COMMIT
האפשרויות MODE
הן:
--soft
: לא מאפס את קובץ האינדקס או עץ העבודה, אלא מאפס את HEAD ל-commit
. משנה את כל הקבצים ל"שינויים שיחויבו "--mixed
: מאפס את האינדקס אך לא את העץ העובד ומדווח על מה שלא עודכן--hard
: מאפס את האינדקס ועץ העובד. כל שינוי בקבצי המעקב בעץ העובד מאזcommit
מושלך--merge
: מאפס את האינדקס ומעדכן את הקבצים בעץ העובד השונים ביןcommit
ו- HEAD, אך שומר על אלה השונים בין האינדקס לעץ העובד.--keep
: מאפס ערכי אינדקס ומעדכן קבצים בעץ העבודה השונים ביןcommit
HEAD. אם לקובץ שונה ביןcommit
HEAD יש שינויים מקומיים, האיפוס מבוטל
הערה חשובה לגבי איפוס קשיח
היזהר מאוד בעת השימוש --hard
באפשרות git reset
מכיוון שהיא מאפסת את אזור ההתחייבות, ההיערכות וספריית העבודה שלך. אם לא נעשה שימוש נכון באופציה זו, בסופו של דבר אפשר לאבד את הקוד שנכתב.
Git Revert
הן הפקודות git revert
והן git reset
הפקודות מבטלות את ההתחייבויות הקודמות. אך אם כבר דחפת את ההתחייבות שלך למאגר מרוחק, מומלץ שלא להשתמש git reset
בו מכיוון שהוא משכתב את ההיסטוריה של ההתחייבויות. זה יכול להקשות מאוד על עבודה על מאגר עם מפתחים אחרים ולשמור על היסטוריה עקבית של התחייבויות.
במקום זאת, עדיף להשתמש git revert
, שמבטל את השינויים שבוצעו על ידי התחייבות קודמת על ידי יצירת התחייבות חדשה לחלוטין, והכל מבלי לשנות את ההיסטוריה של ההתחייבויות.
השבת התחייבות או קבוצה של התחייבויות
הפקודה הבאה מאפשרת לך לבטל שינויים מהתחייבות קודמת או להתחייב וליצור התחייבות חדשה.
git revert [--[no-]edit] [-n] [-m parent-number] [-s] [-S[]] … git revert --continue git revert --quit git revert --abort
אפשרויות נפוצות:
-e --edit
- זוהי אפשרות ברירת המחדל ואין צורך להגדיר אותה במפורש. זה פותח את עורך הטקסט המוגדר כברירת מחדל של המערכת שלך ומאפשר לך לערוך את הודעת ההתחייבות החדשה לפני שתבצע את ההחזרה.
- אפשרות זו עושה ההיפך
-e
, ואתgit revert
לא תפתח את עורך הטקסט. - אפשרות זו מונעת
git revert
לבטל התחייבות קודמת וליצור התחייבות חדשה. במקום ליצור התחייבות חדשה,-n
בטל את השינויים מההתחייבות הקודמת ויוסיף אותם לאינדקס הזמני ולספריית העבודה.
--no-edit
-n -no-commit
דוגמא.
בואו נדמיין את המצב הבא: 1.) אתה עובד על קובץ ואתה מוסיף ומחייב את השינויים שלך. 2.) לאחר מכן אתה עובד על כמה דברים אחרים, ומבצע עוד כמה התחייבויות. 3.) עכשיו אתה מבין שלפני שלוש או ארבע התחייבות, עשית משהו שתרצה לבטל - איך אתה יכול לעשות את זה?
You might be thinking, just use git reset
, but this will remove all of the commits after the one you would like to change - git revert
to the rescue! Let's walk through this example:
mkdir learn_revert # Create a folder called `learn_revert` cd learn_revert # `cd` into the folder `learn_revert` git init # Initialize a git repository touch first.txt # Create a file called `first.txt` echo Start >> first.txt # Add the text "Start" to `first.txt` git add . # Add the `first.txt` file git commit -m "adding first" # Commit with the message "Adding first.txt" echo WRONG > wrong.txt # Add the text "WRONG" to `wrong.txt` git add . # Add the `wrong.txt` file git commit -m "adding WRONG to wrong.txt" # Commit with the message "Adding WRONG to wrong.txt" echo More >> first.txt # Add the text "More" to `first.txt` git add . # Add the `first.txt` file git commit -m "adding More to first.txt" # Commit with the message "Adding More to first.txt" echo Even More >> first.txt # Add the text "Even More" to `first.txt` git add . # Add the `first.txt` file git commit -m "adding Even More to First.txt" # Commit with the message "Adding More to first.txt" # OH NO! We want to undo the commit with the text "WRONG" - let's revert! Since this commit was 2 from where we are not we can use git revert HEAD~2 (or we can use git log and find the SHA of that commit) git revert HEAD~2 # this will put us in a text editor where we can modify the commit message. ls # wrong.txt is not there any more! git log --oneline # note that the commit history hasn't been altered, we've just added a new commit reflecting the removal of the `wrong.txt`
And with that you're one step closer to getting your black belt in Git.