# 关于撤销
根据代码的状态,可以使用git status
查看,有三种情况:
- 本地修改,未git add
- 修改完git add,未git commit
- 修改完git commit
1. 本地修改,未git add
如果在工作区进行了修改(本地文件、文件夹),改动完还没有使用git add命令添加到暂存区的
可以使用git checkout --
命令:
git checkout -- [file]
作用:让这个文件回到最近一次git commit
或git add
时的状态
2. 修改完git add,未git commit
如果在工作区修改完后并使用了git add添加到暂存区。但是还没有使用git commit提交到版本库的
可以使用git reset
命令,该命令不止可以用在版本回退,也可以用来撤销暂存区。用法:
git reset HEAD [file]
作用:把暂存区的修改撤销掉(unstage),重新放回工作区。
其中HEAD指向当前分支最新的提交commit
随后使用git status
查看,其状态与情况1一样,此时可以再使用git checkout --
命令撤销工作区的修改。
另一种情况是要把git add
进暂存区的文件移出暂存区,使其变成未跟踪状态,可以使用git rm
命令。用法:
git rm --cached [file] #移出暂存区
作用:把暂存区的文件移出,使其变成未跟踪状态。
3. 修改完git commit,未git push
如果在工作区做了修改,并且使用了git add 和 git commit提交到了版本库(本地仓库),到这一步进行撤销就是常提到的:版本回退。
由于前面分析了代码可能有多个状态,所以可以根据自己想要保留的代码状态选择回退的方式,可以撤销commit保留到暂存区,也可以保留到工作区,甚至连工作区都一起回退掉。
有三种回退方式:
-
git reset --hard HEAD^
往前回退一个版本,回退完了后工作区就是上一个版本的代码了,并且是clean的。连工作区也一起回退。
-
git reset --soft HEAD^
往前回退一个版本,并且将这次错误的提交的代码改动,放在暂存区里。回退到git commit之前,修改保留到git add。
-
git reset --mixed HEAD^ #(和不带参数是一样的)
往前回退一个版本,并且将这次错误的提交的代码改动,放在工作区里。回退到git add之前,修改保留在工作区。
eg
在某次commit后发现有个文件的宏没有打开,需要做简单的修改。
使用git reset --soft HEAD^
将这次commit撤销,并且把commit的内容保留到git add时的状态,也就是暂存区。如下图:
可以看到使用回退命令前有2次commit,使用完变成了1次commit,说明撤销掉了一次。
并且在回退前使用git status
查看代码状态时,暂存区的内容是空的。回退后暂存区多了一堆绿色的modified文件,说明撤销的内容保留在了暂存区,也就是git add时的状态。
关于查看各个阶段代码的改动详情可以查看这篇文章6. Git进阶之撤销与修改(点击跳转)的后半部分。