网页站点规划,网站网站建设策划书,做企业网站 签合同要注意什么,云南昆明百度推广本系列有两篇文章#xff1a;
一是另外一篇《快速使用Git完整开发》#xff0c;主要说明了关于Git工具的基础使用#xff0c;包含三板斧#xff08;git add、git commit、git push#xff09;、Git基本配置、版本回退、分支管理、公钥与私钥、远端仓库和远端分支、忽略文…本系列有两篇文章
一是另外一篇《快速使用Git完整开发》主要说明了关于Git工具的基础使用包含三板斧git add、git commit、git push、Git基本配置、版本回退、分支管理、公钥与私钥、远端仓库和远端分支、忽略文件、命令别名、标签等内容。二是本篇本文主要说明了Git和gitee开发协作的实践操作会带领您从0开始演示企业中的项目开发过程简略。
1.多人协作一共享分支 目标master分支下file.txt文件新增text_1、text_2文本。 实现由开发者1增加text_1由开发者2增加text_2。这里我们可以使用两台电脑或者使用云服务器来真实模拟两名开发者。 条件在一个分支下完成。 1.1.创建远端仓库
创建一个远端仓库该仓库默认有主分支master。并且仓库内有文件test_code内容如下 I am a code.1.2.创建远端分支
首先在自己的项目仓库中创建一个基于master远端分支的debug远端分支。
现在远端仓库有两个分支一个为master远端分支另外一个为debug远端分支。
此时对于还没有拉取的两个开发者来说都各有一个master本地分支和一个origin/master远端分支git branch是查看本地分支而git branch -r是查看远端分支。 $ git branch -rorigin/HEAD - origin/masterorigin/master而我们所有的操作基本都是在本地操作的此时两名开发者都需要使用git pull拉取远程的仓库。
此时再次运行就可以显示远端仓库的远端分支但是我们可以注意到并没有增加本地分支。 $ git branch -rorigin/HEAD - origin/masterorigin/debugorigin/master$ git branch* master1.3.开发者1操作
此时肯定是不可能在本地直接切换到远端分支的因此就需要自己创建一个debug分支使用命令git checkout -b debug origin/debug。
此时本地就有debug本地分支了并且也切换过去了。 $ git checkout -b debug origin/debugSwitched to a new branch debugbranch debug set up to track origin/debug.这实际上就是在创建分支的同时将本地分支和远端分支建立联系/关联可以使用git branch -vv来查看是否有联系/关联。 $ git branch -vv* debug SHA-1值 [origin/debug] commit内容1master SHA-1值 [origin/master] commit内容2补充建立联系/关联的意义是可以直接使用短命令git push和git pull而不是完整的长命令。 此时已经处于debug分支上然后使用vim修改。 $ git branch* debugmaster$ vim test_code$ git add --all$ git commit -m 日志我是开发者1我来提交代码然后再进行push操作由于有关联因此可以直接使用
回去查看远程仓库的内容可以发现debug远端分支内已经发生了修改并且领先master远端分支。 1.4.开发者2操作
也同样需要建立联系/关联但是这里我们演示不使用联系/关联的情况。
首先直接创建本地分支 $ git checkout -b debugSwitched to a new branch debug此时就没办法直接使用短命令pull $ git pullThere is no tracking information for the current branch.Please specify which branch you want to merge with.See git-pull(1) for details.git pull remote branchIf you wish to set tracking information for this branch you can do so with:git branch --set-upstream-toorigin/branch debug可以按照提示来链接本地分支和远端分支
$ git branch --set-upstream-toorigin/branch debug debug$ git branch --set-upstream-toorigin/debug debug
branch debug set up to track origin/debug.然后不要急着使用pull我们打开test_code写入以下内容 I am a code.test_2然后照旧使用git add和git commit -m 日志我是开发者2我也来提交代码
再使用git push这个时候发现Git拒绝了该请求这是因为发生了分支冲突。
因此必须使用pull拉取手动解决冲突然后再进行add和commit和push。 debug的最后一次提交就已经是我们所要的完整代码了。 1.5.合并到master
此时debug远端分支已经准备完毕但是master远端分支还没有修改成功。
此时有两种做法
1.5.1.做法一
一种是直接在本地合并然后push到远端仓库。 首先是将master分支合并到debug分支避免debug分支和master分支发生冲突因为还有其他分支的存在 切换到master通过pull保持最新然后在本地的debug上解决冲突 将debug分支合并到master分支此时master就有了修改 然后进行push即可 此时远端和本地debug分支就没有用了可以在远端仓库中删除和在本地仓库使用git branch -d debug 最后两名开发者同时使用pull命令
1.5.2.做法二
另外一种方法就是在gitee提交PR合并申请单由管理员来做审核后来merge可以直接在远端仓库上操作这种方式更加安全。 2.多人协作二私有分支 目标远程master分支下新增function1和function2文件。 实现由开发者1新增function1文件由开发者2新增function2文件。 条件在不同分支下协作完成每个开发者有自己的分支或者一个分支一个功能。 首先要明白有两种方法 创建远端分支正式工作时推荐可以保证一定是基于远端master上最新的代码 创建本地分支然后push基于本地master分支不一定是最新的代码
但是我们在本次演示中使用第二种方法。
2.1.开发者1 pull后创建基于master本地分支的feature-1本地分支此时就没有办法使用链接了因为我们没有在远端仓库创建远端分支没有办法链接因此我们现在的状态是没有办法使用短命令的。 然后创建一个function1文件内部写入内容 然后使用add和commit命令 由于没有链接也无法链接远端仓库没有远端分支所以要使用长命令git push origin feature-1直接将本地分支推送到远端仓库可以给远端仓库创建远端分支。 //开发者1$ git pull$ git checkout -b feature-1Switched to a new branch feature-1$ git branch* feature-1master$ vim function1$ git add --all$ git commit -m 日志开发者1的function1文件$ git push origin feature-1此时就可以看到远端仓库多了一个远端分支。 2.2.开发者2 此时开发者2也进行一样的工作但是此时master本地分支不是最新的因此就需要在master本地分支上pull。 剩下的工作就和开发者1是一样的 //开发者2$ git branch* master$ git branch -rorigin/HEAD - origin/masterorigin/master$ git pull$ git branch* master$ git branch -rorigin/HEAD - origin/masterorigin/feature-1origin/master$ git checkout -b feature-2 Switched to a new branch feature-2$ vim function2$ git add --all$ git commit -m 日志开发者2的function2文件 $ git push origin feature-2此时就可以看到远端仓库又多了一个远端分支。 2.3.合并到master
假设这个时候有一种情况开发者2发生意外情况没有办法现在合并到master远端分支。 此时开发者1使用git pull把开发者2创建的远端分支feature-2拉取过来这里之所以可以直接使用短命令是因为a.拉取分支内的内容才需要的建立链接 b.但是拉取远端仓库内容的时候就不需要建立链接 开发者1新使用命令git checkout -b feature-2 origin/feature-2创建、链接并且切换到一个feature-2的本地分支。 这个时候开发者1就拥有了开发者2的文件可以继续帮开发者2继续开发比如加入某些代码或删除然后再add和commit并且直接使用短命令push即可 如果后续开发者2回来了就需要再一次将feature-2和origin/feature-2进行链接然后pull将开发者1帮忙的部分从远端分支拉取 //开发者1$ git pull$ git branch -a* feature-1masterremotes/origin/HEAD - origin/masterremotes/origin/feature-1remotes/origin/feature-2remotes/origin/master$ git checkout -b feature-2 origin/feature-2Branch feature-2 set up to track remote branch feature-2 from origin.Switched to a new branch feature-2$ git branch -afeature-1* feature-2masterremotes/origin/HEAD - origin/masterremotes/origin/feature-1remotes/origin/feature-2remotes/origin/master$ git vim function2$ git add --all$ git commit -m 日志开发者1帮助开发者2的开发$ git push此时远端仓库就有了推送 $ git branch --set-upstream-toorigin/feature-2 feature-2$ git pull此时开发者2就可以看到开发者1半自己开发的部分了。
开发者2还可以继续进行自己的开发照常使用add和commit和短命令push即可 现在在远端仓库中有两个新增加的分支并且两名开发者都准备好各自的私有分支内的代码文件最后只需要提交PR给管理者管理员再远程仓库上做代码审核和冲突修改和分支合并即可 此时由审查员和测试员通过审查和测试才可以正式合并进master此时就完成了合并 此时对于开发者2来说理论上也是可以像开发者1一样操作的但是有可能发生冲突因此最好是在本地将远端分支最新的master合并进来防止冲突在master上解决然后使用长命令push分支合并会自动commit再提交PR上去。 $ git checkout master$ git pull$ git branchdebugfeature-2* master$ git checkout feature-2$ git merge master//然后解决冲突$ git push origin feature-23.远程分支删除后…
前面开发者1和开发者2开发完后假设开发者2因为请假次数太多被辞了悲痛~这个时候管理者也把他的远端工作分支删除了但是这个时候我们会发现一个问题在本地使用git branch -a/-r依旧可以看到这个远端分支。 $ git branch -afeature-1feature-2* masterremotes/origin/HEAD - origin/masterremotes/origin/feature-1remotes/origin/feature-2remotes/origin/master那么这么办呢可以使用git remote show origin该命令用于显示远程仓库 origin 的详细信息包括该远程仓库与本地仓库的分支关联、最新提交等。 $ git remote show origin* remote originFetch URL: https://gitee.com/limou3434/limou-c-test-code.gitPush URL: https://gitee.com/limou3434/limou-c-test-code.gitHEAD branch: masterRemote branches:feature-1 trackedmaster trackedrefs/remotes/origin/feature-2 stale (use git remote prune to remove)Local branches configured for git pull:feature-2 merges with remote feature-2master merges with remote masterLocal refs configured for git push:feature-1 pushes to feature-1 (up to date)master pushes to master (up to date)这里就有提示使用git remote prune [远端仓库名]去移除旧分支即可裁剪掉显示在本地机器的旧的远端分支。
4.企业模型协作真实模拟
4.1.协作模式 #mermaid-svg-Z9045KHw3qZBRrzD {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-Z9045KHw3qZBRrzD .error-icon{fill:#552222;}#mermaid-svg-Z9045KHw3qZBRrzD .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-Z9045KHw3qZBRrzD .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-Z9045KHw3qZBRrzD .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-Z9045KHw3qZBRrzD .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-Z9045KHw3qZBRrzD .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-Z9045KHw3qZBRrzD .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-Z9045KHw3qZBRrzD .marker{fill:#333333;stroke:#333333;}#mermaid-svg-Z9045KHw3qZBRrzD .marker.cross{stroke:#333333;}#mermaid-svg-Z9045KHw3qZBRrzD svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-Z9045KHw3qZBRrzD .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-Z9045KHw3qZBRrzD .cluster-label text{fill:#333;}#mermaid-svg-Z9045KHw3qZBRrzD .cluster-label span{color:#333;}#mermaid-svg-Z9045KHw3qZBRrzD .label text,#mermaid-svg-Z9045KHw3qZBRrzD span{fill:#333;color:#333;}#mermaid-svg-Z9045KHw3qZBRrzD .node rect,#mermaid-svg-Z9045KHw3qZBRrzD .node circle,#mermaid-svg-Z9045KHw3qZBRrzD .node ellipse,#mermaid-svg-Z9045KHw3qZBRrzD .node polygon,#mermaid-svg-Z9045KHw3qZBRrzD .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-Z9045KHw3qZBRrzD .node .label{text-align:center;}#mermaid-svg-Z9045KHw3qZBRrzD .node.clickable{cursor:pointer;}#mermaid-svg-Z9045KHw3qZBRrzD .arrowheadPath{fill:#333333;}#mermaid-svg-Z9045KHw3qZBRrzD .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-Z9045KHw3qZBRrzD .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-Z9045KHw3qZBRrzD .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-Z9045KHw3qZBRrzD .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-Z9045KHw3qZBRrzD .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-Z9045KHw3qZBRrzD .cluster text{fill:#333;}#mermaid-svg-Z9045KHw3qZBRrzD .cluster span{color:#333;}#mermaid-svg-Z9045KHw3qZBRrzD div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-Z9045KHw3qZBRrzD :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 软件开发工程师开发团队 软件测试工程师测试团队 软件运维工程师运维团队 Plan(规划) Code(代码) Build(构建) Test(测试) Relese(发布) Deploy(部署) Operate(维护) 在传统的IT组织下开发团队Dev和运维团队Ops之间的诉求会矛盾 开发团队追求变化尤其是追求敏捷编程思想的可能需要持续交付作为目标 运维团队追求稳定可能强调稳定且变更控制
这就会导致一道无形的”墙“被堆积起来不利于IT价值的最大化为了解决这一鸿沟就需要在企业文化、开发工具、和代码实践等方面做变革——DevOps(重视“软件开发人员”和“运维技术人员”之间沟通的文化、运动、惯例)出现了。通过自动化的“软件交付”和“架构变更”的流程来使得构造、测试、发布软件可以快捷、频繁、可靠。
在DevOps开发过程中包含计划、编码、构建、测试、预发布、发布、运维、监控。
而做到DevOps就极其需要类似Git这样可以快速迭代版本和维护不同版本的。
4.2.开发环境
对于开发人员来说有几个常用的环境需要了解 开发环境是程序员专门用于日常开发的服务器为了开发调试方便一般打开全部错误报告和测试工具是最基础的环境。 测试环境一个程序在测试工作不正常那么就不可以发布到生产机上。该环境是开发环境到生产环境的过度环境。 预发布环境该环境是为避免因测试环境和线上环境的差异带来的缺陷而设立的环境。其配置等基本和生产环境一致目的就是让正式开发的时候更有把握。所以预发布环境是你的产品质量的最后一道防线下一步项目就要上线了。要注意预发布环境的服务器不再线上集成服务器的范围之内是单独的一些机器。 生产环境是指正式提供对外服务的线上环境在PC端和手机端能访问到的APP基本都是生产环境。 灰度环境有的大公司还存在灰度环境或者叫仿真环境。 其他环境…
4.3.分支规范
环境有了概念之后Git分支就会根据不同的环境进行规范设计。
一般来说 #mermaid-svg-EYDcojJjLUikdg64 {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-EYDcojJjLUikdg64 .error-icon{fill:#552222;}#mermaid-svg-EYDcojJjLUikdg64 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-EYDcojJjLUikdg64 .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-EYDcojJjLUikdg64 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-EYDcojJjLUikdg64 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-EYDcojJjLUikdg64 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-EYDcojJjLUikdg64 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-EYDcojJjLUikdg64 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-EYDcojJjLUikdg64 .marker.cross{stroke:#333333;}#mermaid-svg-EYDcojJjLUikdg64 svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-EYDcojJjLUikdg64 .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-EYDcojJjLUikdg64 .cluster-label text{fill:#333;}#mermaid-svg-EYDcojJjLUikdg64 .cluster-label span{color:#333;}#mermaid-svg-EYDcojJjLUikdg64 .label text,#mermaid-svg-EYDcojJjLUikdg64 span{fill:#333;color:#333;}#mermaid-svg-EYDcojJjLUikdg64 .node rect,#mermaid-svg-EYDcojJjLUikdg64 .node circle,#mermaid-svg-EYDcojJjLUikdg64 .node ellipse,#mermaid-svg-EYDcojJjLUikdg64 .node polygon,#mermaid-svg-EYDcojJjLUikdg64 .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-EYDcojJjLUikdg64 .node .label{text-align:center;}#mermaid-svg-EYDcojJjLUikdg64 .node.clickable{cursor:pointer;}#mermaid-svg-EYDcojJjLUikdg64 .arrowheadPath{fill:#333333;}#mermaid-svg-EYDcojJjLUikdg64 .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-EYDcojJjLUikdg64 .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-EYDcojJjLUikdg64 .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-EYDcojJjLUikdg64 .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-EYDcojJjLUikdg64 .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-EYDcojJjLUikdg64 .cluster text{fill:#333;}#mermaid-svg-EYDcojJjLUikdg64 .cluster span{color:#333;}#mermaid-svg-EYDcojJjLUikdg64 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-EYDcojJjLUikdg64 :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 分支合并 分支合并 分支合并 Tag1 Tag2 Tag3 hotfix(紧急修复分支)本地环境 release(预发分支)预发布/测试环境 feature(需求开发分支)本地环境 develop(开发分支)开发环境 master(主分支)生产环境 修复 1.0[出现紧急问题] 1.0(带补丁) debug6 提交1 提交2 提交3 提交4 提交5 提交6 提交7 提交8 提交9 debug1 debug2 debug3 debug4 debug5 0.1 0.2 注意以上只是常用的Git Flow模型真实环境由企业而定并且有部分细节被忽略了。 4.3.1.master分支 给分支为只读分支并且只有一个用于部署到正式发布环境由合并release分支得到 主分支作为稳定的唯一代码任何情况下不允许直接在master上修改代码 产品功能全部实现后最终在master分支对外发布另外所有在master的推送都应该打上tag记录方便追朔也就是发布一次就要打上标签 master分支不可删除
4.3.2.develop分支 develop分支作为开发分支是基于master分支创建的只读唯一分支始终保持最新完成的bug修复后的代码可部署到开发环境对应集群 可根据需求大小程度确定是由feature分支合并还是直接在上面开发后者不太推荐
4.3.3.feature分支 feature分支通常都作为新功能和新特性开发分支是以develop分支为基础创建的 命名一般以feature/开头建议的命名规范为feature/user_createtime_feature 新功能开发完成后开发者需要将feature分支合并到develop分支 一旦新需求发布上线后便要将该分支删除
4.3.4.release分支 release分支为预发布分支基于本次上线所有的feature分支合并到develop分支后再基于develop分支创建可以部署到测试或预发布集群 命名也有规范一般release/开头建议命名规则为release/version_publishtime release分支主要用于提交给测试人员进行功能测试。发布提测阶段会以release分支为基准进行提测 release分支测试出问题则需要回归develop分支查看是否存在此问题 release分支属于临时分支产品上线后可以选择删除
4.3.5.hotfix分支 hotfix分支是线上出现紧急bug问题时提交补丁时使用又叫”补丁分支“需要基于master分支创建hotfix分支 命名hotfix/开头建议命名规范为hotfix/user_createtime_hotfix 当问题修复完成后需要合并到develop分支并推送到远程。一旦修复测试通过就通过develop远端合并到master远端分支并且结束后需要将其删除
还有一些其他的大企业有不同的模型。
4.4.管理实战
4.4.1.创建账号
创建两个Gitee账号一个为公司老板账号limou3434一个为员工账号Dimou3434绑定不同的邮箱。
并且最好准备两个浏览器一个登录老板账号一登录员工账号。
最好准备一个本地机器和服务器模拟老板和员工各自的本地环境有其他方案替代也可以…
4.4.2.创建企业空间
首先我们需要创建一个企业空间并且创建好空间内的仓库。 一个企业会有多个项目在一个项目中需要多个仓库这里我们可以先建立一个仓库。 发送员工邀请链接让一名员工进来企业空间。 另外一名员工在登录自己gitee账号后需要打开该链接填写姓名后加入。 同意员工加入。 项目和仓库也需要设置成员这样相关的成员才可以使用该仓库的部分权限。 4.4.3.分支管理
此时我们设置的库有默认有5个分支然后拉取到本地创建featrue本地分支后在上面进行开发然后关联远端分支featrue进行提交。
老板在自己的企业空间上检查提交检查完成后在远端仓库把远端分支featrue的提交合并到远端分支develop上老板为了规范也”装模做样“的做了一次代码审核。 好了老板自己审核好自己的代码后进行了合并。 此时测试人员假设是员工1需要测试老板的代码那么就需要得到本地的release因此他需要先请求远端分支release是基于远端分支develop分裂出来的因此提交了代码评审。 此时如果测试人员测试通过了老板的代码那么就可以请求把release远端分支的代码和合并到master远端分支上的员工使用PR告知老板然后老板直接通过了该审查。 并且测试分支也被删除了。 当然如果release远端分支出现了问题就需要回去检查develop远端分支是否存在这个问题如果有问题就从feature远端分支上进行debug然后合并到develop远端分支然后将新的develop分支合并到release远端分支在进行测试知道没有bug。
剩下的几个分支和相关流程实际上和我们之前讲的大差不差您可以自己试一试… 注意最后再强调一遍只有适合自己团队的分支模型而没有最完美的分支模型。 4.5.代码部署
这个可以在流水线里研究不过在gitee上是需要付费的相关的操作请查看gitee的文档。