Git代码管理

2016-04-27  本文已影响922人  Mr_不靠谱_先森

Git做为一个资源管理和跟踪系统,如果想要把自己的文件托管在Git上,那么首先你得让Git知道你需要管理的文件在哪。比如说现在我有一个项目,它在test文件夹里,我想让Git管理这个项目,这个时候你需进入到这个目录,然后运行“git init”命令。这个时候Git就会在该目录下生成一个.git的隐藏目录,Git用来进行版本控制和内容跟踪的所有文件都在该文件夹下。
处于git跟踪下的文件只具有三种状态:

Git是分布式的版本控制系统,它没有中心服务器的概念(虽然实际开发中可以建一个中心服务器),每一台开发机器上都保存完整的历史记录;但是它有本地代码仓库和远程代码仓库的概念(不然怎么多人协作?),而且可以追踪多个远程仓库;
Git能够非常快地建立分支和合并分支,并具有强大的跟踪分支和切换分支的能力。

Git的关键词:working directory; repository; stage; commit; remote; branch; merge   
每一个项目都应该有一个工作目录(Working directory),我们可以自己建一个目录,然后把这个目录里面的代码用Git管理起来(使用git init命令和git add命令),也可以通过git clone命令从别的地方克隆一个项目过来自动生成一个工作目录。在工作目录中的文件就是当前编辑和修改的文件,如果是新建立的目录或新clone来的目录,工作目录中的文件就是该项目最新的状态。Git是在本地保存有所有的历史记录和分支记录的,这些内容都在工作目录的.git目录中,称之为本地仓库(local repository)。当切换分支或查看以前的历史版本时,工作目录中的文件自动改变(这才是重点,工作无需切换目录,目录中的文件会自动切换)。工作目录中的文件有三种状态:已修改、已暂存(stage)、已提交。修改后的文件可以先加入暂存区域,一次工作结束后一起提交。

Git是分布式的,没有中心服务器的概念

但实际工作中仍然可以把代码仓库放到一台大家都可以访问的服务器上,做实际的中心服务器使用(仅在小团队时使用此工作流程,原因后面详述)。在本地机器上工作完后,使用git push命令把仓库推送到服务器上,换一个地方换一台机器后,只需要git clone一下,又可以获得所有的代码(包含所有的历史记录及分支)继续工作。服务器故障也没问题,因为每一个工作的机器上都保存有完整的代码仓库,所以从不用担心代码丢失。没有网络也没有关系,在本地机器上照样可以提交(git commit),因为整个仓库就在自己的机器上,当有网络时,push一下就可以了。
Git有远程仓库(remote repository)的概念,而且可以管理很多个远程仓库,远程仓库可以是服务器,也可以是别人的个人计算机(但一般没有人这么用),每一个远程仓库都有一个简短的名字和一个地址,最开始clone代码的那个远程仓库别名往往默认为origin,自己添加的远程仓库可以随意指定别名,当然所有的远程仓库都可以随意修改别名。可以从远程仓库获取代码(git fetch 命令或 git pull命令),也可以把自己的代码推送到远程仓库(git push命令,需要写权限)。
既然Git即可以随便从远程仓库获取代码,又可以把自己的代码推送到远程仓库,那么当多人协作时,岂不会乱套吗?解决这个问题的,就是Git的必杀之技——创建分支及分支合并。下面要用图表来说明问题了。下面一系列图片来自Git官方网站上的电子书《Pro Git》。

首先,随着一次次的提交,在本地代码库中形成一个主分支,如下图:
有时为了开发新特性,随时可以开一个新分支,如下图:
新分支和主分支之间可以随意切换,随着分支的发展,形式如下图:
主分支也可以向前发展,如下:
最终,当新分支代码很稳定以后,可以将其合并到主分支,如下图:
而能够防止多人协作时出现混乱的关键就在于,当从远程仓库clone代码库到本地或fetch代码库到本地时,远程分支的标记并不等于本地分支的标记。从远程clone一个代码库到本地后,其master分支有两个标记,一个标记为origin/master表示远程库中的master分支,一个标记为master,表示本地的master分支。如下图:
可以想象,由于别人的工作,远程仓库中的master分支肯定会向前继续移动,但是在下次联网之前,该origin/master标记不会移动。而本地的master标记继续向前移动。
直到下次联网,使用git fetch命令将远程仓库的内容取回本地,origin/master标记才会改变位置,这时,看起来就像是两个分支,如下图:
最后,将origin/master分支合并到master分支中(使用get merge命令),本地代码库又一次变成了一个单一的master分支,继续向前开发,并可以将它push到远程仓库,供别人使用。
  Git冲突的处理完全靠人工完成。(从逻辑上讲,机器也不可能完美处理冲突。)比如一个小型团队一起工作,他们可以设置一个服务器用于保存远程Git仓库,然后每个人工作之前先从该远程仓库fetch代码,接着工作,工作完成后,先在本地提交,最后push到远程仓库。但是当一个人push的时候,已经有人在他之前push了,如果他们工作在同一个分支,就会出现冲突。解决冲突的办法就是先把别人push的内容再次fetch下来,合并分支,然后再push。

  通过之前对git原理的了解,可以分析得出使用Git时有以下几种工作流程:

上一篇 下一篇

猜你喜欢

热点阅读