Git是一款强大的版本控制工具,与svn相比git的分布式提交,本地仓库等在使用时确实比较方便。固然二者之间各有优劣,我在这里很少作比较。因为以前少有接触git,只是零星大体地了解一点,因此找时间系统地看了下廖老师的git入门教程。廖老师git入门教程:https://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000。html
做为学习记录,我会跳过git的安装介绍等,也不会系统地挨个介绍使用的git命令。如下主要包括:git
* git仓库(Git仓库的介绍)分布式
* git本地仓库操做的执行过程(add,commit, diff,reset)svn
* 总结工具
1. Git的本地仓库学习
其实就是版本库(repository),直观了解就是本身文件系统中的一个目录,这个目录里的文件能够被git工具管理,目录里文件的增删改都能被Git追踪到。spa
如下就是在git_learn目录下使用init命令建立的一个本地Git仓库,初始建立时,仓库是空的,须要add并commit才能让Git追踪仓库目录下的文件。3d
2. Git本地仓库的构成版本控制
当上面在空文件夹下执行 git init 命令后,咱们说在当前目录下的Git仓库就建立好了,那建立好的Git仓库究竟是什么样呢,除了多了一个隐藏的.git 文件目录,彷佛什么也没有。其实,初始化成功后咱们的当前目录已经被分红了两个部分,一个是工做区,另外一个就是版本库。所谓工做区就是咱们能在这个目录下操做文件,进行工做,好比写代码啊T_T。版本库就是那个生成的.git目录了,里面主要包括暂存区(index指向)和版本区(HEAD指向,这个“”版本区“”只是我我的的叫法)。版本区就是放分支的地方,里面会有Git为咱们建立的第一个分支,名为master。这里的index和head能够理解为指针的做用。下图就是仓库建立后的样子。指针
1. 操做流程
工做区的文件咱们是能够任意添加修改的,修改的文件须要从工做区经过add命令添加到暂存区,再从暂存区commit到版本区。咱们也能够从从仓库checkout文件到工做区,操做关系以下图:
2 .Git的add与commit
在工做区建立文件file.txt并将改文件提交到Git本地仓库,整个过程执行以下:
两步,add 和commit就将file.txt文件的第一个版本加入了git仓库,看看其过程:
工做区建立file.txt第一个版本,这时git仓库并无追踪到这个文件。
将file.txt添加到暂存区(index指向),这时暂存区的文件和工做区同步。
最后将暂存区的提交到版本区(HEAD指向),这时版本区会自动生成这次提交的版本号,这时file文件已经被git仓库追踪到。
以上操做都是在初始生成的master分支上完成,每次提交成功后HEAD都会指向版本区中当前分支的最新版本,这里使用master分支提交,因此HEAD指向master分支的当前最新版本,目前只有一个版本(master分支只有一个提交,每次提交造成一个版本,并生成惟一版本号),若是存在多个分支,切换分支时,HEAD就会指向切换到的分支的最新版本。存在分支存在多个版本(屡次提交)会造成相似链表的结构。因此在当前仓库版本区(只有master分支,且只有一个提交)具体来讲应该是这样的:
如今编辑file.txt文件,添加一行,造成v2版本(v1是新建的空文件),再执行add和commit,咱们依然是在master分支上提交的,这时候file.txt就应该有两个版本了,且是在master分支上,HEAD应该指向的是master的最新分支。
git仓库中的版本区,master分支上存在两个版本,HEAD指向master分支的最新版本:
3. Git的版本重置 reset
git的版本能够向前向后移动,如同指向双向链表中的某个节点的指针同样。这里的指针其实就是HEAD,执行reset命令其实就是移动HEAD指向分支上的另外一个版本(每一次提交都会造成一个版本)。
例如,我在file.txt中又有修改而且造成了v3版本,如今我想要将file.txt文件回退到上一次提交(v2版本),可使用 git reset HEAD~1 ,前面说过,每次提交都有版本号,能够经过log和reflog查看提交的版本号,使用git reset 9e5e6a4,来将HEAD从新指向到v2版本。版本号挺长的,但不用写完通常写前面几个就够了。但这是分支上的v3版本依然存在(如同移动指向链表节点的指针,链表节点依然在).
在master分支上回退一次的操做应该是这样:
能够看到,在版本区,HEAD的指向已经指向了master分支的v2版本上,前面说到,git仓库里除了版本区还有暂存区(index指向)和工做区(咱们能看到的并工做的目录中)是什么样子呢?
这里reset 有三个可选参数:git reset [--soft | mixed | hard]
git reset --soft HEAD~1:
soft参数,因为提交了v3版本,在执行reset命令以前,暂存区(index)和工做区应该都是v3版本,执行git reset --soft HEAD~1 以后,暂存区和工做区依然是v3版本,简单来讲咱们再工做目录看到的依然是v3的内容,只是仓库里的版本区当前版本已经指向了v2.
git reset --mixed HEAD~1:
mixed参数,这个参数是默认参数。分红两个步骤,首先将HEAD指向改变,再将暂存区(index)与HEAD指向的当前版本同步(到v2版本),工做区依然不变(保留v3版本)。
git reset --hard HEAD~1:
hard参数,改变HEAD指向,而且将暂存区与工做区所有同步到v2版本,这个时候咱们咱们能够经过文件直接看到v3版本新添加的内容不见了,回到了v2版本。
固然,咱们虽然到了v2版本,那咱们依然能够经过reset命令到v3版本,一样的道理。
这里关于reset命令的操做过程我只是简要描述了一下,这里有一篇很是好的讲解,很详细:https://www.cnblogs.com/kidsitcn/p/4513297.html
4.git 的diff命令
比较区别,弄清楚git仓库的组成部分就很容易想到比较啦。反正就是这样:
git diff : 工做区与暂存区比较
git diff --cached : 暂存区与HEAD指向版本比较
git diff HEAD : 工做区与HEAD指向版本直接比较
git diff 版本号1 版本号2 : 比较两个版本号对应版本版本的不一样
Git仓库主要包括三部分:工做区,暂存区,版本区。 咱们对文件的操做是在工做区进行,完成修改后先要将修改内容添加到暂存区,而后再提交到版本区造成一个版本。至于为何git要设置一个暂存区这样一个中间层,想到一句话调侃的话:没有什么问题是添加一个中间层解决不了的,如有,那就添加两层。想一想,若是咱们一次要修改的东西太多,我想每写一点东西就先存起来可是又不想让它造成一个版本提交(由于没写完啊,提交的时候须要些commit comment的),那就写一点就提交到暂存区诺,写完后再一次commit。或者正在开心的写着代码,写着一半忽然须要切换到另外一个分支去修复bug,那就将当前工做内容放到暂存区,而后利用stash功能将暂存区内容打包存起来,等修复完bug再回来恢复继续。另外就是git的status功能,这个功能比较简单,主要显示就是当前仓库的状态,是否有内容须要add到暂存区,是都有暂存的内容须要commit到版本区等等。