1. 首页
  2. IT资讯

团队开发中 Git 最佳实践,不给队友拖后腿

“u003Cpu003Eu003Cstrongu003E蓝色字体u003Cu002Fstrongu003E,选择“标星公众号”u003Cu002Fpu003Eu003Cpu003E优质文章,第一时间送达u003Cu002Fpu003Eu003Cimg src=”http:u002Fu002Fp1.pstatp.comu002Flargeu002Fpgc-imageu002FRbBH7dh8YhRwXK” img_width=”640″ img_height=”18″ alt=”团队开发中 Git 最佳实践,不给队友拖后腿” inline=”0″u003Eu003Cpu003E本文地址:https:u002Fu002Fsegmentfaultu003Ci class=”chrome-extension-mutihighlight chrome-extension-mutihighlight-style-6″u003E.comu003Cu002Fiu003Eu002Fau002F1190000004963u003Ci class=”chrome-extension-mutihighlight chrome-extension-mutihighlight-style-2″u003E64u003Cu002Fiu003E1u003Cu002Fpu003Eu003Cblockquoteu003Eu003Cpu003E在 2005 年的某一天,Linux 之父 Linus Torvalds 发布了他的又一个里程碑作品——Git。它的出现改变了软件开发流程,u003Ci class=”chrome-extension-mutihighlight chrome-extension-mutihighlight-style-6″u003E大大u003Cu002Fiu003E地提高了开发流畅度!直到现在仍十分流行,完全没有衰退的迹象。u003Cu002Fpu003Eu003Cu002Fblockquoteu003Eu003Cpu003E本文不是一篇 Git 入门教程,Git 入门教程大家可以参考:Git 教程合集。u003Cu002Fpu003Eu003Cpu003E本文要从具体实践角度,尤其是在团队协作中,阐述如何去好好地应用 Git。既然是讲在团队中的应用实践,我就尽可能地结合实际场景来讲述。u003Cu002Fpu003Eu003Cpu003Eu003Cu002Fpu003Eu003Ch1 toutiao-origin=”h2″u003E1.习惯养成u003Cu002Fh1u003Eu003Cpu003E如果一个团队在使用 Git 时没有一些规范,那么将是一场难以醒来的噩梦!然而,规范固然重要,但更重要的是个人素质,在使用 Git 时需要自己养成良好的习惯。u003Cu002Fpu003Eu003Cpu003Eu003Cu002Fpu003Eu003Ch2 toutiao-origin=”h3″u003E1.1 提交u003Cu002Fh2u003Eu003Cpu003E如何去写一个提交信息,在具体开发工作中主要需要遵守的原则就是「使每次提交都有质量」,只要坚持做到以下几点就 OK 了:u003Cu002Fpu003Eu003Culu003Eu003Cliu003Eu003Cpu003E提交时的粒度是一个小功能点或者一个 bug fix,这样进行恢复等的操作时能够将「误伤」减到最低;u003Cu002Fpu003Eu003Cu002Fliu003Eu003Cliu003Eu003Cpu003E用一句简练的话写在第一行,然后空一行稍微详细阐述该提交所增加或修改的地方;u003Cu002Fpu003Eu003Cu002Fliu003Eu003Cliu003Eu003Cpu003E不要每提交一次就推送一次,多积攒几个提交后一次性推送,这样可以避免在进行一次提交后发现代码中还有小错误。u003Cu002Fpu003Eu003Cu002Fliu003Eu003Cu002Fulu003Eu003Cpu003E假如已经把代码提交了,对这次提交的内容进行检查时发现里面有个变量单词拼错了或者其他失误,只要还没有推送到远程,就有一个不被他人发觉你的疏忽的补救方法——首先,把失误修正之后提交,可以用与上次提交同样的信息。u003Cu002Fpu003Eu003Cimg src=”http:u002Fu002Fp3.pstatp.comu002Flargeu002Fpgc-imageu002FRc8Eupm1bEGGMB” img_width=”800″ img_height=”93″ alt=”团队开发中 Git 最佳实践,不给队友拖后腿” inline=”0″u003Eu003Cpu003E然后,终端中执行命令 u003Ccodeu003Egit rebase -i [SHA]u003Cu002Fcodeu003E,其中 SHA 是上一次提交之前的那次提交的,在这里是 3b22372。u003Cu002Fpu003Eu003Cimg src=”http:u002Fu002Fp1.pstatp.comu002Flargeu002Fpgc-imageu002FRc8EupyGSdAaGw” img_width=”800″ img_height=”558″ alt=”团队开发中 Git 最佳实践,不给队友拖后腿” inline=”0″u003Eu003Cpu003E最后,这样就将两次提交的节点合并成一个,甚至能够修改提交信息!u003Cu002Fpu003Eu003Cimg src=”http:u002Fu002Fp3.pstatp.comu002Flargeu002Fpgc-imageu002FRc8EuqCEvTCfnx” img_width=”800″ img_height=”59″ alt=”团队开发中 Git 最佳实践,不给队友拖后腿” inline=”0″u003Eu003Cpu003E谁说历史不可篡改了?u003Cstrongu003E前提是,想要合并的那几次提交还没有推送到远程!u003Cu002Fstrongu003Eu003Cu002Fpu003Eu003Ch2 toutiao-origin=”h3″u003E1.2 推送u003Cu002Fh2u003Eu003Cpu003E当自己一个人进行开发时,在功能完成之前不要急着创建远程分支。u003Cu002Fpu003Eu003Cpu003Eu003Cu002Fpu003Eu003Ch2 toutiao-origin=”h3″u003E1.3 拉取u003Cu002Fh2u003Eu003Cpu003E请读张文钿所写的《使用 git rebase 避免無謂的 merge》:https:u002Fu002Fihower.twu002Fblogu002Farchivesu002F3843。u003Cu002Fpu003Eu003Cpu003Eu003Cu002Fpu003Eu003Ch2 toutiao-origin=”h3″u003E1.4 合并u003Cu002Fh2u003Eu003Cpu003E在将其他分支的代码合并到当前分支时,如果那个分支是当前分支的父分支,为了保持图表的可读性和可追踪性,可以考虑用 git rebase 来代替 git merge;反过来或者不是父子关系的两个分支以及互相已经 git merge 过的分支,就不要采用 git rebase 了,避免出现重复的冲突和提交节点。u003Cu002Fpu003Eu003Cpu003Eu003Cu002Fpu003Eu003Ch1 toutiao-origin=”h2″u003E2.分支管理u003Cu002Fh1u003Eu003Cpu003EGit 的一大特点就是可以创建很多分支并行开发。正因为它的灵活性,团队中如果没有一个成熟的分支模型的话,那将会是一团糟。u003Cu002Fpu003Eu003Cimg src=”http:u002Fu002Fp3.pstatp.comu002Flargeu002Fpgc-imageu002FRc8EuqO1CbSG7a” img_width=”638″ img_height=”479″ alt=”团队开发中 Git 最佳实践,不给队友拖后腿” inline=”0″u003Eu003Cpu003E要是谁真把这么乱的提交图表摆在我面前,就给他一个上勾拳!u003Cu002Fpu003Eu003Cpu003Eu003Cu002Fpu003Eu003Ch2 toutiao-origin=”h3″u003E2.1 分支模型u003Cu002Fh2u003Eu003Cpu003E有个很成熟的叫 Git Flow 的分支模型,它能够应对 99% 的场景,剩下的那 1% 留给几乎不存在的极度变态的场景。u003Cu002Fpu003Eu003Cpu003E需要注意的是,u003Cstrongu003E它只是一个模型,而不是一个工具;u003Cu002Fstrongu003Eu003Cstrongu003E你可以用工具去应用这个模型,也可以用最朴实的命令行。所以,重要的是理解概念,不要执着于实行的手段。u003Cu002Fstrongu003Eu003Cu002Fpu003Eu003Cpu003E简单说来,Git Flow 就是给原本普普通通的分支赋予了不同的「职责」:u003Cu002Fpu003Eu003Culu003Eu003Cliu003Eu003Cpu003Eu003Cstrongu003Emasteru003Cu002Fstrongu003E——最为稳定功能最为完整的随时可发布的代码;u003Cu002Fpu003Eu003Cu002Fliu003Eu003Cliu003Eu003Cpu003Ehotfix——修复线上代码的 bug;u003Cu002Fpu003Eu003Cu002Fliu003Eu003Cliu003Eu003Cpu003Eu003Cstrongu003Edevelopu003Cu002Fstrongu003E——永远是功能最新最全的分支;u003Cu002Fpu003Eu003Cu002Fliu003Eu003Cliu003Eu003Cpu003Efeature——某个功能点正在开发阶段;u003Cu002Fpu003Eu003Cu002Fliu003Eu003Cliu003Eu003Cpu003Erelease——发布定期要上线的功能。u003Cu002Fpu003Eu003Cu002Fliu003Eu003Cu002Fulu003Eu003Cpu003E看到上面的「master」和「develop」加粗了吧?代表它们是「主要分支」,其他的分支是基于它们派生出来的。主要分支每种类型只能有一个,派生分支每个类型可以同时存在多个。各类型分支之间的关系用一张图来体现就是:u003Cu002Fpu003Eu003Cimg src=”http:u002Fu002Fp3.pstatp.comu002Flargeu002Fpgc-imageu002FRc8EvFa3hb26tU” img_width=”614″ img_height=”380″ alt=”团队开发中 Git 最佳实践,不给队友拖后腿” inline=”0″u003Eu003Cpu003E更多信息可参考 u003Ci class=”chrome-extension-mutihighlight chrome-extension-mutihighlight-style-1″u003Exiu003Cu002Fiu003Erong 所整理的《Git工作流指南》:https:u002Fu002Fgithubu003Ci class=”chrome-extension-mutihighlight chrome-extension-mutihighlight-style-6″u003E.comu003Cu002Fiu003Eu002Fu003Ci class=”chrome-extension-mutihighlight chrome-extension-mutihighlight-style-1″u003Exiu003Cu002Fiu003Erongu002Fmy-gitu002Fblobu002Fmasteru002Fgit-workflow-tutorial.mdu003Cu002Fpu003Eu003Cpu003Eu003Cu002Fpu003Eu003Ch2 toutiao-origin=”h3″u003E2.2 工具选择u003Cu002Fh2u003Eu003Cpu003E一直不喜欢「**最好用」这种命题,主观性太强,不会有一个结论。对于工具的选择,我一直都是秉承「哪个能更好地解决问题就用哪个」这个原则。所以,只要不影响到团队,用什么工具都是可以接受的。但根据多数开发人员的素质情况来看,建议使用图形化工具,例如 SourceTree(https:u002Fu002Fu003Ci class=”chrome-extension-mutihighlight chrome-extension-mutihighlight-style-2″u003Ewwwu003Cu002Fiu003E.sourcetreeappu003Ci class=”chrome-extension-mutihighlight chrome-extension-mutihighlight-style-6″u003E.comu003Cu002Fiu003E)。如果想用命令行,可以啊!先在心里问下自己:「我 Git 牛逼不?会不会惹麻烦给别人?」u003Cu002Fpu003Eu003Cpu003E在团队中应用 Git Flow 时,推荐使用 SourceTree 与 GitLab (https:u002Fu002Fgitlabu003Ci class=”chrome-extension-mutihighlight chrome-extension-mutihighlight-style-6″u003E.comu003Cu002Fiu003Eu002F)配合的形式:u003Cu002Fpu003Eu003Culu003Eu003Cliu003Eu003Cpu003E用 SourceTree 创建 feature 等分支以及本地的分支合并、删除;u003Cu002Fpu003Eu003Cu002Fliu003Eu003Cliu003Eu003Cpu003E用 GitLab 做代码审核和远程的分支合并、删除。u003Cu002Fpu003Eu003Cu002Fliu003Eu003Cu002Fulu003Eu003Cpu003ESourceTree 和 GitLab 应该是相辅相成的存在,而不是互相取代。u003Cu002Fpu003Eu003Cpu003Eu003Cu002Fpu003Eu003Ch1 toutiao-origin=”h2″u003E3.事前准备u003Cu002Fh1u003Eu003Cpu003E为了将一些规范性的东西和 Git Flow 的部分操作自动化处理,要对 SourceTree 和 GitLab 进行一下配置。u003Cu002Fpu003Eu003Cpu003Eu003Cu002Fpu003Eu003Ch2 toutiao-origin=”h3″u003E3.1 SourceTreeu003Cu002Fh2u003Eu003Cpu003E按下 command + , 调出「Preferences」界面并切换到「Git」标签,勾选「Use rebase instead of merge by default for tracked branches」和「Do not fast-forward when merging, always create commit」。u003Cu002Fpu003Eu003Cimg src=”http:u002Fu002Fp3.pstatp.comu002Flargeu002Fpgc-imageu002FRc8EvFs2XxxYKC” img_width=”800″ img_height=”652″ alt=”团队开发中 Git 最佳实践,不给队友拖后腿” inline=”0″u003Eu003Cpu003E这样设置之后,在点「Pull」按钮拉取代码时会自动执行 git pull –rebase;并且,每次合并时会自动创建新的包含分支信息的提交节点。u003Cu002Fpu003Eu003Cpu003E接下来,点击工具栏中的「Git Flow」按钮将相关的流程自动化。如果没有特殊需求,直接按下对话框中的「OK」就好了。初始化完成后会自动切换到 develop 分支。u003Cu002Fpu003Eu003Cimg src=”http:u002Fu002Fp1.pstatp.comu002Flargeu002Fpgc-imageu002FRc8EvG21nyvpaO” img_width=”800″ img_height=”490″ alt=”团队开发中 Git 最佳实践,不给队友拖后腿” inline=”0″u003Eu003Cpu003E这下再点「Git Flow」按钮所弹出的对话框就是选择创建分支类型的了。u003Cu002Fpu003Eu003Cpu003Eu003Cu002Fpu003Eu003Ch2 toutiao-origin=”h3″u003E3.2 GitLabu003Cu002Fh2u003Eu003Cpu003E在创建项目仓库后一定要把主要分支,也就是 master 和 develop 给保护起来。为它们设置权限,只有项目负责人可以进行推送和删除等操作。u003Cu002Fpu003Eu003Cimg src=”http:u002Fu002Fp1.pstatp.comu002Flargeu002Fpgc-imageu002FRc8EvGBAm2M0C2″ img_width=”800″ img_height=”667″ alt=”团队开发中 Git 最佳实践,不给队友拖后腿” inline=”0″u003Eu003Cpu003E被保护的分支在列表中会有特殊的标记进行区分。u003Cu002Fpu003Eu003Cpu003Eu003Cu002Fpu003Eu003Ch1 toutiao-origin=”h2″u003E4.开发流程u003Cu002Fh1u003Eu003Cpu003E在引入 Git Flow 之后,所有工作都要围绕着它来展开,将原本的流程与之结合形成「基于 Git Flow 的开发流程」。u003Cu002Fpu003Eu003Cimg src=”http:u002Fu002Fp1.pstatp.comu002Flargeu002Fpgc-imageu002FRc8EvGJDoyVpRW” img_width=”800″ img_height=”734″ alt=”团队开发中 Git 最佳实践,不给队友拖后腿” inline=”0″u003Eu003Cpu003Eu003Cu002Fpu003Eu003Ch2 toutiao-origin=”h3″u003E4.1 开发功能u003Cu002Fh2u003Eu003Cpu003E在确定发布日期之后,将需要完成的内容细分一下分配出去,负责某个功能的开发人员利用 SourceTree 所提供的 Git Flow 工具创建一个对应的 feature 分支。如果是多人配合的话,创建分支并做一些初始化工作之后就推送创建远程分支;否则,直到功能开发完毕要合并进 develop 前,不要创建远程分支。u003Cu002Fpu003Eu003Cpu003E功能开发完并自测之后,先切换到 develop 分支将最新的代码拉取下来,再切换回自己负责的 feature 分支把 develop 分支的代码合并进来。合并方式参照上文中的「合并」,如果有冲突则自己和配合的人一起解决。u003Cu002Fpu003Eu003Cpu003E然后,到 GitLab 上的项目首页创建合并请求(merge request)。u003Cu002Fpu003Eu003Cimg src=”http:u002Fu002Fp3.pstatp.comu002Flargeu002Fpgc-imageu002FRc8Evqx9uTxaqa” img_width=”800″ img_height=”461″ alt=”团队开发中 Git 最佳实践,不给队友拖后腿” inline=”0″u003Eu003Cpu003E「来源分支」选择要被合并的 feature 分支且「目标分支」选择 develop 分支后点击「比较分支」按钮,在出现的表单中将处理人指派为项目负责人。u003Cu002Fpu003Eu003Cimg src=”http:u002Fu002Fp3.pstatp.comu002Flargeu002Fpgc-imageu002FRc8Evr91ARzzA5″ img_width=”800″ img_height=”394″ alt=”团队开发中 Git 最佳实践,不给队友拖后腿” inline=”0″u003Eu003Cpu003E项目负责人在收到合并请求时,应该先做下代码审核看看有没有明显的严重的错误;有问题就找负责开发的人去修改,没有就接受请求并删除对应的 feature 分支。u003Cu002Fpu003Eu003Cimg src=”http:u002Fu002Fp3.pstatp.comu002Flargeu002Fpgc-imageu002FRc8EvrIEJBmj80″ img_width=”800″ img_height=”624″ alt=”团队开发中 Git 最佳实践,不给队友拖后腿” inline=”0″u003Eu003Cpu003E在将某次发布的所需功能全部开发完成时,就可以交付测试了。u003Cu002Fpu003Eu003Cpu003Eu003Cu002Fpu003Eu003Ch2 toutiao-origin=”h3″u003E4.2 测试功能u003Cu002Fh2u003Eu003Cpu003E负责测试的人创建一个 release 分支部署到测试环境进行测试;若发现了 bug,相应的开发人员就在 release 分支上或者基于 release 分支创建一个分支进行修复。u003Cu002Fpu003Eu003Cpu003Eu003Cu002Fpu003Eu003Ch2 toutiao-origin=”h3″u003E4.3 发布上线u003Cu002Fh2u003Eu003Cpu003E当确保某次发布的功能可以发布时,负责发布的人将 release 分支合并进 master 和 develop 并打上 tag,然后打包发布到线上环境。u003Cu002Fpu003Eu003Cpu003E建议打 tag 时在信息中详细描述这次发布的内容,如:添加了哪些功能,修复了什么问题。u003Cu002Fpu003Eu003Cpu003Eu003Cu002Fpu003Eu003Ch2 toutiao-origin=”h3″u003E4.4 修复问题u003Cu002Fh2u003Eu003Cpu003E当发现线上环境的代码有小问题或者做些文案修改时,相关开发人员就在本地创建 hotfix 分支进行修改,具体操作参考「开发功能」。u003Cu002Fpu003Eu003Cpu003E如果是相当严重的问题,可能就得回滚到上一个 tag 的版本了。u003Cu002Fpu003Eu003Cpu003Eu003Cu002Fpu003Eu003Ch1 toutiao-origin=”h2″u003E5.额外说明u003Cu002Fh1u003Eu003Cpu003E这里所提到的事情,虽非必需,但知道之后却会如虎添翼。u003Cu002Fpu003Eu003Cpu003Eu003Cu002Fpu003Eu003Ch2 toutiao-origin=”h3″u003E5.1 分支命名u003Cu002Fh2u003Eu003Cpu003E除了主要分支的名字是固定的之外,派生分支是需要自己命名的,这里就要有个命名规范了。强烈推荐用如下形式:u003Cu002Fpu003Eu003Culu003Eu003Cliu003Eu003Cpu003Efeature——按照功能点(而不是需求)命名;u003Cu002Fpu003Eu003Cu002Fliu003Eu003Cliu003Eu003Cpu003Erelease——用发布时间命名,可以加上适当的前缀;u003Cu002Fpu003Eu003Cu002Fliu003Eu003Cliu003Eu003Cpu003Ehotfix——GitLab 的 issue 编号或 bug 性质等。u003Cu002Fpu003Eu003Cu002Fliu003Eu003Cu002Fulu003Eu003Cpu003E另外还有 tag,用语义化的版本号(http:u002Fu002Fsemver.orgu002Flangu002Fzh-CNu002F)命名。u003Cu002Fpu003Eu003Cpu003Eu003Cu002Fpu003Eu003Ch2 toutiao-origin=”h3″u003E5.2 发布日期u003Cu002Fh2u003Eu003Cpu003E发布频率是影响开发人员与测试人员的新陈代谢和心情的重要因素之一,频繁无规律的发布会导致内分泌失调、情绪暴躁,致使爆粗口、砸电脑等状况出现。所以,确保一个固定的发布周期至关重要!u003Cu002Fpu003Eu003Cpu003E在有一波或几波需求来临之时,想挡掉是不太可能的,但可以在评审时将它(们)分期,在某个发布日之前只做一部分。这是必须要控制住的!不然任由着需求方说「这个今天一定要上」「那个明天急着用」的话,技术人员就等着进医院吧!u003Cu002Fpu003Eu003Cpu003E如果喜欢本篇文章,欢迎转发、点赞。u003Ci class=”chrome-extension-mutihighlight chrome-extension-mutihighlight-style-1″u003E关注u003Cu002Fiu003E订阅号「Web项目聚集地」,回复「进群」即可进入无广告技术交流。u003Cu002Fpu003E”

原文始发于:团队开发中 Git 最佳实践,不给队友拖后腿

主题测试文章,只做测试使用。发布者:℅傍ㄖ免沦陷dε鬼,转转请注明出处:http://www.cxybcw.com/18090.html

联系我们

13687733322

在线咨询:点击这里给我发消息

邮件:1877088071@qq.com

工作时间:周一至周五,9:30-18:30,节假日休息

QR code