管理修改
目前你完全掌握了暂存区的概念,接下来,我们讨论一下为什么Git比其他版本控制系统设计得优秀,因为Git跟踪并管理的是修改,而非文件。什么是修改?比如你新增了一行,这就是一个修改,删除了一行,也是一个修改,更改了某些字符,也是一个修改,删了一些又加了一些,也是一个修改,甚至创建一个新文件,也算一个修改。
为什么说Git管理的是修改,而不是文件呢?我们接着实践,第一步,对index.html做一个修改,比如加一行内容,如下:
然后,添加(git add 命令),如下:
接着,再一次修改文件 index.html ,如下:(第二次修改)
再接下来,直接提交(命令:git commit -m <message> ),如下:
那么,提交之后,查看版本库目前的状态(命令 git status),如下:
由图可知,第二次修改并没有被提交,以上的整个操作过程如下:
第一次修改- -> git add - -> 第二次修改 - -> git commit ;
前面讲了,Git管理的是修改,当你用 git add 命令后,在工作区的第一次修改被放入暂存区,准备提交,但是,在工作区的第二次修改并没有放入暂存区,所以,git commit 只负责把暂存区的修改提交了,也就是第一次的修改被提交了,第二次的修改不会被提交。
提交后,用 git diff HEAD -- index.html 命令可以查看工作区和版本库里面最新版本的区别:
由图上可知,第二次修改并没有被提交。
那怎么提交第二次修改呢?
第1:你可以连续接着两次修改后,一并使用命令 git add,再 git commit。如:第一次修改-->第二次修改--> git add --> git commit ;
第2:在第二次修改后,再次使用命令git add ,再 git commit 。如 第一次修改--> git add --> 第二次修改--> git add --> git commit ;
小结:
总而言之:每次修改,都必须要先使用添加命令 git add ,接着使用提交命令 git commit ;
撤销修改
第一种情况:只是修改,没有 git add 。
在紧急的工作中,难免会出现以下的错误,你在 index.html 中 添加了一行,如下:
在你准备提交前,猛然发现了stupid boss可能会让你丢掉这个月的奖金!既然错误发现得很及时,就可以很容易地纠正它。你可以删掉最后一行,手动把文件恢复到上一个版本的状态。 如果用命令 git status 查看一下,如下:
由上图发现,Git会告诉你,在use第二行 git checkout -- <file> 可以在工作区撤销修改;
命令 git checkout -- index.html 意思就是,把index.html文件在工作区的修改全部撤销。这里撤销修改有两种情况:
第1:index.html 文件在工作区修改后,还没有git add 添加到暂存区,现在,撤销修改就回到工作区当时的状态;
第2:index.html 文件在工作区修改后,并且git add添加到暂存区,又作了修改;现在,撤销修改就回到添加到暂存区后的状态。
接下来,看看index.html 的文件内容,如下:
文件内容复原了。
命令git checkout -- file中的--很重要,没有--,就变成了“切换到另一个分支”的命令,在后面分支管理中会再次遇到git checkout命令。
第二种情况:修改后,在 git add 了。
现在假定是凌晨3点,你不但写了一些胡话,还 git add 到暂存区了,如下:(使用命令 cat )
庆幸的是,在 git commit 之前,你发现了这个问题。用git status查看一下,修改只是添加到了暂存区,还没有提交:
由上可知:Git 告诉我们,用命令 git reset HEAD <file> 可以把暂存区的修改撤销掉(unstage),重新放回工作区,如下:
git reset命令既可以回退版本,也可以把暂存区的修改回退到工作区。当我们用HEAD时,表示最新的版本。
再用 git status 查看一下,现在暂存区是干净的,工作区有修改,如下:
由上图发现,Git会告诉你,在use第二行 git checkout -- <file> 可以在工作区撤销修改;
那么现在,撤销了修改,index.html文件 的最后一行没有了, 回到最初的样子;
第三种情况:
现在,假设你不但改错了东西,还从暂存区提交到了版本库,怎么办呢?
操作过程:修改文件 --> git add --> git commit ;
在第五篇有提到 :返回上一次修改的版本 git reset --hard commit-id(版本号) ,可以回退到上一个版本。不过,这是有条件的,就是你还没有把自己的本地版本库推送到远程仓库。
小结:
- 当你改乱了工作区某个文件的内容,想直接撤销工作区修改时,可以使用命令 git checkout -- <file> ;
- 不但改乱了工作区某个文件的内容,还添加到了暂存区时,想撤销修改,操作如下:
分两步:① 先 git reset HEAD <file> ,②接着使用命令 git checkout -- <file> ;
3. 不但改乱了工作区某个文件的内容,还添加到了暂存区时,并且还提交 git commit 了。
想撤销本次提交,只能使用命令 git reset --hard commit-id ,直接回退到上一个版本;前提是没有推送到远程库。
删除文件
在Git中,删除也是一个修改操作,实战一下,先添加一个新文件app.js到Git并且提交,如下:
一般情况下,①可以直接在文件夹下手动删除该文件,② 可以在命令窗口中输入命令 rm 删除,如下:
小提示:先手动删除文件,然后使用 git rm <file> 和 git add <file> 效果是一样的。
这时,Git知道你删除了文件,因此,工作区和版本库就不一致了,git status命令会立刻告诉你哪些文件被删除了(图上)。
现在有两个选择:一是确实要从版本库中删除该文件,那就用命令 git rm 删掉,并且 git commit,如下:
另一个情况是:删错了文件,别忘了,删除也是修改操作,那么既然删错了,那就执行撤销操作,如下:
$ git checkout -- app2.js
命令 git checkout -- <file> ,无论工作区是修改还是删除,都可以“一键还原”。
小结:
命令git rm用于删除一个文件。如果一个文件已经被提交到版本库,那么你永远不用担心误删, 但是要小心,你只能恢复文件到最新版本,你会丢失最近一次提交后你修改的内容。
转自:https://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000 ;