Git 菜鸟变大神 (三) 工作区、暂存区、版本库之间的关系案例
区分三者关系
Git最让你迷惑的无非是它里面的各种概念了,如果是刚开始接触Git希望看完本篇介绍之后有一个清晰的认识,笔者认识也有限这里只说说个人对使用Git的感受,说一下它里面的几个最常用的概念的理解。
在初始化git版本库之后会生成一个隐藏的文件 .git ,可以将该文件理解为git的版本库 repository,而我们自己建立的项目文件夹即工作区 working directory ,在.git 文件夹里面还有很多文件,其中有一个index 文件 就是暂存区也可以叫做 stage ,git还为我们自动生成了一个分支master以及指向该分支的指针head ,如下图
从图中可以看出来respository包括分支master和stage, working diretory 可以理解为我们打开开发环境如eclipse,里面的内容即工作区的内容,在工作区里面有的代码以及配置文件等我们需要提交到版本库里面,最终是到了分支master上面,暂存区只是一个临时保存修改文件的地方。
实例讲解
平时我们使用的命令git add file1 是把文件从工作区提交到暂存区,git commit -m "prompty" file1 是把文件从暂存区提交到了分支master下面,这里因为只有一个分支master,就提交到master上了,下面让我们再来结合具体例子来说明一下。
我们修改一下tgb.txt文件增加一行 "l love you" ,并新建一个文件 test1.txt,现在还没有执行git add命令,这种修改都还停留在工作区内,用git status查看状态,如图
上图表明修改并没有在暂存区里面,当我们执行git add test1.txt ,git add tgb.txt后,再来看一下状态
这两个文件被添加到了暂存区,但是还没有提交,当执行git commit -m "tijiao" 后文件即从暂存区到了master分支上面,如图将看不到暂存区里面有什么内容。
Git管理的是添加到暂存区里面的修改,包括增删改等等都算是可以跟踪的文件变动,也可以说git只管理我们变动的部分变动的我们才往暂存区提交,这也是git比其他版本系统设计优秀的一点,以后,会详细说一下各个版本系统管理文件是如何管理的,他们的设计思想是什么。
通过三个命令理解
下面还有一个需要注意的git diff 命令的差异:
git diff 比较的是工作区和暂存区的差别
git diff --cached 比较的是暂存区和版本库的差别
git diff HEAD 可以查看工作区和版本库的差别
通过一个添加文件既可以明显看出他们之间区别,不过这里有一个前提是已经提交到暂存区的文件修改的时候才可以看出明显区别,这也是以为啥git只能跟着提交到暂存区的文件,如果只是在工作区新建一个文件,那么输入这三个命令都没有结果为空白。
我们继续修改tgb.txt,在文件末尾添加 we are good boy.
分别输入三个命令,效果为:
从图中可以看出,工作区与暂存区、工作区与版本库都有变化,而版本库与暂存区并没有变化。进一步执行git add tgb.txt
执行git add tgb.txt之后发现git diff没有输出内容,表明工作区与暂存区已经同步,暂存区与版本库、版本库与工作区没有同步。最后一步执行git commit
当执行完git commit后,三个命令都没有输出结果,表明我们修改的文件已经被同步的版本库,已经被版本库管理起来了。
总结:
版本库管理文件会很方便尤其是代码,等好多的命令熟了之后也会觉得并不是那么难用,主要使用的时候觉得git反应比较快,而且速度还可以,现在很多人都在window开发而喜欢具有界面的版本工具软件,而不去学习git命令,学习一些git 命令还是很有用的,假如让你去linux上面开发或者在linux系统上面管理代码,你就会完全束手无策不懂原理也不懂命令,需要从新学习从新认识git。
可以说各种命令是git的根本,学习了命令无论哪一个界面管理工作一看也就会了,现在有好多的git可视化工具,不如学几个命令,况且再多的界面底层也是调用这么多的命令来实现的,有了界面就让我们变懒了,降低了开发者的水平,提高开发效率的同时也失去了更多的学习、研究机会。