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

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

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

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

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

  • Git

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

    171 引用 • 338 回帖 • 636 关注
  • Q&A

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

    1730 引用 • 11423 回帖 • 584 关注

赞助商 我要投放

31 回帖
请输入回帖内容 ...
  • someone9891

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

  • mymoshou 1 4 评论

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

    1 回复
    分支保护如何呢?
    someone9891
    各自建临时分支,review 以后单独一个人 merge ?
    someone9891
    一个功能一个分支,然后还是把 <<<<<<<<< 弄上来了
    mymoshou
    @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 回复
  • ferried 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 操作
    ferried 在 2019-12-18 09:04:50 更新了该回帖
    ferried 在 2019-12-18 09:03:48 更新了该回帖
    ferried 在 2019-12-18 09:00:23 更新了该回帖
    你先别求我。。我看看其他人的建议。分给你说不定别人都不屑回答了trollface
    someone9891
  • ferried

    然后 SourceTree 这个工具自带 GitFlow

    image.png

  • ZephyrJung 1

    我们用 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

  • taoism-o

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

  • someone9891 4 评论

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

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

    积分已经到手了。剩下的已经不重要了,嘿嘿嘿嘿trollface

    1 回复
  • someone9891 6 评论

    image.png

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

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

  • xuanskyer 1 1 评论

    这种问题其实很简单:

    1. 规范代码提交规范,合法性检测,不符合的代码无法提交
    2. 建立惩罚制度
    1 回复
    那回想起来,主要就是因为公司没有奖励机制,所以不好建立惩罚机制导致的
    mymoshou
  • CismonX

    不只是 commit message 和分支命名规范。我司的代码仓库有 PR 钩子,引入 coverity,对提交的代码用 SonarQube 进行静态分析,不符合代码质量规则的 PR 将无法合并

    截屏 20191219 下午 12.58.12.png

    1 回复
    1 操作
    CismonX 在 2019-12-19 13:45:37 更新了该回帖
  • MistRay

    我个人认为这东西光靠一个人根本推不动。
    之前有就有了,如果没有的话就很难在短期内建设好投入使用。

  • MistRay

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

  • dafsic

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

    1 回复
  • taoism-o

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

    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

    进来学习

  • ferried

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

请输入回帖内容 ...