一. 关于Git

    什么是版本?软件时不时弹出让你更新到几点几点几的提示,那几点几点几就是一个个的版本,也就是不同的内容就是不同的版本;什么是版本控制?就是对各种版本无论修改前还是修改后的管理;什么是集中式版本控制?就是对于版本的管理控制集中于一个中央服务器,每次要改动版本都需要将版本从服务器那里拿过来,完事后在传送过去,也就是说必须联网;什么是分布式版本控制?就是对于版本的控制管理可以自给自足,也可以相互之间进行传递,因为本身自己就是一个管理库;

wKioL1dh7pGhL8iNAAAuBCI9bw0268.png

    Git就是一个分布式版本控制系统,由Linux开源创始人Linus编写而成,起初是为了保管Linux源代码用C语言编写而成的,但是由于其免费方便强大等优势迅速成为了各业界技术爱好者托管源代码的一个很棒的平台,而GitHub是免费为开源项目提供Git存储的一个网站,用户注册一个账号就能将本地的Git交给远程GitHub仓库来保存了,只要有网,随时随地可以从远程端获取或者推送自己的文件数据,这样就更加凸显了安全高效的优势。


二. Git管理过程

    首先要说明的是,Git既然是一个版本控制系统,那么其管理的就不单单是一个个的文件那么简单了,Git跟踪并管理的是修改,也就是对于一个文件的增删查改,Git都能够给记录下来,并且还方便恢复,这样一来就不会有将一个文件改的面目全非而不知道谁是谁的问题了。



    对于用户可见的一个目录也就是一个仓库而言,就是用户的工作区;Git版本库里本身维护了一个暂存区stage(或者叫index),而用户在工作区编辑好文件想要提交给Git管理需要进行两步,首先要先将想要提交的文件交给Git,称为添加,终端下使用git add命令,这个步骤就是将文件从工作区拷贝添加进暂存区,之后再进行提交,git commit命令,而提交才是将文件从暂存区放到Git分支中(分支的概念下面会讨论);

    为什么要分为两步?就不能一次放好么?这是因为有可能一次要git add很多文件到暂存区,而提交命令git commit则是一次性将add到暂存区的文件都放到分支中;这就好比要将散落在各处的物件放到收纳箱中,一次性将要收纳的物件都收集拿到再放入收纳箱,显然要比一个一个地拿起再放进收纳箱要简便高效些;

    既然GitHub提供了远程库来进行Git存储,那么也就同样可以将本地的文件推送至远程库,当然,在这之前首先需要将自身的本地Git和远程库也就是用户的GitHub关联起来,由于GitHub使用SSH协议Secure Shell,也就是安全外壳协议,它是建立在应用层和运输层基础上的安全协议,专为远程登录会话和其他网络服务提供安全性的协议,可有效防止远程管理过程中的信息泄漏问题。因此需要将一个SSH密钥交给GitHub中的SSH配置,这样就可以进行远程库和本地的一个交互了。

wKiom1dh8-TzA4YWAAAZFNW6SJg516.png


    对于文件的删除,在工作区直接使用rm命令就可以将一个文件删除,但这时候工作区就和Git版本库不一样了,如果确实想要删除这个文件,可以使用Git命令git rm filename来进行版本库里对应文件的删除,但这时候还是需要再进行一次提交以确保工作区和版本库的一致;而如果是不小心在工作区误删了文件,只要这个文件被提交到Git分支管理过,使用git checkout —— filename命令仍然是可以从版本库中恢复到工作区的,git checkout —— filename命令其实是用版本库里的版本替换工作区的版本;

