假设场景一:
你修改了readme.txt文件,但是过一会儿想到修改的信息有误,或者不想修改了。那么此时怎么办呢?当然因为你已经:wq!
了,所以别想着command + z
来撤销。
例如我先在新的readme.txt文件中新增一行:
$ cat readme.txt
无关风月oo
$ cat readme.txt
无关风月oo //此处为原有内容,已commit;
场景一的撤销修改测试 //此处为新增内容;
先来查看一下状态,readme.txt的状态:
$ git status
On branch master
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
modified: readme.txt
no changes added to commit (use "git add" and/or "git commit -a")
其实我们可以看到git有提示我们git checkout -- file
命令撤销对工作区中的改变;
命令git checkout -- readme.txt
意思就是,把readme.txt文件在工作区的改变(增删改)全部撤销,这里有两种情况:
- 1.对修改后未
git add
的文件撤销修改,恢复到与当前版本库一样的状态; - 2.对``git add```到暂存区后又再次修改过的文件撤销修改,此时会恢复到刚加进暂存区到状态;
$ git checkout -- readme.txt
再来看看readme.txt文件的内容呢:
$ cat readme.txt
无关风月oo
另外需要注意:git checkout -- file
命令中的--
很重要,没有--,就变成了“切换到另一个分支”的命令,我们在后面的分支管理中会再次遇到git checkout
命令。
假设场景二:
你修改了文件,并且使用git add
命令将文件提交到了暂存区。你又后悔了!怎么做呢?
我们先来修改提交一下:
cat readme.txt
无关风月oo
场景二的撤销修改测试
$ git add readme.txt
$ git status
On branch master
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
modified: readme.txt
注意(论英文的重要性),git又提示我们,使用git reset HEAD file
可以把暂存区的修改撤销掉(unstage),重新放回工作区:
$ git reset HEAD readme.txt
Unstaged changes after reset:
M readme.txt
git reset
命令既可以回退版本,也可以把暂存区的修改回退到工作区。当我们用HEAD时,表示最新的版本。
再用git status
查看一下,现在暂存区是干净的,工作区有修改:
$ git status
On branch master
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
modified: readme.txt
no changes added to commit (use "git add" and/or "git commit -a")
再次强调,这里只是把修改由暂存区回退到工作区,工作区的还没恢复呢:
$ cat readme.txt
无关风月oo
场景二的撤销修改测试
我们前面学了如何将工作区的修改撤销掉不是吗,那么问题又解决了。
$ git checkout -- readme.txt
$ cat readme.txt
无关风月oo
是不是好玩又简单。
假设场景三
你修改了内容,不但git add
到了暂存区,还熟练使用了git commit -m "xxx"
。你慌了吧!
但是,git还是有办法帮助你。还记得之前学习过的Git详细教程(二)版本回退吗?不过这是有条件地,就是你还没有把自己的本地版本库推送到远程。还记得Git是分布式版本控制系统吗?我们后面会讲到远程版本库,一旦你把修改的提交推送到远程版本库,你就真的惨了……
总结
场景1:当你改乱了工作区某个文件的内容,想直接丢弃工作区的修改时,用命令git checkout -- file
。
场景2:当你不但改乱了工作区某个文件的内容,还添加到了暂存区时,想丢弃修改,分两步,第一步用命令git reset HEAD file
,就回到了场景1,第二步按场景1操作。
场景3:已经提交了不合适的修改到版本库时,想要撤销本次提交,参考Git详细教程(二)版本回退,不过前提是没有推送到远程库。