Git — לבטל, לחזור אחורה ולשחזר
חירום: שלוש פקודות הצלה
Section titled “חירום: שלוש פקודות הצלה”| המצב | פקודה |
|---|---|
| "הרסתי משהו, איפה ה-commit שהיה?" | git reflog ואז git reset --hard <SHA> |
"ביצעתי reset או commit לא נכון (מקומי)" | git reset --hard 'HEAD@{1}' |
| "ה-commit כבר נדחף ומקלקל" | git revert --no-edit <SHA> ואז git push |
git refloggit reset --hard 'HEAD@{1}'git revert --no-edit <SHA>git pushהרגל לפני כל --hard: git status נקי. מי שכבר דחף: רק revert, אף פעם לא reset + --force (sync).
להחזיר קובץ למצב של ה-commit האחרון (restore)
Section titled “להחזיר קובץ למצב של ה-commit האחרון (restore)”git restore <FILE>זורק את השינויים הלא-שמורים בקובץ. אין חזרה: הם לא היו ב-commit.
איך מוודאים: git status -s לא מציג את הקובץ.
להוציא קובץ מ-staging (unstage)
Section titled “להוציא קובץ מ-staging (unstage)”git restore --staged <FILE>הקובץ נשאר ערוך בדיסק, רק לא ייכנס ל-commit. (הצורה הישנה: git reset HEAD <FILE>.)
איך מוודאים: git status -s עובר מ-M ל- M.
להחזיר קובץ לגרסה של commit ישן
Section titled “להחזיר קובץ לגרסה של commit ישן”git restore --source=<SHA> <FILE>git restore --source=<SHA> --staged --worktree <FILE>git checkout <SHA> -- <FILE>הראשונה משנה רק את הקובץ בדיסק. השנייה גם את ה-staging. השלישית (הצורה הישנה) עושה את שניהם. אחר כך git commit כרגיל.
איך מוודאים: git diff <SHA> -- <FILE> ריק.
לתקן את ההודעה או התוכן של ה-commit האחרון (amend)
Section titled “לתקן את ההודעה או התוכן של ה-commit האחרון (amend)”git commit --amend -m "better message"git add <FILE>git commit --amend --no-editהשורה השנייה והשלישית מוסיפות קובץ שנשכח ל-commit האחרון בלי לשנות הודעה. amend יוצר commit חדש עם <SHA> חדש.
איך מוודאים: git log --oneline -2 מציג את ההודעה החדשה ו-git show --stat את הקבצים.
לתקן commit ישן יותר (fixup + rebase -i)
Section titled “לתקן commit ישן יותר (fixup + rebase -i)”git add <FILE>git commit --fixup=<SHA>GIT_SEQUENCE_EDITOR=true git rebase -i --autosquash <SHA>~1--fixup יוצר commit שמסומן "לצרף ל-<SHA>", ו-rebase -i --autosquash מצרף אותו אוטומטית. ה-GIT_SEQUENCE_EDITOR=true מדלג על העורך. בלי המשתנה ייפתח עורך: שמור וסגור.
לשנות הודעה של commit ישן: git rebase -i <SHA>~1, ושנה pick ל-reword. אם הסתבכת: git rebase --abort.
זה משכתב היסטוריה: רק על commits שלא נדחפו.
איך מוודאים: git log --oneline מציג commit אחד פחות, ו-git show --stat <SHA> (ה-<SHA> החדש) כולל את התיקון.
טבלה: reset מול revert מול restore
Section titled “טבלה: reset מול revert מול restore”| פקודה | מה זז | מה קורה לשינויים | נדחף כבר? |
|---|---|---|---|
git reset --soft <SHA> | רק מצביע ה-branch | נשארים ב-staging | לא |
git reset --mixed <SHA> (ברירת מחדל) | branch + staging | נשארים בקבצים, לא ב-staging | לא |
git reset --hard <SHA> | branch + staging + קבצים | נמחקים | לא |
git revert <SHA> | מוסיף commit חדש שמבטל | היסטוריה נשמרת | כן |
git restore <FILE> | רק קובץ | לא נוגע ב-branch | לא רלוונטי |
שלוש השכבות: --soft מזיז את ה-branch, --mixed גם מאפס את ה-staging, --hard גם את הקבצים.
לחזור commit אחד אחורה ולשמור את העבודה (reset --soft / --mixed)
Section titled “לחזור commit אחד אחורה ולשמור את העבודה (reset --soft / --mixed)”git reset --soft HEAD~1git reset HEAD~1הראשונה: ה-commit "מתבטל" והשינויים נשארים מוכנים ב-staging (טוב לצרף commits). השנייה (--mixed): השינויים בקבצים אבל לא ב-staging. HEAD~1 = ה-commit שלפני האחרון.
איך מוודאים: git status -s מציג את הקבצים, git log --oneline קצר ב-commit אחד.
לחזור ל-commit ישן ולזרוק את כל מה שאחריו (reset --hard)
Section titled “לחזור ל-commit ישן ולזרוק את כל מה שאחריו (reset --hard)”git statusgit branch backupgit reset --hard <SHA>איך מוודאים: git log --oneline -1 מציג את <SHA>, ו-git status -s נקי.
לבטל commit שכבר נדחף (revert)
Section titled “לבטל commit שכבר נדחף (revert)”revert לא משכתב היסטוריה: הוא מוסיף commit חדש שהפוך לישן, ולכן בטוח גם ב-main ששותף עם ה-CI.
git revert --no-edit <SHA>git pushלבטל את ה-commit האחרון: git revert --no-edit HEAD. טווח: git revert --no-edit <SHA>~1..HEAD (מבטל כל אחד בנפרד). על merge commit צריך לבחור הורה: git revert -m 1 <SHA>.
איך מוודאים: git log --oneline -2 מציג Revert "...", והקובץ חזר לתוכן הקודם (git show --stat HEAD).
לשחזר commit שאבד (reflog)
Section titled “לשחזר commit שאבד (reflog)”reflog הוא יומן של כל מקום ש-HEAD ביקר בו, כולל אחרי reset --hard. commit "אבוד" שורד בו לפחות 30 יום (ברירת המחדל של git).
git refloggit branch rescue <SHA>git reset --hard <SHA>השורה השנייה יוצרת branch ב-commit האבוד בלי לשנות כלום (הדרך הבטוחה). השלישית מחזירה את ה-branch הנוכחי אליו. מקצר: 'HEAD@{1}' = המקום הקודם. כל שורה ביומן נראית <SHA> HEAD@{n}: <פעולה>.
איך מוודאים: git log --oneline -3 על rescue מציג את ה-commit שחיפשת.
למצוא commit שאפילו אין עליו הפניה: git fsck --lost-found.
לבדוק commit ישן (detached HEAD)
Section titled “לבדוק commit ישן (detached HEAD)”git switch --detach <SHA>git switch --detach <TAG>git switch -מצב detached HEAD = אתה על commit בלי branch. מסתכלים, מריצים, ו-git switch - חוזר. אם עשית שם commits שרוצים לשמור, צור branch לפני שיוצאים:
git switch -c <BRANCH>איך מוודאים: git status אומר HEAD detached at <SHA>. אחרי יציאה ללא branch, ה-commits נשארים רק ב-reflog.
להעביר commit בודד מ-branch אחד לאחר (cherry-pick)
Section titled “להעביר commit בודד מ-branch אחד לאחר (cherry-pick)”git switch <BRANCH>git cherry-pick <SHA>מעתיק את השינוי של <SHA> כ-commit חדש (עם <SHA> אחר) מעל ה-branch הנוכחי. קונפליקט: תקן, git add <FILE>, git cherry-pick --continue; לוותר: git cherry-pick --abort.
איך מוודאים: git log --oneline -2 מציג את ההודעה של ה-commit שהועתק.
לשים שינויים בצד זמנית (stash)
Section titled “לשים שינויים בצד זמנית (stash)”git stashgit stash push -m "wip" -- <FILE>git stash listgit stash popgit stash dropstash שומר שינויים לא-commited ומחזיר את העבודה למצב נקי (אפשר אז pull, switch). pop מחזיר ומוחק את ה-stash, drop מוחק בלי להחזיר. קבצים חדשים (??) דורשים git stash -u.
איך מוודאים: git status -s נקי אחרי stash, והשינויים חוזרים אחרי pop.
למחוק קבצים לא-עוקבים (clean)
Section titled “למחוק קבצים לא-עוקבים (clean)”git clean -ndgit clean -fd-n מראה מה יימחק ("dry run") ו--f מוחק בפועל. תמיד -n קודם: מה שנמחק כאן אין לו reflog.