【Git】代码权限&分支管理

发布时间 2023-03-22 19:14:07作者: Joseph312

以Gitlab代码托管平台说明,也是目前应用最为广泛的企业搭建私服的选择。

1.  权限管理

[项目] 访问权限有3种::Private、Internal、Public
    Private:只有组成员才能看到
    Internal:只要登录的用户就能看到
    Public:所有人都能看到

[项目成员] 有五种权限及其适用对象:Guest、Reporter、Developer、Maintainer、Owner
    Guest:可以创建issue、发表评论,不能读写项目 【游客】
    Reporter:可以克隆代码,不能提交 【QA,PM】
    Developer:开发者可以克隆代码,开发,提交,push 【RD】
    Maintainer:管理员可以创建项目,添加tag,保护分支,添加项目成员 【RD组长】
    Owner:最高权限,管理组成员,删除项目,迁移项目 【研发负责人】


2.  分支管理

   2.1 基础概念:

版本冲突:合并分支时,当Git发现同一个文件中的同一块数据在两边的提交历史中都有变更,它将无法自动对其进行合并,产生冲突,需要人为介入修改,再合并。

# On branch master
一条合并命令:git merge featureA
两种合并方式:当执行merge命令时,git合并算法会根据当前分支(master)的最后一次commit与“特性分支”(featureA)的最后一次commit的情况,来决定合并方式是 “快进式合并” 还是 “递归三路合并”。

快进式合并:代码分支情况如下,默认合并方式为快进式合并,只是将master分支的HEAD指针右移,不会创建新的merge记录。

        

      缺点:若版本直接回滚,只会回退到featureA的上一次commit节点,原master分支上可能仍遗留featureA的代码,回退不干净。

递归三路合并:代码分支情况如下,合并方式为三路合并,此时merge算法会递归向前找到两个分支的共同“祖先”节点,判断各自文件修改点作为合并内容,若无代码冲突均会自动合并完成, 产生新的merge记录。

        

 

[所以推荐] 使用参数 “--no -ff”
git merge featureA --no -ff  #禁止快进式合并称为普通合并,各种情况下总会创建一个merge记录,方便追溯
               若版本直接回退,直接回退到原始master指针节点。

 

     2.2 研发分支过程管理

    • 主干分支为master,dev-test为开发分支,test为测试分支,pre为预发分支, release为上线分支

    • 每个一个需求为一个特性分支,命名为feature-XXX

    • 特性分支开发过程中外部联调需要时合并至dev-test

    • 特性分支开发完成后合并至test,提交测试

    • 测试完成后合并至pre,进行预发测试

    • 预发测试完成后合并至上线分支release-{date}, release-{date}由最新master派生

    • 如果在测试期间出现BUG需要在feature分支修复,并合并至集成分支(dev-test, test, pre).

      • dev-test期间合并dev-test

      • test期间合并至dev-test, test

      • pre期间合并至dev-test, test, pre

      • release期间合并至dev-test, test, pre, release

    • 线上出现Bug需要修复时等同一个需求走feature分支开发流程

  2.3 常见分支问题

    • 团队中新人可能是对Git不熟悉也可能是合并到集成分支 dev-test, test时冲突比较多想把dev-test,test代码合并到本地来解决,从而把别人开发功能的代码合并到自己的分支,上线时就把别人分支(不是本次上线的功能)上到正式环境了,导致线上事故。

      git checkout feature-xxx
      git merge test
    • 在开发过程中Bug修复时一般需要在自己的特性分支修改代码,修改完成后再依次合并到dev-test, test, pre让测试验证是否修复完成,但有时图方便或是时间问题就直接合并到pre让测试验证, 这样测试环境上就带有bug。然后就有一种常见的情况,在测试环境回归功能又发现了此Bug,开发就纳闷修复过了为何还有,其实就代码没有合并。

      git checkout feature-xxx
      # fix bug ..
      git checkout pre && git pull
      git merge feature-xxx
      # 没有合并至dev-test, test