工作区【磁盘】
关于GIt,当你在工作区也就是硬盘中修改文件内容,也就是下图的状态。
若你需要撤销此次修改,用到的命令就是
git checkout <changed_file>
git restore <changed_file> #推荐
因为checkout在分支中也是切换分支的意思,所以这边更推荐使用restore
这样就撤销本地修改成功了
暂存区【add之后】
当文件已经被add后上传到暂存区后,也就是如下情况
我们可以使用如下命令来撤销上传,而不修改本地文件
git reset <changed file>/<index>
git resort --staged <changed file>/<index>
其中index是你每次add生成的索引,可以通过索引来回到索引对应的文件状态,用log来查看索引
local git区【commit之后】
当你将代码进行add后再进行commit,就上传到了local git区域,这时候也使用git reset来进行撤销。而这撤销又分为这三种模式
git reset --soft #回退版本并且保留工作区和暂存区
git reset --hard # 回退版本并且放弃所有工作区和暂存区
git reset --mixed # 回退版本保留工作区,放弃暂存区 【默认使用】
注意谨慎使用hard,虽然git所有命令都能撤销,但是hard会删除你工作区也就是本地修改的文件,这样子如果后悔了要找回还是有些麻烦的
git revert
git revert 和 git reset的区别:
git revert是用一次新的commit来回滚之前的commit,git reset是直接删除指定的commit。
git相当于执行一个反向命令,比如我增加了一个file1,现在我不要了那就可以进行revert或reset来进行撤销,但是当时又需要file1,那么如果你使用reset命令就傻眼了,如果我们使用的是revert,则再执行一次就变成的增加file1命令了,每次执行revert命令的流程是:增加file1->删除file1->增加file1。下面来进行演示一下。
这里进行了file1和file2的两次上传,现在我们要将file1撤销,之后再添加回来,file2不进行修改
这时我们发现file1本地已经被撤销了,但是我们查看index还是能找到file1的上传记录,revert的其中一个优点就是可以保留上传记录。
这时我们通过revert后的revert索引来进行revert,就发现file1又在本地恢复了,并且自动上传了。