Git比其他版本控制工具优秀的地方就在于Git跟踪并管理的是“修改”,而非文件。
什么是修改?新增一行是修改,删除一行也是修改,只要让文件变得跟原来不一样就是修改。
如何证明Git管理的是修改而非文件?下图就充分说明了这一点。
具体操作过程:第一次修改README.md——>git add——>第二次修改README.md——>git commit。如果Git管理的是文件,那么二次修改操作都会被提交到版本库,而事实上,只有添加到暂存区的第一次修改操作才被提交,第二次操作由于没有加入到暂存区,所以未被提交。
撤销修改
在“工作区和暂存区”一文中,提到了暂存区的两个优点,一个是“多次修改一次提交”,另一个是可以”撤销修改“,接下来我们就来看下Git是如何撤销修改的。
状况一:git add之前
还记得刚才的操作吗,第二次修改的内容还没有被git add到暂存区中,此时我们又想了下,觉得这次修改没有必要,想要撤销,我们可以使用git checkout -- file
- git checkout -- README.md
- git reset HEAD README.md
删除文件
日常工作当中除了新增,修改操作,删除操作也必不可少。Git是如何管理删除操作呢?
当我们删除一个文件的时候,git status查看文件状态的时候,会给你提供两种选择,一种是确认删除,则使用git rm(或者git add),然后git commit。另一种是反悔了,想要找回被删除的文件,此时跟找回修改前的文件一样,使用git checkout -- <file>。首先我们来看下确认删除操作。
确认删除情况比较单一,没那么多讲究,但是找回被删除的文件讲究就有很多了。
背景一:新文件,从未git commit(版本库中没有该文件),以下状况均在此前提下
状况一:文件未被git add
如果你新建了一个文件,还没有被git add,此时如果删除了这个文件,很遗憾,你无法通过git找回该文件。
状况二:文件被git add,未被git rm
如果新建的文件已经被git add过,之后又删除了,此时git status的时候就会看到deleted相关信息,此时的deleted信息还未被git rm,所以只要通过git checkout即可恢复。
状况三:文件被git add,又被git rm
如果新建的文件被git add过,又被git rm过,很遗憾的告诉你,这个文件已经丢失,你无法使用git来恢复了。
背景二:文件被git commit过,版本库中有该文件的信息,以下状况均在此前提下
状况一:文件未被git add
由于版本库中有该文件,即使文件未被git add,删除该文件也能找回来,但是找回的文件是最后一次入库的文件,最后一次入库到现在之间的修改操作都会全部丢失。
状况二:文件被git add,未被git rm
此时是最佳状况,我们不但能够使用git checkout恢复文件,而且能够保持文件的原貌。
状况三:文件被git add,又被git rm
跟状况一类似,虽然仍然可以找回文件,但是只能找回最后一次入库的状态,最后一次入库到现在的修改全部丢失了。
注意事项
1.只有git add到暂存区的修改才会被提交,没有被git add到暂存区的修改不会被提交。
2.git checkout的时候--必须要有,不能少,少了--的git checkout就变成切换分支命令了,撤销命令仅能用于修改未被提交到暂存区的时候使用(即该修改未被git add)。
3.添加到暂存区后,可以使用git reset HEAD file来撤出暂存区,但是此时该修改并没有撤销,仍需要借助git checkout -- file来完全撤销修改操作。
4.进行删除操作的时候一定要小心,如果你的文件没有进入过版本库,那么git rm之后你的文件就再也找不回来,进入了版本库,你就不用担心该文件找不回来,但是只能找回最后一次入库的信息,最后一次入库到现在所进行的修改将会全部丢失。