从放弃svn到拥抱git之路
基础概念
GIT是一种版本控制软件,那就首先了解一下什么是 “版本控制”?
比较官方的解释是,版本控制系统是一种记录一个或若干个内容变化,以便将来查询特定版本修订情况的系统。
简言之,你的修改只要提到到版本控制系统,基本都可以找回,版本控制系统就像一台时光机器,可以让你回到任何一个时间点。
了解了版本控制系统的功能,我们知道就算你把代码改的一塌糊涂,照样可以恢复到我们过去的任何一个时间点,工作量却微乎其微。是不是很amazing。
总结一下版本控制系统有哪些优点:
- 记录文件所有历史变化。这是版本控制系统的基本能力;
- 随时恢复到任意时间点。历史记录功能使我们不怕改错代码了;
- 支持多功能并行开发。通常版本控制系统都支持分支,保证了并行开发的可行;
- 多人协作并行开发。对于多人协作项目,支持多人协作开发的版本管理将事半功倍;
常见管理版本控制工具
SVN(Subversion)
SVN是曾经最流行的版本管理系统,很多人都有用过,因而对于集中式版本控制系统很多人都很了解它。
优点:
- 适合多人团队协作开发
- 代码集中化管理
缺点:
- 单点故障
- 必须联网,无法单机工作
- 创建分支成本高
优点就不多说了,大家可能对缺点更是记忆深刻。
单点故障,集中式管理的缺点,代码集中在一台机器上,这个问题其实可以通过备份集 群解决;
必须联网工作,这个缺点我是深入痛觉,一旦公司网络出现问题,几个小时甚至一天无法工作的经历都有。由于这些缺点,便有了Git(分布版本控制系统)。
创建分支成本高,分支以文档形式表现,对于程序员来说想要切换分支简直就是灾难
Git
想知道GIT有多流行吗?看看GITHUB就知道了,现在很多公司都已经把自己的代码库迁移到了GIT。可见GIT在如今的流行程度,也说明了分布式版本控制系统是如今的趋势。
关于Git,这里只说优点
- 适合多人团队协作开发
- 代码集中化管理
- 可以离线工作
- 每个计算机都是一个完整仓库
1、2两点SVN也可以做到,说一下3、4点
可以离线工作,分布式版本管理系统每个计算机都有一个完整的仓库,可本地提交,可以做到离线工作。没有了SVN令人抓狂的断网无法工作问题;
每个计算机都是一个完整的仓库,也就没有了SVN的单点故障;
GIT与SVN的比较
1 | 1. GIT是分布式的,SVN为集中式的 |
1 | 2. GIT随处都是版本库,SVN只有一个中央版本库 |
1 | 3. GIT没有全局版本号,SVN有全局版本号 |
1 | 4. GIT把内容按元数据存储,SVN按文件存储 |
1 | 5. GIT记录文件快照,SVN记录文件差异 |
1 | 6. GIT的内容完整性高,SVN完整性低 |
GIT架构
GIT的架构,可以分为几个部分:
- 本地工作区(working directory)
- 暂存区(stage area, 又称为索引区, index)
- 本地仓库(local repository)
- 远程仓库副本
- 远程仓库(remote repository)
如下图:
上图展示了git的整体架构,以及各个部分相关的主要命令。
具体命令大家可以根据这个网址learngitbranching自行去操作理解Git的相关命令。
GIT在团队中的实际使用
搭建gitlab私有化仓库
网上有很多搭建gitlab服务器的教程,比如手把手教你搭建gitlab服务器,按照步骤搭建自己的gitlab服务器。
gitlab上的相关操作
新建project
命令行指令
- Git global setup
1
2git config --global user.name "xx"
git config --global user.email "xxxxxx@xx.com" - Create a new repository
1
2
3
4
5
6git clone git@ip:user/xxx.git
cd xxx
touch README.md
git add README.md
git commit -m "add README"
git push -u origin master - Existing folder
1
2
3
4
5
6cd existing_folder
git init
git remote add origin git@ip:user/xxx.git
git add .
git commit -m "Initial commit"
git push -u origin master - Existing Git repository
1
2
3
4
5cd existing_repo
git remote rename origin old-origin
git remote add origin git@ip:user/xxx.git
git push -u origin --all
git push -u origin --tags
- Git global setup
本地开发 (以下以具体项目:tp6 做演示)
bash进入项目tp6根目录
新建 test、dev分支 (test、dev命名看个人习惯)
1
2git checkout -b test
git checkout -b dev
创建分支就这么简单,比svn优雅很多。
test分支作为测试仓库,保持和master仓库代码一致。
dev分支作为开发仓库,由开发人员自行控制。团队协同
开发人员
1
2
3通过git checkout dev 切换到本地dev分支.比如目前在开发一个用户登录的
功能模块,则在dev分支的基础上 新建一个feature-xxx分支做开发,开发完成
后merge到dev分支下图完整的描述了git分支的命名规范以及开发流程
测试人员
1
2
3
4测试人员主要在测试服务器上首先测试相关功能分支。
待版本功能分支全部功能测试完毕后
通知开发人员merge到test分支进行整体测试。
整体测试通过后通知开发人员将test分支merge到master分支技术经理/CTO
1
2技术经理/CTO主要负责生产服务器中项目master分支的pull操作,
具体操作命令为 git pull 将gitlab上master最新的代码拉到生产服务器中
最后
本文档从版本控制引出分布式版本控制,比较分布式版本控制系统与其他版本控制系统的区别,从而引入GIT。
与SVN的比较明显可看出GIT的优秀之处。对GIT的架构也进行整体简单介绍。内容比较理论,期望在理清自己思路的同时,不会误导他人。
文中如有错误,请帮忙指正!谢谢!
感谢大家能认真阅读这篇文档,万分感谢!