撤销reset提交的几种模式

sun@salted:git2 (zxvbnm) $ git logls
c3d0a48 (HEAD -> zxvbnm, master, cat) first commit
sun@salted:git2 (zxvbnm) $ git status
位于分支 zxvbnm
无文件要提交,干净的工作区
sun@salted:git2 (zxvbnm) $ vim b.c
sun@salted:git2 (zxvbnm) $ git add b.c
sun@salted:git2 (zxvbnm) $ git commit -m "create b.c"
[zxvbnm 716d221] create b.c
 1 file changed, 2 insertions(+)
 create mode 100644 b.c
sun@salted:git2 (zxvbnm) $ git statis
git:'statis' 不是一个 git 命令。参见 'git --help'。
sun@salted:git2 (zxvbnm) $ git status
位于分支 zxvbnm
无文件要提交,干净的工作区
sun@salted:git2 (zxvbnm) $ git logls
716d221 (HEAD -> zxvbnm) create b.c
c3d0a48 (master, cat) first commit
sun@salted:git2 (zxvbnm) $ vim c.c
sun@salted:git2 (zxvbnm) $ git add c.c
sun@salted:git2 (zxvbnm) $ git commit -m "c.c
> ^C
sun@salted:git2 (zxvbnm) $ git commit -m "c.c"
[zxvbnm 3088369] c.c
 1 file changed, 2 insertions(+)
 create mode 100644 c.c
sun@salted:git2 (zxvbnm) $ git logls
3088369 (HEAD -> zxvbnm) c.c
716d221 create b.c
c3d0a48 (master, cat) first commit
sun@salted:git2 (zxvbnm) $ git log --oneline --grapg
fatal: 未能识别的参数:--grapg
sun@salted:git2 (zxvbnm) $ git log --oneline --graph
3088369 (HEAD -> zxvbnm) c.c
716d221 create b.c
c3d0a48 (master, cat) first commit
  sun@salted:git2 (zxvbnm) $ git status
  位于分支 zxvbnm
  无文件要提交,干净的工作区
  sun@salted:git2 (zxvbnm) $ touch d.c
  sun@salted:git2 (zxvbnm) $ git add d.c 
  sun@salted:git2 (zxvbnm) $ git status
  位于分支 zxvbnm
  要提交的变更:
  (使用 "git reset HEAD <文件>..." 以取消暂存)
  新文件:   d.c
  sun@salted:git2 (zxvbnm) $ git reset HEAD^ --soft 
sun@salted:git2 (zxvbnm) $ git logls
716d221 (HEAD -> zxvbnm) create b.c
c3d0a48 (master, cat) first commit
  sun@salted:git2 (zxvbnm) $ git status
  位于分支 zxvbnm
  要提交的变更:
  (使用 "git reset HEAD <文件>..." 以取消暂存)
  新文件:   c.c
新文件:   d.c
sun@salted:git2 (zxvbnm) $ ls
a.c  b.c  c.c  d.c
sun@salted:git2 (zxvbnm) $ git commit -m "new c"
[zxvbnm ea29e8a] new c
 2 files changed, 2 insertions(+)
 create mode 100644 c.c
 create mode 100644 d.c
sun@salted:git2 (zxvbnm) $ git reset 716d221 --soft 
sun@salted:git2 (zxvbnm) $ ls
a.c  b.c  c.c  d.c
sun@salted:git2 (zxvbnm) $ git logls
716d221 (HEAD -> zxvbnm) create b.c
c3d0a48 (master, cat) first commit
  sun@salted:git2 (zxvbnm) $ git status 
  位于分支 zxvbnm
  要提交的变更:
  (使用 "git reset HEAD <文件>..." 以取消暂存)
新文件:   c.c
新文件:   d.c
sun@salted:git2 (zxvbnm) $ git commit -m "another new c" 
[zxvbnm fbb61f6] another new c
 2 files changed, 2 insertions(+)
 create mode 100644 c.c
 create mode 100644 d.c
sun@salted:git2 (zxvbnm) $ git reset 716d221 --hard 
HEAD 现在位于 716d221 create b.c
sun@salted:git2 (zxvbnm) $ ll
总用量 16
drwxrwxr-x  3 sun sun 4096 10月 14 13:01 ./
drwxr-xr-x 14 sun sun 4096 10月 13 21:56 ../
-rw-rw-r--  1 sun sun    0 10月 13 15:49 a.c
-rw-rw-r--  1 sun sun   13 10月 14 12:54 b.c
drwxrwxr-x  8 sun sun 4096 10月 14 13:01 .git/
sun@salted:git2 (zxvbnm) $ git status 
位于分支 zxvbnm
无文件要提交,干净的工作区

 

 

强制恢复已被reset的提交

reflog + git reset --hard

 

image-20211014211653256

 

 

将提交视为存档

当下的目录中的文件状态+暂存区内容: 在HEAD存档基础上,正在构建中的下一“存档”(还没有进行提交成为真正的存档)

--hard :完全地切换为某一存档,和某次提交后的状态一模一样

--soft &&默认的mixed :可看做两个操作的组合,

先通过 --hard 完全切换为某个旧的存档;

在旧存档的基础上构建新提交:然后将相对于该存档的修改(包含HEAD之后发生的修改)实际作用在目录及文件上。 暂存区在mixed下被清空,在soft下将所有相对旧存档发生改变的文件加入暂存区,表示下一次要将这些改变进行保存

 

mixed 与 soft 会将旧存档后的所有修改(包括没提交的)作用在reset到的旧存档上

 

image-20211014211602839

hard 会将基于HEAD的修改(包括未提交的)也清除掉,完全地恢复为HEAD提交初始的状态

image-20211014211615083