Git比其他版本控制工具优秀的地方就在于Git跟踪并管理的是“修改”,而非文件。

    什么是修改?新增一行是修改,删除一行也是修改,只要让文件变得跟原来不一样就是修改。

    如何证明Git管理的是修改而非文件?下图就充分说明了这一点。

    具体操作过程:第一次修改README.md——>git add——>第二次修改README.md——>git commit。如果Git管理的是文件,那么二次修改操作都会被提交到版本库,而事实上,只有添加到暂存区的第一次修改操作才被提交,第二次操作由于没有加入到暂存区,所以未被提交。

    Git的使用教程(五)管理修改_工作区

    撤销修改

    在“工作区和暂存区”一文中,提到了暂存区的两个优点,一个是“多次修改一次提交”,另一个是可以”撤销修改“,接下来我们就来看下Git是如何撤销修改的。

    状况一:git add之前

    还记得刚才的操作吗,第二次修改的内容还没有被git add到暂存区中,此时我们又想了下,觉得这次修改没有必要,想要撤销,我们可以使用git checkout -- file

[plain]  view plain  copy
  1. git checkout -- README.md  

Git的使用教程(五)管理修改_工作区_02
    其实系统对于如何撤销修改早有提示,当我们新增或者修改了一个文件在添加到暂存区之前,我们使用git status命令的时候,系统便会提示我们,是要git add(添加到暂存区)还是git checkout -- <file>(丢弃工作区的修改)。
     状况二:git add之后,git commit之前
    刚才的情况是修改并未添加到暂存区,如果修改不小心增加到了暂存区,还能撤销吗?答案是肯定的,能。相比于之前,我们需要多一步操作,那就是把修改首先撤出暂存区。
[plain]  view plain  copy
  1. git reset HEAD README.md  

Git的使用教程(五)管理修改_删除操作_03
   撤出了暂存区并没有撤销该修改,我们需要重复”git add之前“之前的操作,使用git checkout -- file来完全撤销该修改。

    删除文件

    日常工作当中除了新增,修改操作,删除操作也必不可少。Git是如何管理删除操作呢?

     当我们删除一个文件的时候,git status查看文件状态的时候,会给你提供两种选择,一种是确认删除,则使用git rm(或者git add),然后git commit。另一种是反悔了,想要找回被删除的文件,此时跟找回修改前的文件一样,使用git checkout -- <file>。首先我们来看下确认删除操作。

    Git的使用教程(五)管理修改_版本库_04

    确认删除情况比较单一,没那么多讲究,但是找回被删除的文件讲究就有很多了。   

    背景一:新文件,从未git commit(版本库中没有该文件),以下状况均在此前提下

    状况一:文件未被git add

    如果你新建了一个文件,还没有被git add,此时如果删除了这个文件,很遗憾,你无法通过git找回该文件。

    状况二:文件被git add,未被git rm

    如果新建的文件已经被git add过,之后又删除了,此时git status的时候就会看到deleted相关信息,此时的deleted信息还未被git rm,所以只要通过git checkout即可恢复。

    Git的使用教程(五)管理修改_删除操作_05     

    状况三:文件被git add,又被git rm

    如果新建的文件被git add过,又被git rm过,很遗憾的告诉你,这个文件已经丢失,你无法使用git来恢复了。

    Git的使用教程(五)管理修改_版本库_06

    背景二:文件被git commit过,版本库中有该文件的信息,以下状况均在此前提下

    状况一:文件未被git add

    由于版本库中有该文件,即使文件未被git add,删除该文件也能找回来,但是找回的文件是最后一次入库的文件,最后一次入库到现在之间的修改操作都会全部丢失。

    Git的使用教程(五)管理修改_删除操作_07

    状况二:文件被git add,未被git rm

    此时是最佳状况,我们不但能够使用git checkout恢复文件,而且能够保持文件的原貌。

    Git的使用教程(五)管理修改_删除操作_08

    状况三:文件被git add,又被git rm

    跟状况一类似,虽然仍然可以找回文件,但是只能找回最后一次入库的状态,最后一次入库到现在的修改全部丢失了。

Git的使用教程(五)管理修改_工作区_09

     注意事项

    1.只有git add到暂存区的修改才会被提交,没有被git add到暂存区的修改不会被提交。

    2.git checkout的时候--必须要有,不能少,少了--的git checkout就变成切换分支命令了,撤销命令仅能用于修改未被提交到暂存区的时候使用(即该修改未被git add)。

    3.添加到暂存区后,可以使用git reset HEAD file来撤出暂存区,但是此时该修改并没有撤销,仍需要借助git checkout -- file来完全撤销修改操作。

    4.进行删除操作的时候一定要小心,如果你的文件没有进入过版本库,那么git rm之后你的文件就再也找不回来,进入了版本库,你就不用担心该文件找不回来,但是只能找回最后一次入库的信息,最后一次入库到现在所进行的修改将会全部丢失。