המדריך האולטימטיבי לאיפוס Git ו- Git Revert

ברוך הבא למדריך האולטימטיבי שלנו לפקודות git resetו git revert. מדריך זה ילמד אותך כל מה שאתה צריך לדעת על תיקון טעויות נפוצות וביטול התחייבויות רעות בעת השימוש ב- Git.

הבן את שלושת החלקים של פרויקט גיט

פרויקט גיט כולל את שלושת החלקים העיקריים הבאים:

  1. ספריית Git
  2. ספריית עבודה (או עץ עובד)
  3. אזור בימוי

ספריית 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: מאפס ערכי אינדקס ומעדכן קבצים בעץ העבודה השונים בין commitHEAD. אם לקובץ שונה בין commitHEAD יש שינויים מקומיים, האיפוס מבוטל

הערה חשובה לגבי איפוס קשיח

היזהר מאוד בעת השימוש --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.