码迷,mamicode.com
首页 > 其他好文 > 详细

每天学点Git -- 笔记(四)

时间:2015-10-13 10:25:12      阅读:216      评论:0      收藏:0      [点我收藏+]

标签:

  现在,我们考虑一种情况,当你修改了文件,但是此时你想撤销它,怎么办?下面,我们用代码试验一下:

  (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 commitgit 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其实是用版本库里的版本替换工作区的版本,无论工作区是修改还是删除,都可以“一键还原”。

 

每天学点Git -- 笔记(四)

标签:

原文地址:http://www.cnblogs.com/pepsimaxin/p/4873611.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!