wKioL1diCV2xPa27AABXux_zjdI967.png


    这里不得不再次说明,Git作为一个分布式版本控制系统,用户的每一次增删查改都会产生不同的版本也就是都会被管理记录;因此,这里的查询可以被看做是查询每一次的改动或者查询每一次不同的版本,使用git log命令就可以查看由近到远每一次提交的情况,而这个查看,主要是在当前分支的日志情况;

    对于Git来说可以关联远端的GitHub远程库来交由其管理本地的文件,同样,当本地文件数据丢失或者需要他人协作完成某项作业的时候,可以从GitHub的远程库中将所需要的文件给clone到本地,完成后再同步推送至远端管理;着同样也可以看做是一种查询机制;因为Git本身就是具有开源精神的平台,任何人都可以上传数据同样也可以被任何人看到或者拿到;

wKiom1diFO7A5yrjAABj1KZY-78262.png



    如果用户对当前版本并不满意,还是觉得上一个版本比较好,想要改回原来的版本怎么办呢?

  1. 如果只是在当前工作区做了修改但还没有提交,可以使用git check —— filename命令,该命令上面提到过,其实也就是将工作区的修改全部撤销,如果添加到暂存区后又做了修改,该命令可以恢复到添加到暂存区后的状态;

  2. 如果已经将文件git add添加到了暂存区但是还没有提交到分支,可以使用git reset HEAD filename来将暂存区的修改会退到工作区,然后再使用上述命令;

  3. 如果已经将文件添加并且提交到了本地分支版本库管理,就可以使用版本回退git reset ——hard 版本号 来使版本回退到上一次的版本,不过前提是没有提交到远程库;

  4. 如果提交并且同步到了远程库,那就没办法了,GitHub已经都给保存下来了;

wKioL1diMeWRwJJJAAASredy2D8675.png

    既然Git管理了一系列改动的各种版本,并且上面说到可以使用查看日志来查询到以往所有的改动,那么就可以使用git reset命令来进行版本回退,而回退之后还想要在恢复会退前的版本,同样也是支持的,这是因为Git内部有一个指向当前版本的HEAD指针,在当前分支上修改的所有版本可以看做都按照先后顺序排列在了一条分支上,而HEAD指针就指向的是一个个版本,当进行版本改动的时候,其实仅仅是移动了HEAD指针;而使用git log来查询日志的时候,其实就是从HEAD指向的版本开始罗列;那么既然是这样,想要恢复到哪一个版本,其实只要知道每个版本的版本号就可以了;

wKioL1diMfji7pHGAAAxgPCMVvw341.png


  • Git分支

    分支是Git中一个强大的地方,当创建出一个仓库的时候,默认是有一个master,可以被称为主干,每一次的版本提交其实就是将各种版本依次沿着这条master主干排放,分支的作用是什么呢?如果你想修改文件的某一小块内容,但是又担心其不合适只是想试试水怕影响文件主体内容,这样的话就可以创建一个分支出来,刚创建的分支和主干一毛一样,只是在分支上的修改提交并不会影响主干,如果觉得修改内容合适,可以将当前分支和主干进行合并,如果真的是不合适完全可以删除分支而一点也不影响主干;这种模式完全可以胜任多人合作或者多模块多任务的作业,也就是可以创建多个分支在分支上完成某一模块的任务,完成之后就可以合并成一个,这样的话不仅提高了效率还具有安全性;

    其实每一次提交的版本,不仅有一个HEAD指针,还有一个master指针,而master指针是才是主干上指向当前版本的指针,HEAD指针是指向master的,每一次新添一个版本,master指针就会往前移动一个,同样的HEAD指针也会跟着移动;当创建出一个分支比如dev,其实也就会有一个dev的指针和master一样,随着分支中版本的添加和更改移动,而HEAD指向哪个分支的指针,就表示当前在哪个分支和版本上;

wKioL1diORGi14lhAAAQmho8_qw595.png对于分支的合并,其实是使用了快速合并的方法,也就是直接将master指针指向dev的当前版本就OK了,至于切换到哪个分支,每次的添加提交就在那个分支上,后来在合并就成了一条主干了,至于HEAD永远都是指向当前工作分支的当前版本。


如上操作具体命令请参照http://2627lounuo.blog.51cto.com/10696599/1790022


如有不妥当的地方,请多指教。

《完》