华为云实战开发】5.如何快速创建免费Git代码仓库【华为云技术分享】
1 文章目的
本文主要帮助已经掌握或者想要掌握Git的开发者,如何更好的应用Git,以及更好的将Git与DevCloud结合应用。
2 概述
2.1 版本控制系统介绍
从狭义上来说,版本控制系统是软件项目开发过程中管理代码所有修订版本的软件,能够存储、追踪文件的修改历史,记录多个版本的开发和维护,事实上我们可以将任何对项目有帮助的文档交付版本控制系统进行管理。版本控制系统(Version Control Systems)主要分为两类,集中式和分布式。
2.1.1 集中式版本控制系统
集中式版本控制系统的特点是只有一台中央服务器,存放着所有研发数据,而其它客户端机器上保存的是中央服务器最新版本的文件快照,不包括项目文件的变更历史。所以,每个相关人员工作开始前,都需要从这台中央服务器同步最新版本,才能开始工作。
集中式版本控制系统的优点:
1. 操作简单,使用没有难度,可轻松上手。
2. 文件夹级权限控制,权限控制粒度小。
3. 对客户端配置要求不高,无需存储全套代码。
集中式版本控制系统的缺点:
1. 网络环境要求高,相关人员必须联网才能工作。
2. 中央服务器的单点故障影响全局,如果服务器宕机,所有人都无法工作。
3. 中央服务器在没有备份的情况下,磁盘一旦被损坏,将丢失所有数据。
2.1.2 分布式版本控制系统
分布式版本控制系统的特点是每个客户端都是代码仓库的完整镜像,包括项目文件的变更历史。所有数据分布的存储在每个客户端,不存在中央服务器。可能有人会问,我们公司使用Git分布式存储工具,也有“中央服务器”啊?其实,这个所谓的“中央服务器”仅仅是用来方便管理多人协作,任何一台客户端都可以胜任它的工作,它和所有客户端没有本质区别。
分布式版本控制系统的优点:
1. 版本库本地化,版本库的完整克隆,包括标签、分支、版本记录等。
2. 支持离线提交,适合跨地域协同开发。
3. 分支切换快速高效,创建和销毁分支廉价。
分布式版本控制系统的缺点:
1. 学习成本高,不容易上手。
2. 只能针对整个仓库创建分支,无法根据目录建立层次性的分支。
3 前提条件
3.1 华为云账号
使用华为软件开发服务,首先需要免费注册一个华为云账号。
3.2 Git客户端
Git是一款开源的分布式版本控制系统(Distributed Version Control System) ,诞生于2002年,由Linux之父Linus Torvalds带领Linux开源社区开发完成,初衷是用其管理Linux内核的庞大的开源代码。在当今敏捷开发成为主流,研发周期短,跨地域协同开发多的大形势下,选择Git版本管理工具是大势所趋。国内外有很多基于Git的云端代码托管服务,华为软件开发服务(Devcloud)配置管理服务就是其中之一。
代码托管(CodeHub)是面向软件开发者提供的基于Git的在线代码托管服务,包括代码克隆/下载/提交/推送/比较/合并/分支等。代码一键下载到本地,基于本地IDE开发,开发完毕一键推送云端,实现线上线下协同开发
3.2.1 Git Bash 下载安装
Git Bash客户端软件是本地PC使用git必须安装的软件,如果本地没有安装,请到https://git-scm.com/downloads下载。
安装成功以后,在开始菜单中会增加Git Bash选项。
3.2.2 配置个人信息
安装完成,运行Git Bash,在弹出终端页面按照下面操作进行个人配置。
3.2.3 生成密钥
运行Git Bash, 生成一对SSH密钥,在弹出的终端中输入下面命令,回车后会提示您输入一个密码,建议不输入,一路回车即可。
此时,会在~/.ssh文件夹下生成了一对密钥,公钥id_rsa.pub和私钥id_rsa,私钥无需处理,保存在本机就可以了,公钥的内容需要拷贝到软件开发服务中。
3.3 已经创建好的项目
创建项目
在华为云官网首页 产品 软件开发服务,进入华为软件开发服务首页。
点击右上角“新建”按钮新建项目
输入项目名称,选择开发流程,输入项目描述,点击“新建”按钮即完成了一个项目的创建。
4 Devcloud场景应用
4.1 CodeHub操作
4.1.1 新建空仓库
在开发云代码服务中,点击上方“新建仓库”按钮
新仓库的详细配置如下:
新建成功
4.1.2 粘贴ssh公钥
第一步:运行Git Bash,在终端执行如下命令,会将.ssh文件夹下的id_rsa.pub公钥内容(灰色背景的字符串)打印到终端,拷贝这些字符串,注意不要有多余的空格。
第二步:在开发云代码服务中,点击右上角的“设置SSH密钥”
第三步:继续点击右上角的“添加SSH密钥”
第四步:粘贴拷贝的公钥字符串,添加“标题”,点击“新建”就可以了。
4.2 云端仓库功能一览
5 Git本地研发场景
5.1 克隆代码
在本地准备克隆代码的目标文件夹,右键打开git bash终端
执行如下命令:
5.2 代码提交
一次修改被成功提交到远端仓库会历经四个阶段,1本地工作区->2缓存区->3版本库->4远端版本库,通过执行相应的Git命令,文件在这四个区域跳转,并呈现不同的状态,主要涉及三步操作:
#git add/rm filename //将新增、修改或者删除的文件增加到暂存区
#git commit –m “commit message” //将已暂存的文件提交到本地仓库
#git push //将本地代码仓库修改推送到远端仓库
5.3 分支操作
5.3.1 新建分支
Git新建分支的本质就是创建一个指向最后一次提交的可变指针,所以,Git分支的创建不是复制版本库的内容,仅仅是新建了一个指针,它以40个字符长度SHA-1字串形式保存在文件中。
#git branch branchName commitID
基于commitID即某一个全球版本号拉出新分支,如果没有commitID则基于当前分支的HEAD拉出新分支。
如下图新建feature分支执行的命令为git branch feature
5.3.2 切换分支
#git checkout branchName
如下图切换到feature分支执行的命令为git checkout feature
5.3.3 分支合并
无论哪种工作流都会涉及到分支合并(把一个分支中的修改整合到当前分支),主要有两种方法:三方合并(merge) 和衍合(rebase)。我们通过对同一种场景进行不同操作体会两种合并方法的区别。
场景:master分支新增了C4节点, hotfix分支新增了C3节点,现将hotfix分支合并到master分支:
1. 三方包括hotfix新增节点C3,master新增节点C4,以及两者的共同祖先节点C2。这种合并操作简单,但新增合并节点C5,形成了环形,版本记录可读性差。
#git checkout master
#git merge hotfix
2. 衍合先将master分支新增节点C4以补丁形式保存在.git/rebase目录中,然后同步hotfix分支最新代码,再应用补丁C4’。
#git checkout master
#git rebase hotfix
5.3.4 冲突解决
类型一:两个合并分支修改了同一行代码
解决方法:
1. 分析哪种修改方法正确,手动合并;
2. 提交修改。
类型二:文件被重命名为不同的名字
解决方法:
1. 确认哪个名字是正确的,删除错误的;
2. 提交修改。
6 Git工作流
什么是Git工作流?你可以理解为代码管理的分支策略,它不仅仅是版本管理范畴,更服务于项目流程管理和团队协同开发。所以,我们有必要制定适合自己研发场景的工作流。
下面介绍四种工作流的工作方式、优缺点,以及使用中的一些注意事项。
1. 集中式工作流
2. 功能分支工作流
3. gitflow工作流(Devcloud推荐)
4. forking工作流
6.1 集中式工作流
集中式工作流适合5人左右小开发团队,或是刚从SVN工具转型为Git的团队,它只有一个默认的maste分支(相当于svn的trunk主分支),所有人的修改都是在master分支上进行的。但是,这种工作流无法充分发挥git优势和多人协同,不推荐使用。
工作方式:
开发人员将master分支从中央仓库克隆到本地,修改完成后再推送回中央仓库master分支。
优点:
不涉及分支交互操作
缺点:
1. 不适合人员较多的团队,当人员10+时,解决开发人员之间的代码冲突会耗费很多时间;
2. master分支提交频繁;
3. master分支不稳定,不利于集成测试。
Tips:如何尽量避免产生冲突和不合理的提交历史?
开发人员在开发一个新功能之前,一定要在本地同步中央仓库最新代码,使自己的工作基于最新的代码之上;开发完成后,在提交新功能到中央仓库前,需要先fetch中央库的新增提交,并rebase自己的提交。这样做的目的是,把自己的修改加到中央仓别人已经提交的修改之上,使最终的提交记录是一个完美的线性历史,而不是环形。
举例:
1. 开发人员A和开发人员B同时在某个时间拉取了中央仓库的代码
2. 开发人员A先完成了自己的工作,并提交到中央仓库
3. 开发人员B需要在本地执行git pull –rebase中央仓库的新提交,这时开发人员B的本地仓库就包含了开发人员A修改的内容,并在A的基础上增加了自己的修改
4. 开发人员B将代码推送到中央仓库
6.2 功能分支工作流
通过新建几个功能分支,增加开发者的交流和协作,它的理念是所有的功能开发都应该在master分支外的一个独立分支进行,这种方式隔离了开发者的工作空间不被互相干扰,保证了master分支的稳定性。
工作方式:
开发人员每次在开始新功能开发前,需要在master分支上拉取一个新分支,并起个有描述性的名字,比如video-output或issue-#1061,这样可以让分支用途明确。功能分支不但存在开发人员本地仓库,也应该推送到中央仓库,这样就可以在代码不合入master分支的情况下与其他开发人员分享代码。
优点:
分支合并前可以使用pull request进行code review;
降低了master分支的提交频率
缺点:
只有一个master分支作为集成,仍然不是很稳定,不适合大型开发
6.3 Gitflow工作流
Gitflow一般用于管理大型项目,它为不同的分支分配一个很明确的工作角色,并定义分支之间什么时候进行交互。
工作方式:
master分支:生产分支,最稳定的版本,一直是ready to deploy状态。不接受开发人员直接commit,只接受从其他分支merge操作。在很多企业中,这个分支被默认开启分支保护,只有维护者可以操作。
hotfix分支:从master分支拉取的临时修复分支,用于解决一线紧急bug。bug解决后需要合入master分支并打上新的版本号,这个修改也需要同时合入develop分支。
develop分支:从master分支拉取的开发分支,用于功能集成。包含所有要发布到下一个Release的代码用于开发集成、系统测试。
release分支:临近既定的发布日,就从develop分支上拉取一个release分支,任何不在当前分支中的新功能都推到下个发布中。release分支用于发布,所以从当前时间点之后新的功能不能再加到这个分支上,这个分支只做Bug修复、文档生成和其它面向发布的任务。当对外发布的工作都完成了,release分支合并到master分支并分配一个版本号打好Tag;另外,这些从release分支新做的修改要反向合并回develop分支。
feature分支:开发者使用的特性分支,父分支是develop分支,当新功能完成时,合入develop分支。新功能提交从不直接与master分支交互。
开发人员提交新功能的两种途径:
1. 团队有专人review审核新功能
a) 开发人员将feature分支推送到华为软件开发云代码托管平台(中央仓库)
b) 发起一个从feature分支合并到develop分支的pull request请求,并指给review专员
c) review专员审核。如果通过,将feature分支的新功能合并到develop分支,并删除feature分支;如果未通过,拒绝该请求并注明拒绝原因。
2. 开发人员自审核新功能
a) 开发人员在本地仓库将feature分支合并到develop分支,并删除feature分支
b) 将本地develop分支的修改推送到华为软件开发云代码托管平台(中央仓库)
优点:
1. 使用一个用于发布准备的专门分支(release分支),使得一个团队可以在完善当前的发布版本的同时,可以在develop分支并行继续开发下个版本的功能。这也打造了可视化的发布阶段,团队成员都可以在仓库网状结构中可以看到发布状态;
2. 使用紧急修复分支(hotfix分支)让团队可以处理紧急问题的同时而不打断其它工作或是等待下一个发布再合入hotfix修改。我们可以把hotfix分支想成是一个直接在master分支上处理的临时发布;
3. 大型项目人员协作频繁,流程较多,合理的多角色分支帮助研发有条不紊进行;
4. 更符合devops理念。
缺点:
1. 学习成本较高;
2. 如果团队不遵守使用约定,带来的影响更大。
6.4 forking工作流
Forking工作流区别于前三种工作流的最大特点是每个开发人员都有一个从公共仓库fork出来的属于自己的公共仓。Forking工作流适合外包、众包以及众创和开源场景。接包方的开发人员从项目公共仓fork自己的公共仓库进行操作,并不需要被项目公共仓直接授权。
工作方式:
将“项目公共仓”fork出一个“个人公共仓”
将“个人公共仓”clone到“本地仓库”
操作“本地仓库”,修改完成后提交到“个人公共仓”
为“个人公共仓”提交一个pull request给项目维护者,申请代码合入“项目公共仓”
项目维护者在本地review、验证本地提交,审核通过后push进入“项目公共仓”
Tip:如果开发人员A的代码未被审核通过合入“公共仓库”,而此代码对开发人员B有借鉴作用,开发人员B可以直接从开发人员A的“个人公共仓”拉取代码。
优点:
1. 开发人员之间若需要代码协作,可以直接从其他人的“个人公共仓”拉取,无需等到代码提交到项目公共仓;
2. “项目公共仓”无需为每个代码贡献者授权;
3. 项目维护者通过审核pull request成为代码安全的重要防线;
4. 仓库分支的选择可以根据项目实际情况综合使用前三种工作流。
缺点:
1. 提交步骤繁琐,开发人员代码到最终版本库的周期较长。
研发团队可以根据实际研发场景制定合理的工作流,能有效提高项目管理水平和团队协同开发能力, 并通过DevCloud的CodeHub平台,高效、安全的管理代码资产,将更多的精力集中在业务开发上,实现持续集成、持续交付和快速迭代的目标。
华为云DevCloud,5人以下额度范围内,可以免费使用,并且可以预约免费的产品演示和技术交流,详情查看华为云官网
华为云实战开发】5.如何快速创建免费Git代码仓库【华为云技术分享】的更多相关文章
- 如何快速关联/修改Git远程仓库地址
如何快速关联/修改Git远程仓库地址?按照如下步骤即可快速实现关联/修改Git远程仓库地址: 删除本地仓库当前关联的无效远程地址,再为本地仓库添加新的远程仓库地址 git remote -v //查看 ...
- 【华为云实战开发】9.如何进行PHP项目的快速搭建并实现CICD?【华为云技术分享】
1 概述 1.1 文章目的 本文主要想为研发PHP项目的企业或个人提供上云指导,通过本文中的示例项目 “workerman-todpole”,为开发者提供包括项目管理,代码托管,代码检查,编译构建,测 ...
- 【华为云实战开发】8.如何快速搭建C#网站并实现持续集成?【华为云技术分享】
1 概述 1.1 文章目的 本文通过一个实例介绍如何使用软件开发服务DevCloud完成一个C#Web项目的开发. 1.2 项目详情 1. 项目名称:超级冷笑话网站 2. 项目简介:一个Web网站,包 ...
- 【华为云实战开发】10.经典的C++项目怎么在云端开发?【华为云技术分享】
1 概述 1.1 文章目的 本文主要想为研发C++项目的企业或个人提供上云指导,通过本文中的示例项目 “音频解析器”,为开发者提供包括项目管理,代码托管,代码检查,编译构建,测试管理的操作指导,覆盖软 ...
- Android开发的初学者快速创建一个项目
因为gwf的原因,大陆连不上google所以AndroidSDK是无法更新的 而且设置代理也不一定能解决问题 如果是初学者想快速的了解安卓开发,可以在国内的内网下载整合包 下载地址:http://rj ...
- Github:在Github上创建自己的代码仓库
Github是一个分布式版本控制系统,最初由Linux之父Linus Torvalds编写,在云时代的今天已经成为了开发者管理代码和发现已有代码的最常用工具之一,下面我们将开始git之旅. 注册Git ...
- 在github上创建自己的代码仓库
git用了很久了,github也用很久了,但一直都是使用别人的项目, 最近想把自己写的一些代码放到自己的帐号上去 以为就是很简单的代码推送,真正做一次时候才发现,原来坑还不少呢, 就把这次的经历记录一 ...
- git创建项目,代码仓库
1.首先在服务端远程创建仓库 mkdir project.git cd project.git git --bare init 2.在本地创建项目推送到远程服务端仓库 mkdir myproj ...
- 新创建一个git远程仓库
1.git 服务器项目初始化已经完毕,请把相关的资料和源码上传到git服务器. 2.第一次需要clone,执行命令:git clone git@192.168.10.184:listenbox_mc_ ...
随机推荐
- 64位下的InlineHook
目录 x64下手工HOOK的方法 一丶HOOK的几种方法之远跳 1. 远跳 不影响寄存器 + 15字节方法 2.远跳 影响寄存器 + 12字节方法 3.影响寄存器,恢复寄存器 进行跳转. 4. 常用 ...
- Linux下查看文件和文件夹大小 删除日志
场景:在sts中执行自动部署时候maven提示No space left on device错误,后来经检查发现是磁盘空间满了,用下面的方法分析发现tomcat下面的logs目录占用了很大的空间,删除 ...
- Elasticsearch与Solr优缺点比较
Elasticsearch简介 Elasticsearch是一个实时的分布式搜索和分析引擎.它可以帮助你用前所未有的速度去处理大规模数据. 它可以用于全文搜索,结构化搜索以及分析,也可以将这三者进行组 ...
- kafka(五) 流式处理 kafka stream
参考文档: http://www.infoq.com/cn/articles/kafka-analysis-part-7?utm_source=infoq&utm_campaign=user_ ...
- 这可能是目前最透彻的Netty原理架构解析
https://juejin.im/post/5be00763e51d453d4a5cf289 本文基于 Netty 4.1 展开介绍相关理论模型,使用场景,基本组件.整体架构,知其然且知其所以然,希 ...
- RPGMaker MV 入门教程
RPG Maker是一个十分优秀的rpg游戏制作引擎 恩 一个被定义为游戏的游戏引擎 可以用来十分便捷的制作rpg游戏 有兴趣的可以尝试一下 满足自己想做游戏的愿望. Step1 决定你的RPG形 ...
- RockBrain USB Server外设虚拟化高可用解决方案(银企直联虚拟化解决方案)
技术指标: 单.双千兆网络界面(支持链路冗余与链路热备.支持双网口均衡负载) 原生USB2.0接口(USB2.0与USB3.0接口均对所有USB版本设备兼容,支持混插) 技术优势: RockBrain ...
- avformat_open_input阻塞操作中断的支持
avformat_open_input默认是阻塞操作,如果不加控制,等待时间可能会达到30s以上,对于有些情况,等待30s的体验是无法接受的. ffmpeg支持interrupt_callback机制 ...
- Hive的两种操作模式
Hive的客户端操作 Hive的客户端操作 通过JDBC操作Hive 通过Thrift操作Hive 通过JDBC操作Hive 首先 Hive 启动远程服务 hive --service hiveser ...
- CSAGAN的几大重点 - 2
1.生成器 1)MRU(SketchyGAN) 计算过程为: 与DCGAN[46]和ResNet生成架构的定性和定量比较可以在5.3节中找到.MRU块有两个输入:输入特征图xi和图像I,输出特征图yi ...