一、代码版本控制工具
版本控制适用于软件开发过程中对各种程序代码、配置文件及说明文档等文件变更的管理,是软件开发者的必备工具,也是软件公司的基础设施。是软件团队中完成代码提交和code review以及代码集成的主要工具。使用软件版本控制的作用和适用范围主要包括:
- 记录文件变更:版本控制是一种记录文件内容变化的方式,它可以记录何时、何人更改了文件的内容,每一次文件的改变,文件的版本号都将增加。
- 并行开发:使用版本控制系统可以将文件回溯到之前的某个时间点,甚至将整个项目都回退到过去某个时间点的状态。这样可以比较同一文件不同时间点的变化细节,查出最后是谁修改了哪个地方,导致出现问题等。
- 支持软件公司的配置管理活动:追踪多个版本的开发和维护活动,及时发布软件。
代码版本管理我认为可以分为两类git和非git,非git比较有代表性的就是SVN,它们在功能和工作流程上有一些不同,选择用哪个版本控制工具和项目需求、团队规模和开发流程等相关。下面分别查看来聊聊。
二、GIT
2.1 git工具特点
总体来说,Git适用于分布式团队协作和高效处理大型项目,强调分支和合并的功能,适合敏捷开发和需要频繁创造新分支的场景。
- 分布式版本控制系统:每个开发者都可以拥有完整的代码仓库,包括完整的历史记录和分支信息。
- 高效处理大型项目:Git使用快照(snapshots)而非差异(deltas)存储文件变化,因此在处理大型项目时更加高效。
- 强大的分支和合并功能:Git支持轻松创建、切换和合并分支,使得并行开发和特性分支开发更加方便。
- 离线操作和本地提交:Git的分布式设计使得开发者可以在没有网络连接的情况下进行代码修改和提交。
- 提供强大的工具链:Git周边工具丰富,如GitHub、GitLab等,提供了代码托管、协作和代码审查等功能。
2.2 版本控制的基本步骤
- 初始化仓库:使用
git init
命令在项目目录中初始化一个空的Git仓库。 - 添加文件:将要进行版本控制的文件添加到Git仓库中。可以使用
git add
命令来添加单个或多个文件,例如git add file.c
- 提交文件:使用
git commit
命令提交已添加的文件,并附上一个简短的 commit 信息,描述本次提交的内容。例如,git commit -m "提交新功能"
。 - 查看提交历史:使用
git log
命令查看提交历史,包括每个提交的哈希值、作者、日期和提交信息等。 - 创建分支:如果需要在当前代码的基础上开发新的功能或修复问题,可以创建一个新的分支。可以使用
git branch
(或者使用git checkout -b)命令创建分支,例如git branch feature
。 - 切换分支:使用
git checkout
命令切换到指定的分支,例如git checkout feature
。 - 合并分支:当在新分支上完成开发后,可以将其合并回主分支。首先切换到主分支,然后使用
git merge
命令将新分支合并进来。例如,git checkout main
和git merge new-feature
。 - 解决冲突:在合并分支时,如果出现冲突,需要手动解决冲突并提交修改。
- 远程操作:将本地仓库与远程仓库进行同步。可以使用
git remote add
命令来添加远程仓库地址,并使用git push
命令将本地提交推送到远程仓库。
2.3 基本介绍
Git最先进的分布式版本控制系统,是去中心化的,每个有权限的电脑上都有一个完整的版本库,从而使分布式系统具有更高的安全性。git的提交都是基于本地仓库的,当需要合并代码到远程仓库时,通过push命令就可以完成。
Git有几个主要概念:工作区、暂存区、本地仓库和远程仓库。工作区反应文件的实时变化,一般开发都是在工作区完成。暂存区是临时区域,存放准备要提交的内容,一般通过add命令把一个或多个文件放入暂存区。本地仓库是存储在本地的全部源代码的版本库,而远程仓库一般用于团队协作,共同维护。Git比较好用的地方就在于分支管理,Git分支的本质是一个指向某个点快照的指针,所以Git分支管理特别灵活,具有较快的响应速度。Git经常使用branch命令创建、查看分支。
三、SVN
3.1 SVN工具特点
总体来说,SVN适用于对稳定性和一致性要求较高的项目,特别是在处理大量文本文件时更为常见。
- 集中式版本控制系统:代码仓库集中存储在中央服务器上,开发者通过客户端与服务器进行交互。
- 强调稳定性和一致性:SVN注重版本控制的稳定性和可靠性,对于一些企业和团队来说更容易上手和管理。
- 支持文件级版本控制:SVN以文件为单位进行版本控制,可以单独查看、恢复和比较文件的历史版本。
- 直观的目录结构:SVN的目录结构清晰,易于理解和浏览,适合处理大量文本文件。
- 强制锁定机制:SVN支持文件锁定机制,可以确保同一时间只有一个人可以编辑文件。
3.2 版本控制的基本步骤
- 创建仓库:在服务器上创建一个新的SVN仓库,可以使用
svnadmin create
命令进行创建。 - 导入项目:将要进行版本控制的项目导入SVN仓库。使用
svn import
命令将项目根目录导入SVN仓库,例如svn import /path/to/project file:///path/to/repository -m "Initial import"
。 - 检出工作副本:从SVN仓库中检出(checkout)一个工作副本到本地机器上。使用
svn checkout
命令,指定远程仓库地址和本地路径,例如svn checkout file:///path/to/repository /path/to/working-copy
。 - 添加文件:将要进行版本控制的文件添加到SVN仓库中。使用
svn add
命令来添加单个或多个文件,例如`svn add file.c - 提交文件:使用
svn commit
命令提交已添加的文件,并附上一个简短的提交信息,描述本次提交的内容。例如,svn commit -m "提交新功能"
。 - 查看提交历史:使用
svn log
命令查看提交历史,包括每个提交的版本号、作者、日期和提交信息等。 - 创建分支:如果需要在当前代码的基础上开发新的功能或修复问题,可以创建一个新的分支。使用
svn copy
命令创建分支,例如svn copy /path/to/trunk /path/to/branch -m "Create branch"
。 - 切换分支:使用
svn switch
命令切换到指定的分支,例如svn switch /path/to/branch
。 - 合并分支:当在新分支上完成开发后,可以将其合并回主分支。首先切换到主分支,然后使用
svn merge
命令将新分支合并进来。例如,svn switch /path/to/trunk
和svn merge /path/to/branch
。 - 解决冲突:在合并分支时,如果出现冲突,需要手动解决冲突并提交修改。
- 更新工作副本:使用
svn update
命令更新工作副本,将远程仓库中的最新版本同步到本地。
SVN可以在图形界面使用鼠标代替上面的命令完成代码和文本的版本管理,以上步骤是从版本管理的角度梳理出来的流程。
3.3 基本介绍
SVN是Subversion的缩写,是一个开源的集中式版本控制系統,是有中央服务器的,是集中存放源代码版本库的[11]。SVN在设计之初,确立的目标就是在功能上逐步取代 CVS。与早期的版本管理系统(CVS)比较,采用了分支管理系统,增加了原子提交功能,文件和目录的修改也都可以保存在版本记录中,从而代替之前的版本管理系统,逐渐流行起来。纵观其发展历史,在2001年8月,SVN开始实现使用自己平台管理自己的源码。之后在2010年1月,SVN被Apache专案所接收,正式称为Apache Subversion,成为Apache软件基金会的一个顶级专案。
在开发中比较常用的SVN是TortoiseSVN,它是一个开源免费的客户端。不仅可用于软件研发,一些公司也会使用SVN管理公司内部共享的文档。SVN中主要几个常用到概念,比如repository、checkout、commit、update。Repository是代码仓库,主要用于存放源代码的地方。当本地没有源代码的时候,需要从远程的repository仓库checkout一份到自己电脑。当本地修改了代码,经调试成功后需要commit到repository仓库。Update用于本地更新与repository仓库上的源代码同步,团队协作时一般在自己修改之前都update更新一下本地源代码。
四、结尾总结
使用版本控制系統,可以解决不使用版本控制时,编程出现的各种难以预料的问题。常见问题有代码管理混乱、版本管理混乱、重复占用磁盘空间、代码冲突等。开发团队通过使用版本管理工具,降低了人员沟通协助的成本,提升了开发效率。
目前比较主流的版本控制工具是SVN和Git,两者各有优劣,经常被相互比较。首先SVN是按文件方式存储,Git则是按元数据方式存储;然后SVN有一个全局的版本号,而Git没有;之后Git使用哈希算法,从而使其内容完整性要优于SVN;最后两者的分支管理不同,Git能够很迅速的在分支间切换,而SVN则需要更长的耗时。
总结来说,对访问控制、权限分配要求比较高的话,可以优先考虑SVN;而对于需要多人协作、迅速迭代开发的话,可以优先考虑Git。如果软件团队协同办公,如果超过三个,并具备一定的协同需求,推荐使用gerrit在个人电脑即可搭建自己的服务器。如果是觉得命令行有门槛,同步除了代码又有文档的版本管理需求,推荐使用TortoiseSVN客户端,可以通过图形用户界面提交和检查代码更改到SVN服务器,并可以同步管理公司的文档。
VX公众号:森哥谈成像技术
结尾森哥想说:git 仓库推荐gerrit和gitlab;代码托管平台推荐gitee和github;SVN仓库推荐TortoiseSVN客户端。最后更大的维度来说,对于编程工作的朋友我只推荐使用git,进阶来说,对于从事android开发也必须要使用git作为软件版本控制工具,并配合使用repo工具配合Git一起使用管理Android源码,解决Android系统源码含有多个子项目的庞大项目的仓库管理难度问题。