1. reset 的三种模式
-
--hard:stage区和工作目录里的内容会被完全重置为和指定 HEAD 位置相同的内容。
-
--soft:保留工作目录和暂存区中未提交的内容,并把重置 HEAD 所带来的新的差异(回滚掉的commit较回滚后最新commit的修改)放进暂存区。
-
--mixed(默认):工作区、暂存区未提交的内容以及由 reset 所导致的新差异,都会被放进工作区。
2. reset --hard
重置stage区和工作目录(慎用)。
在 reset 后面加 --hard 参数时,stage区和工作目录里的内容会被完全重置为和指定 HEAD 位置相同的内容。也就是没有commit的修改会被全部擦掉。执行后工作区、暂存区、版本库保持一致(指定HEAD版本)
Administrator@WIN-DTNF3GRDH5R MINGW64 /g/tmp/test (master)
$ git status
On branch master
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git restore <file>..." to discard changes in working directory)
modified: aa.txt
no changes added to commit (use "git add" and/or "git commit -a")
Administrator@WIN-DTNF3GRDH5R MINGW64 /g/tmp/test (master)
$ git log
commit 79ed69f7fdeb3474c36fa111ee82ef067575ad83 (HEAD -> master)
Author: Zhangtao153 <13289265979@163.com>
Date: Wed Nov 25 21:19:27 2020 +0800
bb
commit d40163567818b2ac0b28743058ff9c68a7798390
Author: Zhangtao153 <13289265979@163.com>
Date: Wed Nov 25 21:19:03 2020 +0800
aa
Administrator@WIN-DTNF3GRDH5R MINGW64 /g/tmp/test (master)
$ git reset --hard HEAD^
HEAD is now at d401635 aa
Administrator@WIN-DTNF3GRDH5R MINGW64 /g/tmp/test (master)
$ git log
commit d40163567818b2ac0b28743058ff9c68a7798390 (HEAD -> master)
Author: Zhangtao153 <13289265979@163.com>
Date: Wed Nov 25 21:19:03 2020 +0800
aa
Administrator@WIN-DTNF3GRDH5R MINGW64 /g/tmp/test (master)
$ git status
On branch master
nothing to commit, working tree clean
3. reset --soft
保留工作目录和暂存区中未提交的内容,并把重置 HEAD 所带来的新的差异(回滚掉的commit较回滚后最新commit的修改)放进暂存区。
可以使用 Soft Reset 合并「当前节点」与「reset目标节点」之间不具太大意义的 commit 记录,让 commit 演进线图较为清晰点。
【示例】工作区添加新文件后reset
Administrator@WIN-DTNF3GRDH5R MINGW64 /g/tmp/test (master)
$ git log
commit 82ad83fcfcfb366ab7a895053f9b8936aaabf6cf (HEAD -> master)
Author: Zhangtao153 <13289265979@163.com>
Date: Wed Nov 25 21:39:37 2020 +0800
bb
commit d40163567818b2ac0b28743058ff9c68a7798390
Author: Zhangtao153 <13289265979@163.com>
Date: Wed Nov 25 21:19:03 2020 +0800
aa
Administrator@WIN-DTNF3GRDH5R MINGW64 /g/tmp/test (master)
$ git status
On branch master
Untracked files:
(use "git add <file>..." to include in what will be committed)
bb.txt
nothing added to commit but untracked files present (use "git add" to track)
Administrator@WIN-DTNF3GRDH5R MINGW64 /g/tmp/test (master)
$ git reset --soft HEAD^
Administrator@WIN-DTNF3GRDH5R MINGW64 /g/tmp/test (master)
$ git log
commit d40163567818b2ac0b28743058ff9c68a7798390 (HEAD -> master)
Author: Zhangtao153 <13289265979@163.com>
Date: Wed Nov 25 21:19:03 2020 +0800
aa
Administrator@WIN-DTNF3GRDH5R MINGW64 /g/tmp/test (master)
$ git status
On branch master
Changes to be committed:
(use "git restore --staged <file>..." to unstage)
modified: aa.txt
Untracked files:
(use "git add <file>..." to include in what will be committed)
bb.txt
4. reset 不加参数(mixed)
工作区、暂存区未提交的内容以及由 reset 所导致的新差异,都会被放进工作区。简而言之,就是「把所有差异都混合(mixed)放在工作目录中」。
【例】工作区修改后添加到暂存区,在工作区添加新文件后reset
Administrator@WIN-DTNF3GRDH5R MINGW64 /g/tmp/test (master)
$ git status
On branch master
Changes to be committed:
(use "git restore --staged <file>..." to unstage)
modified: aa.txt
Untracked files:
(use "git add <file>..." to include in what will be committed)
bb.txt
Administrator@WIN-DTNF3GRDH5R MINGW64 /g/tmp/test (master)
$ git reset HEAD^
Unstaged changes after reset:
M aa.txt
Administrator@WIN-DTNF3GRDH5R MINGW64 /g/tmp/test (master)
$ git status
On branch master
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git restore <file>..." to discard changes in working directory)
modified: aa.txt
Untracked files:
(use "git add <file>..." to include in what will be committed)
bb.txt
no changes added to commit (use "git add" and/or "git commit -a")