源代码管理工具

为啥需要源代码管理? 我自己写代码多爽,别人要,就用QQ传过去好了。

0. 为什么要对源代码进行管理

源代码管理(SCM)用于跟踪对源代码存储库的修改。SCM跟踪代码库更改的运行历史,并帮助解决合并来自多个参与者的更新时的冲突。随着软件项目在代码行和贡献者人数方面的增长,通信开销和管理复杂性的成本也在增长。供应链管理是一个关键的工具,以减轻日益增长的开发成本带来的组织压力。

无论您是自己编写简单的应用程序,还是与团队成员协作完成大型软件开发项目,源代码控制都是开发过程中的重要组成部分。借助源代码管理系统,您可以跟踪代码更改、查看代码的修订历史记录,并在需要时恢复到项目的之前版本。使用源代码管理系统,您可以与团队一起协作编写代码,在准备就绪之前隔离您的工作,并通过识别谁做出了更改以及做出了哪些更改来快速解决问题。源代码管理系统可帮助简化开发流程,并为所有代码提供集中式源代码。

软件工程的质量要靠软件工具和软件流程来保证, 大家看过正在建设中的高楼, 半完工的楼顶上矗立着巨大的塔吊。这个塔吊不是用户需求的一部分 ,但是,这是建筑工程上不可缺少的环节,那么怎么把塔吊顺利地安装上,随着楼房的增高而增高,让塔吊高质量地工作,怎么做安全检查,防止它倒下来? 这就是工程的要求。

软件工程中,也有类似脚手架,塔吊这样的工程系统,工具和流程。 软件的源代码管理工具,加上构建系统, 能保证一个复杂软件能在多个角色,多个团队的合作下,按时以合适的质量发布。 如果你写一个Hello World 程序, 当然不需要这些工具, 就像你用儿童积木搭房子过家家,你自己高兴,但这不是建筑工程。

1. 常用的源代码管理工具

1.1 SVN

SVN

SVN是subversion的缩写,是一个开放源代码的版本控制系统,通过采用分支管理系统的高效管理,简而言之就是用于多个人共同开发同一个项目,实现共享资源,实现最终集中式的管理。

SVN 的一些概念

  • repository(源代码库): 源代码统一存放的地方
  • Checkout(提取): 当你手上没有源代码的时候,你需要从repository checkout一份
  • Commit(提交): 当你已经修改了代码,你就需要Commit到repository
  • Update (更新): 当你已经Checkout了一份源代码, Update一下你就可以和Repository上的源代码同步,你手上的代码就会有最新的变更

1.2 Git

Git

Git 是用于 Linux内核工具。与常用的版本控制工具 CVS, Subversion 等不同,它采用了分布式版本库的方式,不必服务器端软件支持,使源代码的发布和交流极其方便。 Git 的速度很快,这对于诸如 Linux kernel 这样的大项目来说自然很重要。 Git 最为出色的是它的合并跟踪(merge tracing)能力。

Git 常用的是以下 6 个命令:git clonegit pushgit addgit commitgit checkoutgit pull

Git Workflow

  • 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 确定成员权限

Manage access

在你的项目设置中,可以设置access,在这里你可以通过邮件和ID邀请你的团队成员加入本项目,这样他们就有对应的权限来对repository进行控制。也可以为不同的项目成员分配不同的权限来完成不同的工作。

例如develop和code review。

需要提醒的一点是,有时候即使成员拥有push的权限,也不要直接在项目的主repository中进行push,最好的方式是让成员fork出自己的repository,在此进行feature的开发或debug。再提出一个pull request,由项目中进行code review的成员进行审核,在进行单元测试后符合预期再merge进项目repository中。

3.2 确定分支模式

git branch

最常见的模式是master-dev分支模式,项目stable的代码放在master分支中,由不同的项目组成员维护自己负责的部分的branch和fork。

在项目的git repository中,master分支用来管理已经被验证为stable的代码,正在开发的代码可以被储存到dev分支中。dev分支可以用多个,分别用来管理不同模块的开发代码。

不同的颜色表示由不同的开发者提交的代码,每个/每组开发者负责维护一个branch

3.3 开发流程

workflow

一般工作流程如下:

  • 克隆 Git 资源作为工作目录。
  • 在克隆的资源上添加或修改文件。
  • 如果其他人修改了,你可以更新资源。
  • 在提交前查看修改。
  • 提交修改。
  • 在修改完成后,如果发现错误,可以撤回提交并再次修改并提交。

现在就可以把你的项目成员加入到你的Git repository中开始你们的项目开发了。

3.4 关于issue

在软件开发过程中,开发者们为了跟踪BUG及进行软件相关讨论,进而方便管理,创建了Issue。管理Issue的系统称为BTS(Bug Tracking System,Bug跟踪系统)。当今具有代表性的BTS有RedmineTracBugZilla等。

GitHub自身也加入了BTS的功能。在GitHub上,可以将它作为软件开发者之间的交流工具,多多加以利用。遇到下面几种情况时,各位就可以使用这个功能。

  • 发现软件的BUG并报告
  • 有事想向作者询问、探讨
  • 事先列出今后准备实施的任务

issue页面

现在,很多大公司的软件研发团队协作,都是通过 JIRA 来实现的。

目前也流行很多非代码的团队协作,比如 teambition、Worktile、trello 等。

其实,GitHub 的 issue ,就是一个轻量级协作系统。它的 comment 支持 GitHub Flavored Markdown,可以进行内容丰富的交流。Git 本身就是分布式的代码版本控制软件,是为了程序员的协作而设计的。而 issue 的 Assignee 功能,就是这个在线协作系统的核心,足以让一群线上的开发者,一起完成一个软件项目。

4. 写在最后

灵活的版本管理

代码这种东西太需要做版本管理了,尤其在一些大型项目需要多人合作的时候,如果要保证团队多个成员一起协作开发,这是必不可少的功能。另外,随着软件开发越来越成熟规范,测试和发布也更加讲究,这些都需要依赖版本管理功能。

目前,软件开发模式已经从瀑布式开发变为了敏捷开发,迭代速度越来越快,保证其快而不乱的恰恰是版本管理。

由Git衍生出的Devops

基于Git的分布式存储以及版本管理,才有了今天Devops的蓬勃发展,不论是Jenkins,Kubernetes,还是各种云平台都提供了从Git加载工程构建部署到云的功能,Git可以说就是完整开发流程不能绕过的一个工具。

推荐阅读

Git - Documentation

Git 使用规范流程

git - 维基百科,自由的百科全书

  • 我自己的git

GitHub链接

Gitee链接

本博客的git repository Gitee | GitHub


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!