撤销修改
前一篇博客介绍了版本回退,回退到已经提交的版本。
但是,这里的修改和上一篇的回退概念不一样,修改要分两种情况讨论:
1、只是在工作区(目录)进行了修改,还没有提交至暂存区(也就是要丢弃工作区的
修改)。
2、在工作进行了修改,并且已经提交至暂存区。
下面我们分别讨论这两种情况如何撤销修改:
1、针对第一种情况很好处理:
比如我们在readme.txt
后加了一行I dont like Git
:
$ cat readme.txt
git is a version control tool
git is the most advaced version control system
i learn git now
i think git is better than SVN
i dont like git
这个时候你突然觉得不对,即使不喜欢也不能说出来啊,于是立刻想纠正它。
于是用 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")
发现我们只是在工作区更改了 readme.txt
文件,还没有 add 或者 commit
,Git提示我们可以使用git checkout --<file>--
命令放弃在工作区进行的修改:于是乎,有了下面的一行代码:
$ git checkout -- readme.txt //注意:--与文件名之间有空格
此时再来查看readme.txt
内容:
cat readme.txt
git is a version control tool
git is the most advaced version control system
i learn git now
i think git is better than SVN
解惑:此时可能就会有小伙伴们问:为什么要使用git checkout 命令,
我直接打开readme.txt 手动删掉最后一行不就行了嘛,当然可以。
但是,我们这里只是对一个文件增加了一行,相当于修改了某一处的某一个功能,如果你
在写代码的时候一次性修改(或者添加很多行),你自己都不记得自己改了哪里,怎样
手动恢复呢?而且你手动删除之后还必须要 add 以及 commit 之后版本库中的版本才是
最新版本。
所以使用 git checkout 就解决了你很大的问题
2、已经提交至暂存区怎么办?
Please 记住:Git总是有办法的 !
假如现在已经是晚上九点了,而你还在公司摸鱼,996也该下班了不是,此时心里极其不爽,于是你在readme.txt
文档下写下:cccccccccccccc
:还不小心添加到了暂存区:
$ cat readme.txt
gait is a version control tool
git is the most advaced version control system
i learn git now
i think git is better than SVN
cccccccccc
$ git add readme.txt
突然灵光乍现,你意识到这个问题,顿时心里一万个草泥马飘过,但是你应该庆幸的是还没有commit
,于是你使用git status
查看一下当前的状态:
$ git status
On branch master
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
Git 告诉我们等待着提交(changed to be committed),但是也同时提示你使用命令 git reset HEAD <file>...
可以撤销掉缓存区的修改。于是乎,又是一顿操作:
$ git reset HEAD readme.txt
Unstaged changes after reset:
M 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")
这个时候提示我们没有文件等待着提交( Changes not staged for commit:) , 只是在工作区进行了修改,于是这就回到了第一种情况,还记得上面是什么命令吗?对,git checkout -- <file>
(丢弃工作区的修改)
于是赶紧操作起来:
$ git checkout -- readme.txt
然后查看当前的状态:
$ git status
On branch master
nothing to commit, working tree clean
现在,终于结束了!这就是为自己的行为付出的代价,所以工作和生活上还是要谨言慎行!
小结:
本节课主要讲解了如何撤销修改的操作,分为两种情况:
1、只是在工作区(目录)进行了修改,还没有提交至暂存区(丢弃工作区的修改)git checkout -- <file>
2、在工作进行了修改,并且已经提交至暂存区,分为两步撤销:1)把在暂存区的内容回退到工作区git reset HEAD <file >
;2)丢弃工作区的修改:git checkout -- <file>
参考:
【1】廖雪峰Git教程
【2】Git撤销修改和删除文件