给我一杯忘情水,换我一生不流泪
撤销操作
版本回退
有时我们进行了错误的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 |