标签:
现在,我们考虑一种情况,当你修改了文件,但是此时你想撤销它,怎么办?下面,我们用代码试验一下:
(1)在readme.txt中添加新的一行:
$ cat readme.txt Git is a distributed version control system. Git is free software distributed under the GPL. Git has a mutable index called stage. Git tracks changes of files. My stupid boss still prefers SVN.
(2)“My stupid boss still prefers SVN.” 是个不明智的选择,我们其实可以对它进行撤销操作:
$ 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")
(3)我们可以发现,git checkout -- <file>...可以丢弃工作区的修改,代码:
$ git checkout -- readme.txt
这里必须注意两种情况:
一种是readme.txt
自修改后还没有被放到暂存区,现在,撤销修改就回到和版本库一模一样的状态;
一种是readme.txt
已经添加到暂存区后,又作了修改,现在,撤销修改就回到添加到暂存区后的状态。
总而言之,就是让这个文件回到最近一次git commit
或git add
时的状态。
(4)现在我们来看看,是否是这么一回事:
$ cat readme.txt Git is a distributed version control system. Git is free software distributed under the GPL. Git has a mutable index called stage. Git tracks changes of files.
事实是,它恢复了之前的内容。
(5)对于git checked -- file 这个命令需要特别注意的是:如果不加“ -- ”,那么 git checked 就变成 “切换到另一个分支” 的命令。
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
上面我们考虑了,当你写了一句不该说的话,但是在add前你发现了问题,然后进行了撤销,那么如果你一激动add了,怎么办?
$ cat readme.txt Git is a distributed version control system. Git is free software distributed under the GPL. Git has a mutable index called stage. Git tracks changes of files. My stupid boss still prefers SVN. $ git add readme.txt
此时,我们git status一下,查看一下此时的情况:
$ git status # On branch master # Changes to be committed: # (use "git reset HEAD <file>..." to unstage) # # modified: readme.txt #
此时,我们没法通过git checked -- readme.txt进行撤销了,那此时怎么办?办法还是有的,Git是很强大的!
Git同样告诉我们,用命令git reset HEAD file
可以把暂存区的修改撤销掉(unstage),重新放回工作区:
$ git reset HEAD readme.txt
Unstaged changes after reset:
M readme.txt
这里我们就可以看到git reset有两种功能:(1)回退版本;(2)把暂存区的修改回退到工作区;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")
OK,现在的修改是工作区的修改,下一步怎么做?当然是撤销工作区的修改啦?工作区怎么修改?还需要我教你吗?
$ git checkout -- readme.txt
$ git status
# On branch master
nothing to commit (working directory clean)
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
好了,没有add、add了,我们都分析了,那么假设你add了,又commit了?还记得之前的贴子里讲到的版本回退吗?我们可以回到上一个版本。
当然,如果你commit了,还把本地版本库推送到了远程版本库,ok,我也救不了你了。(Git是分布式操作系统,何为远程版本库,后面的帖子再讲解)
---------------------------------------------------------------------------------------------------小结-------------------------------------------------------------------------------------------------------------
场景1:当你改乱了工作区某个文件的内容,想直接丢弃工作区的修改时,用命令git checkout -- file
。
场景2:当你不但改乱了工作区某个文件的内容,还添加到了暂存区时,想丢弃修改,分两步,第一步用命令git reset HEAD file
,就回到了场景1,第二步按场景1操作。
场景3:已经提交了不合适的修改到版本库时,想要撤销本次提交,参考Git学习笔记(二),不过前提是没有推送到远程库。
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
最后,我们再来看看删除,删除也是修改操作。我们通过代码实战一下:
$ git add test.txt $ git commit -m "add test.txt" [master 94cdc44] add test.txt 1 file changed, 1 insertion(+) create mode 100644 test.txt
如果要执行删除操作,我们可以直接在文件管理器中删除它,或者使用如下命令:
$ rm test.txt
此时,工作区和版本区就不一致了,git status会告诉我们哪些文件被删除了:
$ git status # On branch master # Changes not staged for commit: # (use "git add/rm <file>..." to update what will be committed) # (use "git checkout -- <file>..." to discard changes in working directory) # # deleted: test.txt # no changes added to commit (use "git add" and/or "git commit -a")
现在,我们有两个选择:
(1)确定从版本库中删除此文件,那么就命令git rm删掉,然后git commit:
$ git rm test.txt rm ‘test.txt‘ $ git commit -m "remove test.txt" [master d17efd8] remove test.txt 1 file changed, 1 deletion(-) delete mode 100644 test.txt
(2)另一种情况是删错了,因为版本库里还有呢,所以可以很轻松地把误删的文件恢复到最新版本:
$ git checkout -- test.txt
git checkout
其实是用版本库里的版本替换工作区的版本,无论工作区是修改还是删除,都可以“一键还原”。
标签:
原文地址:http://www.cnblogs.com/pepsimaxin/p/4873611.html