git回退版本

王冰冰發表於2024-03-22

當我們commit了之後想回退,共有兩個命令,四種組合。
包括git reset和git revert。其中git reset有三種模式:--mixed, --soft, --hard

假設你提交了一次,這次提交修改了changed.sh檔案,你想回退這次修改。

HEAD指的當前位置,HEAD^1就是HEAD的上一次commit,HEAD^2就是上上次commit

  1. soft

--soft
Does not touch the index file or the working tree at all (but resets the head to , just like all modes do). This leaves all your changed files "Changes to be committed", as git status would put it.

回退到之前的commit,並將修改放在暫存區。(這意味著你的暫存區如果有同名檔案,那麼暫存的修改會被沖刷掉),工作區不會有影響。

$ git reset --soft HEAD^1
$ git status
位於分支 main
您的分支與上游分支 'origin/main' 一致。

要提交的變更:
  (使用 "git restore --staged <檔案>..." 以取消暫存)
        修改:     changed.sh
  1. mixed

--mixed
Resets the index but not the working tree (i.e., the changed files are preserved but not marked for commit) and reports what has not been updated. This is the default action.

回退到之前的commit,並將修改放在工作區。(不加引數預設是--mixed)
操作:
1. 清空暫存區,這意味著你在暫存區會被全部清空
2. 將受影響的檔案放到工作區,保留changes
3. 如果工作區的檔案和受影響的檔案有重疊,不會覆蓋工作區的檔案

$ git reset HEAD^1
$ git status
位於分支 main
您的分支與上游分支 'origin/main' 一致。

尚未暫存以備提交的變更:
  (使用 "git add <檔案>..." 更新要提交的內容)
  (使用 "git restore <檔案>..." 丟棄工作區的改動)
        修改:     changed.sh
  1. git reset --hard

Resets the index and working tree. Any changes to tracked files in the working tree since are discarded. Any untracked files or directories in the way of writing any tracked files are simply deleted.

這樣直接把HEAD指標回退,並且不會將兩次commit的差異儲存在工作區/暫存區中。會清空你的工作區和暫存區,應當慎用。一旦回退,除非記得之前的commit id,不然看不到之前的commit內容了。

$ git reset --hard HEAD^1
$ git status
位於分支 main
您的分支與上游分支 'origin/main' 一致。

相關文章