工作区和暂存区
git与其他版本控制系统的一个不同之处就是git有暂存区的概念
工作区就是我们创建的目录,比如说我们之前创建的gitdemo目录就是一个工作区
版本库: 工作区中有一个隐藏目录.git,这个目录不叫工作区,他是版本库,git的版本库中存了很多东西,其中最重要的就是称为stage或者(index)的 暂存区,还有Git为我们创建的第一个分支master,以及指向master的一个指针HEAD
前面讲了我们将一个文件提交到git仓库需要两步:
第一步:使用git add将文件添加进去,这一步实际上就是先将文件修改添加进暂存区;
第二步:使用git commit进行提交,这一步实际上就是把暂存区的所有内容全部提交到当前分支。
因为我们在创建git仓库的时候,git自动为我们创建了一个唯一分支master,所以,git commit就是往master分支上提交更改。
可以简单的理解为,需要修改的文件添加到暂存区,然后一次性提交暂存区的所有修改。
我们来实际操作一下看看情况:
1、修改README.txt文件,然后创建一个新的文件LICENSE
2、使用git status查看一下仓库状态
可以清楚地看到,README.txt文件被修改了,而LICENSE文件还没有被添加过,所以他的状态是Untracked。
3、现在使用git add命令将两个文件添加,然后再使用git status 命令查看状态。
现在暂存区的状态就变成这样了:
所以,git add就是把所有的修改都添加到暂存区,然后通过git commit将暂存区的修改全部提交到master分支
git commit -m ‘understand how index works’
现在版本库就变成了下面这样,暂存区的内容全部提交到了master分支
管理修改和撤销修改
管理修改
Git之所以比其他版本控制系统优秀,是因为Git管理和跟踪的并不是文件,而是修改,什么是修改,你在文件中添加一行内容删除一行内容,或者新创建一个文件,这些都叫作修改,为什么说Git管理的是修改呢,我们来以实际操作说明
1、我们修改README.txt文件,添加一行内容,然后执行git add将其添加
2、使用git add添加后,我们再次修改README.txt文件,再添加一行内容
3、第二次修改后不进行git add添加,直接使用git commit进行提交
4、查看仓库状态,发现第二次修改并没有被提交
为什么会这样呢,我们回顾一下操作过程:
第一次修改–>git add–>第二次修改–>git commit
我们之前说过,Git管理和跟踪的是修改,就是说git commit提交的是添加到暂存区中的所有修改,第一次修改后使用git add将修改添加到了暂存区,第二次修改之后,没有将修改添加到暂存区,因此再执行git commit后,git只能找到第一次的修改,因此就只能提交第一次的修改。
提交后,我们可以使用git diff HEAD – README.txt查看当前版本库中的文件和当前工作区文件的区别
确实没有提交,我们可以再进行git add 然后git commit。也可以之前就先别着急commit 先将两次修改都add后再进行commit。
撤销修改
一般情况下,我们是不会出现错误的,但是在有些特殊情况下我们修改了文件,但是又不想这样修改了,幸运的是我们发现的及时,直接进入文件将修改的地方删除就行了,还可以这样来,在修改后,使用git status查看状态可以看到,git提示我们可以使用git checkout – file来丢弃工作区的修改
git checkout – README.txt
这个命令的意思就是,把文件README.txt在工作区的修改全部撤销,注意,只是在工作区的修改,因此就分为两种情况:
第一种:在工作区修改后还为提交到暂存区,使用这个命令就可以直接回到最初的状态;
第二种:在工作区修改后使用了git add添加到了暂存区,然后在工作区中又进行了修改,此时,使用这个命令,就是将第二次的修改撤销,会带git add之后的状态。
总之就是让这个文件回到最近一次commit或者add的状态。
执行这个命令后我们在来看看文件内容:
可以看到,之前所做的修改确实被撤销了。
git checkout – file中的–非常重要,没有–,就变成了切换到另外一条分支的命令。后面再说。
下面先来说说如果在工作区做了修改之后,将修改添加到了暂存区,这样的话该怎样撤销呢,庆幸的是,还没有提交就好,只是添加到了暂存区的话,还是有办法撤销的,我们来实践一下:
1、修改README.txt文件内容,添加一行,然后使用git add将修改添加到暂存区
2、使用git status查看状态,就会看到提示,使用git reset HEAD file将暂存区的修改撤销
git reset可以回退版本,也可以撤销暂存区的修改,当我们使用HEAD时,表示最新的版本。
我们现在使用git status查看仓库状态,可以看到已经撤回到了添加到暂存区之前的状态,现在暂存区是干净的
接下来,我们在使用git checkout – README.txt将工作区的修改撤销,就可以回到最初的版本了
最后,如果你的修改不但添加到了暂存区,而且已经提交到master分支,这种情况我们可以使用版本回退,回退到之前的版本,只要你的修改没有推送到远程仓库,一切就还有救!!!
删除文件
在Git中,删除操作也是一种修改,我们来实际操作一下:
1、新建一个文件,添加并提交
一般情况下,你要删除一个文件,要么使用文件管理器,要么使用rm命令删除
这种情况下,Git知道你删除了文件,因此,现在,工作区和版本库就不一致了,git status会立刻告诉你哪些文件被删除了:
现在有两个选择,一是你确定要从版本库中删除这个文件,那就用git rm file命令删除,并且commit提交
还有一种,就是你将文件误删除了,现在想将它还原回来,因为它只是从工作区被删除了,版本库里面还有,因此我们可以轻松的将其恢复到最新版本,记住,只能是最新版本,就是说,还原后,你将会丢失掉最后一次commit后修改的内容。
使用git checkout – test.txt还原
总结一下
工作区与暂存区
1、Git中的工作区就是你版本库所在的那个目录;
2、版本库就是在工作区中进行git init之后,出现的.git目录,里面包含着被称为stage或(index)的暂存区
以及指向当前分支的HEAD指针,还有Git为我们创建的第一个分支,master分支。
3、暂存区就是在新建或者修改完成一个文件后,使用git add将修改添加到的区域,此时修改还未被提交到版本库
管理修改与撤销修改
1、在我们第一次对一个工作区的文件修改并使用git add添加到暂存区后,再去对这个文件进行修改但是
没有将修改添加到暂存区,然后直接使用git commit进行提交,这样的话,最终版本库中的该文件内容与
工作区中该文件的内容是不一样的,版本库中的文件中并没有第二次的修改,这种情况我们可以再次进
行git add 然后重新再提交一次,也可以再之前第二次修改之后就使用git add然后与第一次添加的修改一
同使用git commit提交;
2、撤销修改,当我们修改了工作区的一个文件后,有突然不想要这次的修改了,除了进入文件删除之前
的修改。我们还可以使用git checkout -- filename来撤销之前的修改,--是覆盖checkout切换分支的功
能,如果我们已经将修改添加到了暂存区,我们可以使用git reset HEAD filename来撤销之前的git add操
作,回到执行git add之前,然后再使用git checkout -- filename来彻底撤销修改,如果我们已经将修改使
用git commit提交了,这时,可以使用版本回退来回退到之前的版本。
删除文件
1、当我们不需要一个文件的时候,可以使用rm命令将其删除,这个删除只是将工作区的这个文件删除
了,但是之前提交到版本库中的还在,要想彻底删除的话,需要再工作区使用git rm filename删除之后,
再使用git commit进行提交才能彻底删除,其实就跟刚刚创建文件一样,先创建,然后再commit才能到
版本库;
2、如果是再工作区中将文件误删除了,要想将其恢复,这个在Git中是很简单的,因为我们只是在工作
区中删除了,版本库中还有,我们可以轻松的将其恢复,使用git checkout -- filename。但是这样的话,
如果你在这个文件最后一次commit之后做了修改,那么修改的内容将会消失。