Git 是一个分布式版本控制系统。分布式的意思是,每个人电脑上都是一份完整的代码库,包含了所有的代码提交历史。由于 Git 分布式的特点,在没有网络的情况下,依然可以自由地将代码提交的本地的代码库中,等网络恢复后再推送到服务器,开发更加灵活和自由。
重要概念:本地一个代码库,对本地文件的所有操作,最后都是提交到这个代码库中。同时可以设置多个远程(remote,默认的remote通常用origin表示),当你要将代码更新到服务器上时(称作push),就通过设置的remote,更新到指定的服务器。
关于多个remote:例如其他公司的开发人员,在自己的公司中开发代码,将默认remote设置为公司自己的源码管理服务器,同时设置另外一个remote为移动的源码服务器。这样即可以将代码提交到自己公司的服务器,同时也可以提交到移动的服务器。
总之就一句话:git是一个分布式版本控制系统。每个人自己的本地库就相当于一个完整的SVN服务器。
SVN是这样工作的
Git是这样工作的:
每个开发者都拥有一个git仓库,每个git仓库都相当于一台完整的svn服务器,开发者只需提交版本记录到自己本地库中。有需要时向远程仓库进行推送。
Gitlab 是 Git 服务端的集成管理平台,提供了:
1. 代码托管服务
2. 访问权限控制
3. 问题跟踪,bug的记录、跟踪和讨论
4. Wiki,项目中一些相关的说明和文档
5. 代码审查,可以查看、评论代码
SourceTree只是Git系统的一个管理工具,百度百科的定义是这样的:SourceTree 是 Windows 和Mac OS X 下免费的 Git 和 Hg 客户端管理工具,同时也是Mercurial和Subversion版本控制系统工具。支持创建、克隆、提交、push、pull 和合并等操作。
SourceTree拥有一个精美简洁的界面,大大简化了开发者与代码库之间的Git操作方式,这对于那些不熟悉Git命令的开发者来说非常实用。
认识了三款工具的不同,现在开始我们的工作。
我们使用Git进行版本管理,使用GitLab对我们的代码进行托管。每个开发者从上游仓库(GitLab)获取到最新的代码,形成自己的本地仓库。一般,我们从develop分支形成自己的分支,比如我从远程的develop分支检出本地分支dev_jwx,我的开发工作和bugfix就基于我的dev_jwx分支进行(我甚至可以把本地分支dev_jex命名为develop,和远程分支一样的名称),当远程develop分支有版本变动时会通知我有哪些变动,我根据自己的实际需要可以选择是否更新这些变动。当我的开发工作完成后,我会把本地的dev_jwx分支推送到GitLab上。如果我希望我GitLab上的工作被纳入正式工作,那么我会发起一个Merge Request,请求把我的最新修改并入正式工作中。我们的工作流程可以用这样的一张图来说明:
有一点值得说明的是,请注意黄色线应该从GitLab中央仓库节点开始。当前分支的工作结束后我们应该发起Merge Request,在发起Merge Request时我们应该先从GitLab中央仓库的develop分支拉取更新(pull)代码,这期间可能出现冲突,我们必需先解决冲突然后把Pull成功的代码Push到我们的GitLab开发者分支,然后再发起Marge Request。
无论是在SourceTree上还是在Eclipse上,我们的工作都应当是先从GitLab里创建自己的分支。检出对应分支到自己本地之后就可以开始我们的工作,进行完一些工作我们需要推送当前任务到我们的GitLab分支,因为最终的成果是从我们的GitLab分支合并到GitLab中央仓库的develop分支的,当然,只有在完成当前分支的需求或当前分支的某个阶段性成果后我们才会去请求把我们的GitLab分支合并进GitLab中央仓库的develop分支。请记得,在我们请求合并我们的开发者分支之前,先从develop分支拉取最新的代码以保证我们工作不是徒劳的。
我们应现在GitLab上创建自己的分支,自己的分支是基于develop分支而来。
注意命名及上游分支的选取
在SourceTree上,把GitLab上的分支检出到本地。
工作中的一般推送我们可以直接点击推送菜单,选择推送到自己的开发者分支即可。
如果其他同事有在你的分支上进行工作,请自行拉取同步代码,解决冲突之后提交、推送到自己分支。
当前分支工作结束后我们希望上游仓库接受我们的工作成果,就需要在GitLab上发起Merge Request。此时GitLab中央仓库的develop可能已经发了一些版本的迭代,我们先推送本地最新代码到我们的GitLab分支,然后检出最新的develop分支到本地,把develop分支合并进我们的开发分支(可能会有冲突,需要解决冲突),之后推送到我们的GitLab开发者分支就可以发起合并请求了。
可以看出,develop分支已经比我的dev_jiawenxiao分支快了几个版本
可以看到,我的dev_jiawenxiao分支已经与develop保持了同步
注意分支命名和父分支
File-->Import-->Git-->Projectsfrom Git-->Clone URI
在这里,我们所做的操作和SourceTree上是一样的。可以回顾下3.3节中的说明以加深理解。
现在回头再看看,我们的所有操作都是基于这张图的:
合并操作是最有可能出现问题的部分,很大可能都是冲突造成的,请耐心解决冲突后合并。