Git的使用教程(六)管理修改
2016-02-16 11:01
375 查看
Git比其他版本控制工具优秀的地方就在于Git跟踪并管理的是“修改”,而非文件。
什么是修改?新增一行是修改,删除一行也是修改,只要让文件变得跟原来不一样就是修改。
如何证明Git管理的是修改而非文件?下图就充分说明了这一点。
具体操作过程:第一次修改README.md——>git add——>第二次修改README.md——>git commit。如果Git管理的是文件,那么二次修改操作都会被提交到版本库,而事实上,只有添加到暂存区的第一次修改操作才被提交,第二次操作由于没有加入到暂存区,所以未被提交。
撤销修改
在“工作区和暂存区”一文中,提到了暂存区的两个优点,一个是“多次修改一次提交”,另一个是可以”撤销修改“,接下来我们就来看下Git是如何撤销修改的。
状况一:git add之前
还记得刚才的操作吗,第二次修改的内容还没有被git add到暂存区中,此时我们又想了下,觉得这次修改没有必要,想要撤销,我们可以使用git checkout -- file
其实系统对于如何撤销修改早有提示,当我们新增或者修改了一个文件在添加到暂存区之前,我们使用git status命令的时候,系统便会提示我们,是要git add(添加到暂存区)还是git checkout -- <file>(丢弃工作区的修改)。
状况二:git add之后,git commit之前
刚才的情况是修改并未添加到暂存区,如果修改不小心增加到了暂存区,还能撤销吗?答案是肯定的,能。相比于之前,我们需要多一步操作,那就是把修改首先撤出暂存区。
撤出了暂存区并没有撤销该修改,我们需要重复”git add之前“之前的操作,使用git checkout -- file来完全撤销该修改。
删除文件
日常工作当中除了新增,修改操作,删除操作也必不可少。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之后你的文件就再也找不回来,进入了版本库,你就不用担心该文件找不回来,但是只能找回最后一次入库的信息,最后一次入库到现在所进行的修改将会全部丢失。
什么是修改?新增一行是修改,删除一行也是修改,只要让文件变得跟原来不一样就是修改。
如何证明Git管理的是修改而非文件?下图就充分说明了这一点。
具体操作过程:第一次修改README.md——>git add——>第二次修改README.md——>git commit。如果Git管理的是文件,那么二次修改操作都会被提交到版本库,而事实上,只有添加到暂存区的第一次修改操作才被提交,第二次操作由于没有加入到暂存区,所以未被提交。
撤销修改
在“工作区和暂存区”一文中,提到了暂存区的两个优点,一个是“多次修改一次提交”,另一个是可以”撤销修改“,接下来我们就来看下Git是如何撤销修改的。
状况一:git add之前
还记得刚才的操作吗,第二次修改的内容还没有被git add到暂存区中,此时我们又想了下,觉得这次修改没有必要,想要撤销,我们可以使用git checkout -- file
git checkout -- README.md
其实系统对于如何撤销修改早有提示,当我们新增或者修改了一个文件在添加到暂存区之前,我们使用git status命令的时候,系统便会提示我们,是要git add(添加到暂存区)还是git checkout -- <file>(丢弃工作区的修改)。
状况二:git add之后,git commit之前
刚才的情况是修改并未添加到暂存区,如果修改不小心增加到了暂存区,还能撤销吗?答案是肯定的,能。相比于之前,我们需要多一步操作,那就是把修改首先撤出暂存区。
git reset HEAD README.md
撤出了暂存区并没有撤销该修改,我们需要重复”git add之前“之前的操作,使用git checkout -- file来完全撤销该修改。
删除文件
日常工作当中除了新增,修改操作,删除操作也必不可少。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之后你的文件就再也找不回来,进入了版本库,你就不用担心该文件找不回来,但是只能找回最后一次入库的信息,最后一次入库到现在所进行的修改将会全部丢失。
相关文章推荐
- RPC failed; result=22, HTTP code = 411
- git更新已經刪除的文件
- 提取Git每次提交后Commit的文件
- GIT迁移服务器
- 分布式版本管理git入门指南使用资料汇总及文章推荐
- git终极指南:在实际开发中的应用
- Git远程操作详解
- 25个 Git 进阶技巧(翻译)
- 详解版本控制利器Git,SVN的异同以及适用范围
- Ruby实现的删除已经合并的git分支脚本分享
- 在 Shell 提示符中显示 Git 分支名称的方法
- Git使用基础篇(一些常用命令和原理)
- git fork同步是什么意思?
- Git使用小坑 Out of memory错误的解决方法
- Python的高级Git库 Gittle
- 使用GIT进行源码管理――GUI客户端小结
- 使用git代替FTP部署代码到服务器的例子
- linux系统安装git及git常用命令
- 分享下自己总结的Git常用命令
- Git 常用命令速查表(图文+表格)