大家来谈一谈 Git 提交的规范

本贴最后更新于 1589 天前,其中的信息可能已经物是人非

最近要带一批实习生,由于之前本身 Git 提交也不是很规范,这次促使团队需要制定一些代码的规范,目前在编写团队的 Git 代码管理规范,想问一下大家平时都是怎么管理的。

  1. 分支的建立维护
  2. tag 的建立
  3. commit message 的填写格式
    ……

请大家在以上几个方面谈一谈自己平时工作中的做法以及效果。
大家可以畅所欲言,自由扩展其他方面。

  • Git

    Git 是 Linux Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件。

    205 引用 • 357 回帖
  • Q&A

    提问之前请先看《提问的智慧》,好的问题比好的答案更有价值。

    6537 引用 • 29395 回帖 • 246 关注

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...
  • someone9891

    这个到时候要发出去大家看的,别自己搞得有问题发出去被人笑话。。

  • someone1764 1 4 评论

    无数次跟组员说,定期 merge master,然后他们还是能把冲突的代码丢上来...

    1 回复
    分支保护如何呢?
    someone9891
    各自建临时分支,review 以后单独一个人 merge ?
    someone9891
    一个功能一个分支,然后还是把 <<<<<<<<< 弄上来了
    someone1764
    @mymoshou 我觉得这个人可以不要了
    someone9891
  • someone9891 1 评论

    另外后续可能打算生成更新日志,commit message 如何填写能让 log 看起来顺眼点。

    1 回复
    我们这边是这样处理,维护 dev 分支作为主分支(主分支不允许直接 push),然后每个人做的任务从主分支 branch,做完测试通过了就起 pr,reviewer review 之后 merge 到主分支,到发版本的时候就 frozen 主分支,然后从主分支 branch 出来一个 release 分支,如果这个 release 分支测试通过没有什么需要 fix 的,那就不需要 merge 回去主分支,如果有 fix,等出版本之后就需要 merge 到主分支,另外如果需要出 hot fix 就也是从主分支 branch,出了 fix 之后再 merge 回去主分支
    Devin
  • 88250 1

    用这个增加情趣 https://gitmoji.carloscuesta.me/

    1 回复
  • someone27889 1 1 评论

    因为管理了好多项目,所以这个方面还是研究过一下子 ,主要使用了 GitFlow 规范
    分支分为
    新功能分支(feature),
    修复分支(fix),
    补丁分支(hotfix),
    版本分支(release),
    主分支(master),
    开发分支(dev)

    具体提交格式为

    <type>[optional scope]: <description>
    
    [optional body]
    
    [optional footer]
    
    * feat 新功能(feature)表示在代码库中新增了一个功能(这和语义化版本中的 [`MINOR`](http://semver.org/#summary) 相对应)
        
    * fix 表示在代码库中修复了一个 bug(这和语义化版本中的 [`PATCH`](http://semver.org/#summary) 相对应)
        
    * docs 文档(documentation
        
    * style (格式化, 缺失分号等; 不包括生产代码变动)
        
    * refactor (重构代码)
        
    * perf (性能优化)
        
    * test (添加缺失的测试, 重构测试, 不包括生产代码变动)
        
    * chore (更新grunt任务等; 不包括生产代码变动)
    
    scope:一个可选的修改范围,用于标识此次提交主要涉及到代码中哪个模块。
    
    description:简明扼要描述本次提交的内容,首字母无需大写,结尾不需要使用 `.`。
    
    optional body:详细描述本次提交,比如此次变更的动机,如需换行,则使用 `|`。
    
    optional footer:描述与之关联的 issue 或 break change。
    

    commit Message 为 :

    fix(module:baseuser): fix username field error
    
    BREAKING CHANGE: xxxxxx
    
    feature(module:auth): add oauth2 module
    
    BREAKING CHANGE: 原登陆方式发生改变,现在提供jar oauth.auth(username,password):true|false
    

    每次写新特性的时候要在 dev 拉一下最新代码然后 迁出 特性分支 比如要增加一个 用户的新增功能 分支名称可以为 feature/userAdd

    然后开发完了推上去给 dev 分支合并,合并完了跑 ci 测试,ci 测试没问题,可以合并到 master
    当 master 改动较多的时候就可以 发布一个 release 版本 从 master/dev 迁出 然后打 tag ,写 CHANGELOG.md(应该有工具能生成), 发布到 gitlab/github,然后然后然后合并到 master

    资料转自:https://semlinker.com/ng-verson-manage/
    如果多人开发,那么请配置 validate-commit 来确保所有人提交格式符合 GitFlow 规范:https://blog.eiyouhe.com/articles/2019/08/19/1566176660956.html?utm_source=hacpai.com#b3_solo_h1_7
    另外 CHANGELOG 也有 Cli,可以试试:https://blog.eiyouhe.com/articles/2019/08/19/1566176660956.html#b3_solo_h2_12

    所以 100 分给我吧,我求求你了trollface

    3 操作
    someone27889 在 2019-12-18 09:04:50 更新了该回帖
    someone27889 在 2019-12-18 09:03:48 更新了该回帖
    someone27889 在 2019-12-18 09:00:23 更新了该回帖
    你先别求我。。我看看其他人的建议。分给你说不定别人都不屑回答了trollface
    someone9891
  • 然后 SourceTree 这个工具自带 GitFlow

    image.png

  • 我们用 git 没那么多乱七八糟的,master 用于发布,分支用于开发,分支名不限制,但是依我的习惯的话要以开发的目标作为分支名,后缀开发者或者时间之类的,commit message 格式也没限制过,但是尽量保证一次 commit 是完整的
    我还喜欢用 gitemoji 来标记本次提交的标记,可以参考 symphony 的提交记录,我就是从这里学的
    其实比较重要的就是要让开发者知道每次拉分支的时候,从 master 拉去最新的代码再创建

  • fenglinbiaoxie 1

    我们都是 git flow 那一套流程,统一在 develop 分支上开发,然后推送远端,最后在合并到 master1B73BB63CA67FBD80928626612C8F0F8.png

  • MistRay 1 1 评论

    git flow 想要严格遵守不是特别容易.这玩意还是有学习成本的.
    我前段时间在公司推过这个规范,但基本没人关心怎么提交代码.
    现在用起来的基本只有 master,feature,develop.
    剩下分支种类,只要我不和他们说,他们就不用.
    补充:
    如果没有把 ci 用起来的话,分支合来合去,心里会很没底.

    1 回复
    目前的话我是参照 Git flow 简化了一下,到时候跟其他同事讨论讨论,再发出去给大家吧
    someone9891
  • fenglinbiaoxie

    确实是 git flow 学习成本太大,我们用着用着也都是老一套了5VPM62M2FGAISYSO.jpg

  • adlered

    个人开发,看得懂就行。大功能开分支,小功能直接推 master doge

  • 原来 D 佬你一直用的都是这个!!!!
    收藏了

  • someone9891 4 评论

    @participants
    image.png
    我参照 coding 这个流程,把其中的 master 换成 dev ,他这个持续集成的部分我集成到 test 环境,完了之后 合并到 master 大家觉得如何?

    1 回复
    有点类似 git flow
    someone1764
    @mymoshou 是有点类似,我是想在 git flow 的基础上尽量简化
    someone9891
    其实我有个疑问,测试是在 dev 上进行是吧?假如同时多个功能要测试怎么处理
    someone1764
    @mymoshou 那就合并到 dev 来啊,不然难道每个 分支还要部署一套测试吗?一般开发阶段自测,自测完了合并到 dev ,会持续集成到测试环境的。
    someone9891
  • 积分已经到手了.剩下的已经不重要了,嘿嘿嘿嘿trollface

    1 回复
  • someone9891 6 评论

    image.png

    1 回复
    1 操作
    someone9891 在 2019-12-19 10:51:07 更新了该回帖
    无法访问
    someone1764
    @mymoshou 可以的啊
    someone9891
    图片地址是 localhost
    88250
    @88250 我复制过来了。。。怪不得我这里可以看到
    someone9891
    @88250 可能复制了个链接
    someone9891
    现在应该是可以了
    someone9891
  • someone9891

    我新发的这个图你觉得如何呢?

  • xuanskyer 1 1 评论

    这种问题其实很简单:

    1. 规范代码提交规范,合法性检测,不符合的代码无法提交
    2. 建立惩罚制度
    1 回复
    那回想起来,主要就是因为公司没有奖励机制,所以不好建立惩罚机制导致的
    someone1764
  • 不只是 commit message 和分支命名规范。我司的代码仓库有 PR 钩子,引入 coverity,对提交的代码用 SonarQube 进行静态分析,不符合代码质量规则的 PR 将无法合并

    截屏 20191219 下午 12.58.12.png

    1 回复
    1 操作
    someone48938 在 2019-12-19 13:45:37 更新了该回帖
  • 我个人认为这东西光靠一个人根本推不动.
    之前有就有了,如果没有的话就很难在短期内建设好投入使用.

  • 这个奖惩很难搞,如果没处理好,容易把团队气氛弄得很僵.

  • dafsic

    rebase 也很关键,merge 参数--no-ff ,rebase 参数-i

    1 回复
  • 代码规范和提交流程一般在两个时间段去定比较好。

    1. 项目的流程设计时;
    2. 项目的一个阶段已经结束,并且不着急赶着下一个阶段时。

    因为这些东西实际上说复杂不复杂,如果像我们这样弄过的人很好理解,大家统一一下风格和顺序就好了
    但如果你要是需要再带点培训性质的去弄,那可能就需要耗费一定的时间和开发时间,再加上本身可能有些人就对项目手忙脚乱的。

  • oathsign 1

    如果题主的库是放在 Github 上的,最好的办法就是符合 Github 的提交规范。例如首字母大写,标题用祈使句,内容和标题隔行写等等这些。因为你符合了这些规范不仅仅发邮件的时候内容清晰 ,而且会有意想不到的福利。例如可以用#+issue 的编号来标记并关闭相关的 issue😋 总之,规范要统一,要重视,更要专业。最讨厌一个项目几千个提交日志全是 commit it! 还不如不写

  • remixjc

    建议自己写一篇文章,制定自己的规范,让他们遵守就可以了。
    大致内容如下:

    1. 统一 GUI 工具,比如小乌龟TortoiseGit
    2. 分支创建与维护交给自己来管理
    3. 分享 git 的操作基本内容等,例如:https://www.remixjc.cn/articles/2019/12/20/1576806915902.html
    4. 在平时操作时有问题及时问
    5. 分享发现冲突与解决冲突的方法,避免强制推送导致代码覆盖,合并时一定不要忘记把别人的代码合并
  • yangyujiao

    哈哈哈。。。
    我们用 svn!!!
    我每次看到开发操作,切换分支,合并代码的都看着累。。。

    不过我们提交日志写的很好,因为我们用 jira,必须带着 jira 号跟描述。我们的每一个任务都有 jira 号,包含需求、bug、数据修复、优化等。

    我以前公司也是用 git,还特意培训过,我记得一家培训的是 git flow 的,一家是培训 github 的。

    2 回复
  • AkiYuo 3 评论

    用 SVN 说明公司技术管理挺务实的,非大型分布式开发的项目根本没必要用 Git,根本就是浪费大家时间。SVN 就简单多了,只能更新解决冲突才能提交,基本杜绝了项目库被覆盖的风险。

    务实个毛,明明就是历史遗留问题,,,我们一个大项目,分出各种模块,其实我觉得很适合用 git 啊,而且因为各种紧急升级、版本升级,好多的分支,导致大家切来切去的提交,都好几次提交漏了。。。写一行代码,要切 3、4 个分支提交代码,我每次给大家发注意事项都觉得累。
    yangyujiao
    svn 有一个持续集成的问题,我测试环境和生产环境都是自动部署就有问题了
    someone9891
    代码库被覆盖?你如果不对 git 有一定了解,想把代码弄丢且无法恢复都难... (最多就是把分支图弄得很难看)
    MistRay
  • Devin

    我们也是用 jira,不过我们用的是 git,必须带 jira id 才能 push,如果你很多次 commit,有一次不带都不行

  • someone9891 1 评论

    哎呦,这个竟然还被选为优选了。。。

    大家的回答都挺有价值的。
    88250
  • Ahian 1 1 赞同 1 评论

    加一段我写的 gitlab hooks 的脚本,主要是校验 commit msg

       msg=`git show $newrev -s --format=%B`
    
       if [[ $msg =~ ^(feat|fix|test|refactor|docs|style|chroe).*:.*$ ]]; then
            echo "【commit message 通过检查】!"
       else
       echo "【commit message 不符合规范】"      
       echo "【缺少关键字: [feat,fix,docs,style,refactor,test,chore]】"
       echo "【格式:<类型>(<影响范围>): <简要概述>】"
       echo "【eg: feat(user): add the user login】"
       echo "【eg: fix(影响范围):#禅道编号 】"
       echo "【修改已提交message命令:git --amend -m <new message>】"
       exit 1
       break
       fi
    
    
    Good。
    taoism-o
  • ellenbboe

    进来学习

  • 老铁,我要剽了你的头像...

请输入回帖内容 ...

推荐标签 标签

  • gRpc
    10 引用 • 8 回帖 • 54 关注
  • sts
    2 引用 • 2 回帖 • 148 关注
  • Scala

    Scala 是一门多范式的编程语言,集成面向对象编程和函数式编程的各种特性。

    13 引用 • 11 回帖 • 108 关注
  • Windows

    Microsoft Windows 是美国微软公司研发的一套操作系统,它问世于 1985 年,起初仅仅是 Microsoft-DOS 模拟环境,后续的系统版本由于微软不断的更新升级,不但易用,也慢慢的成为家家户户人们最喜爱的操作系统。

    215 引用 • 462 回帖 • 1 关注
  • Hprose

    Hprose 是一款先进的轻量级、跨语言、跨平台、无侵入式、高性能动态远程对象调用引擎库。它不仅简单易用,而且功能强大。你无需专门学习,只需看上几眼,就能用它轻松构建分布式应用系统。

    9 引用 • 17 回帖 • 598 关注
  • iOS

    iOS 是由苹果公司开发的移动操作系统,最早于 2007 年 1 月 9 日的 Macworld 大会上公布这个系统,最初是设计给 iPhone 使用的,后来陆续套用到 iPod touch、iPad 以及 Apple TV 等产品上。iOS 与苹果的 Mac OS X 操作系统一样,属于类 Unix 的商业操作系统。

    84 引用 • 139 回帖
  • IPFS

    IPFS(InterPlanetary File System,星际文件系统)是永久的、去中心化保存和共享文件的方法,这是一种内容可寻址、版本化、点对点超媒体的分布式协议。请浏览 IPFS 入门笔记了解更多细节。

    20 引用 • 245 回帖 • 230 关注
  • 开源

    Open Source, Open Mind, Open Sight, Open Future!

    396 引用 • 3416 回帖
  • Sillot

    Sillot (汐洛)孵化自思源笔记,致力于服务智慧新彖乄,具有彖乄驱动、极致优雅、开发者友好的特点
    Github 地址:https://github.com/Hi-Windom/Sillot

    15 引用 • 6 回帖 • 25 关注
  • Latke

    Latke 是一款以 JSON 为主的 Java Web 框架。

    70 引用 • 532 回帖 • 712 关注
  • RIP

    愿逝者安息!

    8 引用 • 92 回帖 • 291 关注
  • 京东

    京东是中国最大的自营式电商企业,2015 年第一季度在中国自营式 B2C 电商市场的占有率为 56.3%。2014 年 5 月,京东在美国纳斯达克证券交易所正式挂牌上市(股票代码:JD),是中国第一个成功赴美上市的大型综合型电商平台,与腾讯、百度等中国互联网巨头共同跻身全球前十大互联网公司排行榜。

    14 引用 • 102 回帖 • 403 关注
  • Hadoop

    Hadoop 是由 Apache 基金会所开发的一个分布式系统基础架构。用户可以在不了解分布式底层细节的情况下,开发分布式程序。充分利用集群的威力进行高速运算和存储。

    82 引用 • 122 回帖 • 617 关注
  • JRebel

    JRebel 是一款 Java 虚拟机插件,它使得 Java 程序员能在不进行重部署的情况下,即时看到代码的改变对一个应用程序带来的影响。

    26 引用 • 78 回帖 • 622 关注
  • TensorFlow

    TensorFlow 是一个采用数据流图(data flow graphs),用于数值计算的开源软件库。节点(Nodes)在图中表示数学操作,图中的线(edges)则表示在节点间相互联系的多维数据数组,即张量(tensor)。

    20 引用 • 19 回帖 • 3 关注
  • JavaScript

    JavaScript 一种动态类型、弱类型、基于原型的直译式脚本语言,内置支持类型。它的解释器被称为 JavaScript 引擎,为浏览器的一部分,广泛用于客户端的脚本语言,最早是在 HTML 网页上使用,用来给 HTML 网页增加动态功能。

    710 引用 • 1173 回帖 • 173 关注
  • Telegram

    Telegram 是一个非盈利性、基于云端的即时消息服务。它提供了支持各大操作系统平台的开源的客户端,也提供了很多强大的 APIs 给开发者创建自己的客户端和机器人。

    5 引用 • 35 回帖
  • Mac

    Mac 是苹果公司自 1984 年起以“Macintosh”开始开发的个人消费型计算机,如:iMac、Mac mini、Macbook Air、Macbook Pro、Macbook、Mac Pro 等计算机。

    164 引用 • 594 回帖
  • 强迫症

    强迫症(OCD)属于焦虑障碍的一种类型,是一组以强迫思维和强迫行为为主要临床表现的神经精神疾病,其特点为有意识的强迫和反强迫并存,一些毫无意义、甚至违背自己意愿的想法或冲动反反复复侵入患者的日常生活。

    15 引用 • 161 回帖 • 4 关注
  • FlowUs

    FlowUs.息流 个人及团队的新一代生产力工具。

    让复杂的信息管理更轻松、自由、充满创意。

    1 引用 • 1 关注
  • 宕机

    宕机,多指一些网站、游戏、网络应用等服务器一种区别于正常运行的状态,也叫“Down 机”、“当机”或“死机”。宕机状态不仅仅是指服务器“挂掉了”、“死机了”状态,也包括服务器假死、停用、关闭等一些原因而导致出现的不能够正常运行的状态。

    13 引用 • 82 回帖 • 37 关注
  • Ant-Design

    Ant Design 是服务于企业级产品的设计体系,基于确定和自然的设计价值观上的模块化解决方案,让设计者和开发者专注于更好的用户体验。

    17 引用 • 23 回帖 • 2 关注
  • WebClipper

    Web Clipper 是一款浏览器剪藏扩展,它可以帮助你把网页内容剪藏到本地。

    3 引用 • 9 回帖 • 6 关注
  • 新人

    让我们欢迎这对新人。哦,不好意思说错了,让我们欢迎这位新人!
    新手上路,请谨慎驾驶!

    51 引用 • 226 回帖
  • Tomcat

    Tomcat 最早是由 Sun Microsystems 开发的一个 Servlet 容器,在 1999 年被捐献给 ASF(Apache Software Foundation),隶属于 Jakarta 项目,现在已经独立为一个顶级项目。Tomcat 主要实现了 JavaEE 中的 Servlet、JSP 规范,同时也提供 HTTP 服务,是市场上非常流行的 Java Web 容器。

    162 引用 • 529 回帖 • 1 关注
  • Caddy

    Caddy 是一款默认自动启用 HTTPS 的 HTTP/2 Web 服务器。

    10 引用 • 54 回帖 • 127 关注
  • Pipe

    Pipe 是一款小而美的开源博客平台。Pipe 有着非常活跃的社区,可将文章作为帖子推送到社区,来自社区的回帖将作为博客评论进行联动(具体细节请浏览 B3log 构思 - 分布式社区网络)。

    这是一种全新的网络社区体验,让热爱记录和分享的你不再感到孤单!

    131 引用 • 1114 回帖 • 151 关注