2.4 撤销操作
场景一:在工作区乱七八糟改一通想要还原,并没有添加到暂存区。
在写代码的时候,如果没有提前将整个逻辑理清楚就开始修改之前的代码,那么大多数情况是到最后自己都不知道写的啥,这时候就会想要回到自己修改之前的那个版本。
前提是一直在工作区进行修改,并没有添加到暂存区。
解决思路:
在修改之前在分支仓库中进行一次备份
使用 git status 查询状态,如果本地工作区与分支仓库不同步(本地工作区有文件修改了咩有提交),参照 2.2 节先同步;
修改之后,不满意,只需将之前在分支仓库中的(该文件/整个目录)备份取出来替换工作区内容即可。
具体操作:
$ git checkout--
说明:由于这里没有添加到暂存区,所以该指令表示将分支仓库中的(该文件/整个目录)备份取出来替换工作区的内容。
场景二:将工作区修改过内容添加到暂存区后又对工作区文件进行修改想要还原
场景二的标题有点长,拆分一下做了以下几件事情:
对工作区内容 readme.txt 进行修改 —— 状态1;
将修改后的文件 readme.txt 添加到暂存区,此时没有提交到分支仓库 —— 状态2;
再次对工作区内容 readme.txt 进行修改 —— 状态3。
现在想要将状态3撤回到原始状态,我们分析下如何做:
状态3 撤回到状态2
状态2 对 readme.txt 进行修改并添加到暂存区
状态3 对 readme.txt 进行修改并添加到暂存区,再次修改 readme.txt
// $ git checkout-- $ git checkout-- readme.txt
状态2 撤回到状态1
状态1 对 readme.txt 进行修改
状态2 对 readme.txt 进行修改并添加到暂存区
// $ gitresetHEAD$ gitresetHEADreadme.txt
状态1 撤回到 原始状态
原始状态 readme.txt 与分支仓库的备份一毛一样
状态1 对 readme.txt 进行修改
其实到这里已经回到了场景1遇到的情况:只在工作区进行修改,并没有添加到暂存区,如何还原?
// $ git checkout-- $ git checkout-- readme.txt
作者这里已经尽可能的把情况说的简单点,无奈言语显得有点脆弱,还需要自己实践敲一篇试验一下,记住,每次撤回到上一个状态时使用 git status 查看下当前状态。
场景三:在工作区修改了文件,不仅添加到了暂存区,还提交到了分支仓库中,想要还原怎么办
这种情形反而更简单,提交到分支库,将相当于对当前状态做了一个备份放到分支仓库中取代了最新的备份,我们只需要将分支仓库中上一个备份取出来替代工作区内容即可。
详细内容在 2.4 节已经讲解过,这里简要略过。
查看分支仓库版本备份信息
$ git log--pretty=oneline
使用 git reset 指令回到上一个版本
$ gitreset--hard 7e46747
结论
又到了总结时间,本节以实际场景触发,考虑到所有需要撤回的场景,需要多加练习。
场景1:修改了工作区内容没有添加到暂存区撤回操作;
场景2:修改了工作区添加到暂存区又修改了该文件撤回操作(详细介绍三步自操作);
场景3:修改了工作区内容添加到暂存区又提交到分支仓库后撤回操作。