源代码管理工具
为啥需要源代码管理? 我自己写代码多爽,别人要,就用QQ传过去好了。
0. 为什么要对源代码进行管理
源代码管理(SCM)用于跟踪对源代码存储库的修改。SCM跟踪代码库更改的运行历史,并帮助解决合并来自多个参与者的更新时的冲突。随着软件项目在代码行和贡献者人数方面的增长,通信开销和管理复杂性的成本也在增长。供应链管理是一个关键的工具,以减轻日益增长的开发成本带来的组织压力。
无论您是自己编写简单的应用程序,还是与团队成员协作完成大型软件开发项目,源代码控制都是开发过程中的重要组成部分。借助源代码管理系统,您可以跟踪代码更改、查看代码的修订历史记录,并在需要时恢复到项目的之前版本。使用源代码管理系统,您可以与团队一起协作编写代码,在准备就绪之前隔离您的工作,并通过识别谁做出了更改以及做出了哪些更改来快速解决问题。源代码管理系统可帮助简化开发流程,并为所有代码提供集中式源代码。
软件工程的质量要靠软件工具和软件流程来保证, 大家看过正在建设中的高楼, 半完工的楼顶上矗立着巨大的塔吊。这个塔吊不是用户需求的一部分 ,但是,这是建筑工程上不可缺少的环节,那么怎么把塔吊顺利地安装上,随着楼房的增高而增高,让塔吊高质量地工作,怎么做安全检查,防止它倒下来? 这就是工程的要求。
软件工程中,也有类似脚手架,塔吊这样的工程系统,工具和流程。 软件的源代码管理工具,加上构建系统, 能保证一个复杂软件能在多个角色,多个团队的合作下,按时以合适的质量发布。 如果你写一个Hello World 程序, 当然不需要这些工具, 就像你用儿童积木搭房子过家家,你自己高兴,但这不是建筑工程。
1. 常用的源代码管理工具
1.1 SVN
SVN是subversion的缩写,是一个开放源代码的版本控制系统,通过采用分支管理系统的高效管理,简而言之就是用于多个人共同开发同一个项目,实现共享资源,实现最终集中式的管理。
SVN 的一些概念
- repository(源代码库): 源代码统一存放的地方
- Checkout(提取): 当你手上没有源代码的时候,你需要从repository checkout一份
- Commit(提交): 当你已经修改了代码,你就需要Commit到repository
- Update (更新): 当你已经Checkout了一份源代码, Update一下你就可以和Repository上的源代码同步,你手上的代码就会有最新的变更
1.2 Git
Git 是用于 Linux内核工具。与常用的版本控制工具 CVS, Subversion 等不同,它采用了分布式版本库的方式,不必服务器端软件支持,使源代码的发布和交流极其方便。 Git 的速度很快,这对于诸如 Linux kernel 这样的大项目来说自然很重要。 Git 最为出色的是它的合并跟踪(merge tracing)能力。
Git 常用的是以下 6 个命令:git clone、git push、git add 、git commit、git checkout、git pull
- workspace:工作区
- staging area:暂存区/缓存区
- local repository:版本库或本地仓库
- remote repository:远程仓库
1.3 选择Git还是SVN
平台特点 | SVN(集中式) | Git(分布式) |
---|---|---|
是否有中央服务器 | 有。开发人员需要从中央服务器获得最新版本的项目然后在本地开发,开发完推送给中央服务器。因此脱离服务器开发者是几乎无法工作的 | 没有中央服务器,开发人员本地都有 Local Repository |
网络依赖 | 必须要联网才能工作,而且对网络的依赖性较强,如果推送的文件比较大而且网络状况欠佳,则提交文件的速度会受到很大的限制。 | 分布式在没有网络的情况下也可以执行commit、查看版本提交记录、以及分支操作,在有网络的情况下执行 push 到 Remote Repository。 |
文件存储格式 | 按照原始文件存储,体积较大 | 按照元数据方式存储,体积很小 |
是否有版本号 | 有 | 没有 |
分支操作的影响 | 创建新的分支则所有的人都会拥有和你一样的分支 | 分支操作不会影响其他开发人员 |
提交 | 提交的文件会直接记录到中央版本库 | 提交是本地操作,需要执行push操作才会到主要版本库 |
当研发成本比较低,协作开发人数不多,开发人员对于版本管理的水平参差不齐的时候,或者对于代码的安全性要求更高一点的时候,适合用svn。
而对于很多人参与开发,代码量比较大,或者高频次协作,跨公司,跨地域合作的情况下,更适合用git。
2. 常用的源代码管理平台
除了源代码管理工具,我们还需要使用源代码管理平台。这样才能让不同的团队成员在不同的地方能够访问到源代码仓库,也能够对源代码进行统一的管理。
这个源代码管理平台,也就是上一部分中提到的remote repository
GitHub是git存储库和协作项目开发的首选网站。该系统旨在允许用户轻松创建基于Git的特殊版本控制系统。为什么这么受欢迎?Git通过非线性开发历史的可视化工具和导航工具的帮助,支持流畅的版本合并和分割。现在,GitHub拥有5000多万个开源项目。
GitHub本身属于Microsoft产品
GitHub的服务不是完全免费的,如果想要享受GitHub提供的所有功能,需要付费。
大小限制:文件大小不能超过100Mb,存储库可以托管信息1Gb。
免费,这意味着用户可以拥有无限数量的私有存储库。当然为了满足客户要求,GitLab也有企业版,在其基本功能之上增加了一些额外的功能,从而改善了与在线工具,工作流和服务器管理等的交互。
GitLab在开源许可证下运行。
可以自行在内网搭建GitLab服务器
BitBucket服务也非常类似于GitHub,但是它的大部分功能也略有不同。BitBucket最适合小型开发团队,随着团队的成长,BitBucket提供了与GitHub和GitLab相比更温和的定价条件。BitBucket还为团队提供了灵活的部署模式
不开源
Bitbucket是Atlassian产品,如果使用Atlassian的其他产品,可以和Bitbucket关联
Gitee 是开源中国推出的基于 Git的代码托管服务。目前已经有注册开发者 600 万,托管超过 1500 万代码仓库。
中国大陆地区的Git平台,可以在普通的互联网环境下快速使用
也可以使用Gitee从不同的Git平台(例如GitHub)建立Git repository镜像
3. 项目小组示例
3.1 确定成员权限
在你的项目设置中,可以设置access,在这里你可以通过邮件和ID邀请你的团队成员加入本项目,这样他们就有对应的权限来对repository进行控制。也可以为不同的项目成员分配不同的权限来完成不同的工作。
例如develop和code review。
需要提醒的一点是,有时候即使成员拥有push的权限,也不要直接在项目的主repository中进行push,最好的方式是让成员fork出自己的repository,在此进行feature的开发或debug。再提出一个pull request,由项目中进行code review的成员进行审核,在进行单元测试后符合预期再merge进项目repository中。
3.2 确定分支模式
最常见的模式是master-dev分支模式,项目stable的代码放在master分支中,由不同的项目组成员维护自己负责的部分的branch和fork。
在项目的git repository中,master分支用来管理已经被验证为stable的代码,正在开发的代码可以被储存到dev分支中。dev分支可以用多个,分别用来管理不同模块的开发代码。
不同的颜色表示由不同的开发者提交的代码,每个/每组开发者负责维护一个branch
3.3 开发流程
一般工作流程如下:
- 克隆 Git 资源作为工作目录。
- 在克隆的资源上添加或修改文件。
- 如果其他人修改了,你可以更新资源。
- 在提交前查看修改。
- 提交修改。
- 在修改完成后,如果发现错误,可以撤回提交并再次修改并提交。
现在就可以把你的项目成员加入到你的Git repository中开始你们的项目开发了。
3.4 关于issue
在软件开发过程中,开发者们为了跟踪BUG及进行软件相关讨论,进而方便管理,创建了Issue。管理Issue的系统称为BTS(Bug Tracking System,Bug跟踪系统)。当今具有代表性的BTS有Redmine、Trac、BugZilla等。
GitHub自身也加入了BTS的功能。在GitHub上,可以将它作为软件开发者之间的交流工具,多多加以利用。遇到下面几种情况时,各位就可以使用这个功能。
- 发现软件的BUG并报告
- 有事想向作者询问、探讨
- 事先列出今后准备实施的任务
现在,很多大公司的软件研发团队协作,都是通过 JIRA 来实现的。
目前也流行很多非代码的团队协作,比如 teambition、Worktile、trello 等。
其实,GitHub 的 issue ,就是一个轻量级协作系统。它的 comment 支持 GitHub Flavored Markdown,可以进行内容丰富的交流。Git 本身就是分布式的代码版本控制软件,是为了程序员的协作而设计的。而 issue 的 Assignee 功能,就是这个在线协作系统的核心,足以让一群线上的开发者,一起完成一个软件项目。
4. 写在最后
灵活的版本管理
代码这种东西太需要做版本管理了,尤其在一些大型项目需要多人合作的时候,如果要保证团队多个成员一起协作开发,这是必不可少的功能。另外,随着软件开发越来越成熟规范,测试和发布也更加讲究,这些都需要依赖版本管理功能。
目前,软件开发模式已经从瀑布式开发变为了敏捷开发,迭代速度越来越快,保证其快而不乱的恰恰是版本管理。
由Git衍生出的Devops
基于Git的分布式存储以及版本管理,才有了今天Devops的蓬勃发展,不论是Jenkins,Kubernetes,还是各种云平台都提供了从Git加载工程构建部署到云的功能,Git可以说就是完整开发流程不能绕过的一个工具。
推荐阅读
- 我自己的git
GitHub链接
Gitee链接
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!