给我一杯忘情水,换我一生不流泪
撤销操作
版本回退
有时我们进行了错误的commit
,但是还未push
到远程分支,可以使用git reset
撤销commit。git reset
命令用于回退版本或某一个特定文件,其参数如下:
--soft
:回退到某个版本,只回退commit
信息,但是--hard
:
1 | git reset --soft HEAD~1 # 回退所有内容到上一个版本 |
现在我们以实际的例子展示一下soft和hard的区别,假设我们有一个仓库,当前commit
为efc793226d,然后添加了一个test.txt文件,再次commit
,现在使用git log
得到的版本信息如下:
1 | git log |
假设我们不想要这次操作了,需要回退到上一个版本,如果执行软回退命令git reset --soft HEAD~1
,那么结果如下:
1 | git status |
可以看到我们提交的commit
已经被撤回了,但是已经add
的文件还在,我们可以再次进行commit
,重新提交,得到结果如下:
1 | git log |
现在我们进行hard
回退,回退完后结果如下:
1 | asus@LAPTOP-961FE4JM MINGW64 /f/Code/Projects/GitTest (master) |
可以看到此时的状态是nothing to commit
,而查看我们的本地代码仓,发现test1.txt
也没了,所以hard
指令会撤销工作区中所有未提交的修改内容,并将暂存区和工作区同时回退至前面的版本,删除信息提交。这个命令很危险,谨慎使用。
恢复操作
版本恢复
以上面的版本回退过程为例,假如我们执行了git reset --hard HEAD~1
回到了以前的分支,而现在需要恢复到现在的分支,同样地,我们可以使用reset
进行操作,首先我们需要查看对应的操作记录:
1 | git reflog |
在上面的例子中,我们的操作记录如下:
1 | git reflog |
reflog
不是记录commit
号,而是记录了几乎所有的操作,因此我们可以很方便地进行回退,我们需要回到最后一次reset
之前的commit
,即HEAD@{1}
,那么只需要reset
到对应的commit
号即可:
1 | git reset c3a154a |
回退之后再看一下git status
,发现虽然commit
回退了,但是我们的本地文件并没有恢复,而且这个删掉的文件也作为了一个需要提交的修改,这也说明使用--hard
是非常危险的,即使commit
能回退,工作区中的内容也无法恢复。
1 | git status |