精华内容
下载资源
问答
  • 2021-01-12 17:28:22





    一、分支定界法相关概念



    分支定界法相关概念 :

    分支 : 将一个问题不断细分为 若干子问题 , 之后逐个讨论子问题 ;

    定界 : 分支很多的情况下 , 需要讨论的情况也随之增多 , 这里就需要定界 , 决定在什么时候不在进行分支 ; 满足 ① 得到最优解 , ② 根据现有条件可以排除最优解在该分支中 , 二者其一 , 就可以进行定界 ;

    定界的作用是 剪掉没有讨论意义的分支 , 只讨论有意义的分支 ;





    二、分支定界法求解整数规划步骤



    分支定界法求解整数规划步骤 :

    ( 1 ) 求 整数规划 的 松弛问题 最优解 :

    如果 该 最优解就 是整数 , 那么得到整数规划最优解 ;

    如果 该 最优解 不是整数 , 那么转到下一个步骤 分支 与 定界 ;


    ( 2 ) 分支 与 定界 :

    任选一个 非整数解变量 x i x_i xi , 在 松弛问题 中加上约束 :

    x i ≤ [ x i ] x_i \leq [x_i] xi[xi] x i ≥ [ x i ] + 1 x_i \geq [x_i] + 1 xi[xi]+1

    形成 两个新的 松弛问题 , 就是两个分支 ;

    上述分支 , 分的越细致 , 限制条件越多 , 同时 最优解的质量就越差 ;

    新的分支松弛问题特征 :

    • 原问题求 最大值 时 , 目标值 是 分支问题 的上界 ;

    • 原问题求 最小值 时 , 目标值 是 分支问题 的下界 ;


    分支 1 1 1 的最优解是 x ∗ x^* x , 将最优解代入目标函数后得到最优值 f 1 f_1 f1 ;

    分支 2 2 2 的最优解是 y ∗ y^* y , 将最优解代入目标函数后得到最优值 f 2 f_2 f2 ;

    如果目标函数求最大值 , 那么就讨论 f 1 , f 2 f_1, f_2 f1,f2 谁更大 ;


    检查 分支松弛问题 的 解 及 目标函数值 :

    ① 得到最优整数解 : 如果该分支的 解 是 整数 , 并且 目标函数值 大于等于 其它分支的目标值 , 则剪去其它分支 , 停止计算 ;

    ② 没有得到最优整数解 : 如果该分支的 解 是 小数 , 并且 目标函数值 大于 整数解的目标值 , 需要 继续进行分支 , 直到得到最优解 ;





    三、分支定界理论分析



    假设考虑 分支 1 1 1 松弛问题 , 每次都要给问题找到一个界 , 开始先使用观察法找到一个界 , 找到一个整数解 f f f , 将该解代入目标函数 , 然后在 不断地计算中, 修改该界 ;

    假设 分支 1 1 1 松弛问题 目标函数 求最大值 ,

    如果求解 分支 1 1 1 松弛问题 最优解 恰好也是一个整数解 f 0 f_0 f0 , 如果 f 0 > f f_0 > f f0>f , 此时需要重新定界 , f 0 f_0 f0 作为新的界来讨论 ;

    根据新的界来看 分支 2 2 2 松弛问题是否需要讨论 , 求出 分支 2 2 2 的最优解 对应的 目标函数最优值 f ∗ f^* f ;

    如果 分支 2 2 2 的最优值 小于 分支 1 1 1 的最优值 f ∗ ≤ f 0 f^* \leq f^0 ff0 , 此时分支 2 2 2 不用再进行分支了 , 再进行分支 , 其最优值会越来越差 ;

    定界法的作用是将不符合条件的分支剪去 ;





    四、分支过程示例



    如上篇博客 【运筹学】整数规划 ( 整数规划问题解的特征 | 整数规划问题 与 松弛问题 示例 ) 中 , 求解如下 整数规划 解 :

    m a x Z = x 1 + x 2 s . t { 14 x 1 + 9 x 2 ≤ 51 − 6 x 1 + 3 x 2 ≤ 1 x 1 , x 2 ≥ 0   并 且 为 整 数 \begin{array}{lcl} \rm maxZ = x_1 + x_2 \\\\ \rm s.t\begin{cases} \rm 14 x_1 + 9x_2 \leq 51 \\\\ \rm -6 x_1 + 3x_2 \leq 1 \\\\ \rm x_1, x_2 \geq 0 \ 并且为整数 \end{cases}\end{array} maxZ=x1+x2s.t14x1+9x2516x1+3x21x1,x20 


    其对应的松弛问题是 : 去掉整数解限制 ;

    m a x Z = x 1 + x 2 s . t { 14 x 1 + 9 x 2 ≤ 51 − 6 x 1 + 3 x 2 ≤ 1 x 1 , x 2 ≥ 0 \begin{array}{lcl} \rm maxZ = x_1 + x_2 \\\\ \rm s.t\begin{cases} \rm 14 x_1 + 9x_2 \leq 51 \\\\ \rm -6 x_1 + 3x_2 \leq 1 \\\\ \rm x_1, x_2 \geq 0 \end{cases}\end{array} maxZ=x1+x2s.t14x1+9x2516x1+3x21x1,x20


    分支都是基于松弛问题进行的 , 为松弛问题分支 , 组成两个新的松弛问题 ;


    下图是求解结果 ( 图解法 ) :

    在这里插入图片描述
    最优解 x 1 = 3 2 x_1 = \cfrac{3}{2} x1=23 , 分别为 x 1 x_1 x1 添加 x i ≤ [ x i ] x_i \leq [x_i] xi[xi] x i ≥ [ x i ] + 1 x_i \geq [x_i] + 1 xi[xi]+1 约束 , 形成两个新的线性规划 ;


    分支 1 1 1 整数规划 : 添加 x i ≤ [ x i ] x_i \leq [x_i] xi[xi] 约束 , 即 x 1 ≤ 1 x_1 \leq 1 x11 ;

    m a x Z = x 1 + x 2 s . t { 14 x 1 + 9 x 2 ≤ 51 − 6 x 1 + 3 x 2 ≤ 1 x 1 ≤ 1 x 1 , x 2 ≥ 0 \begin{array}{lcl} \rm maxZ = x_1 + x_2 \\\\ \rm s.t\begin{cases} \rm 14 x_1 + 9x_2 \leq 51 \\\\ \rm -6 x_1 + 3x_2 \leq 1 \\\\ \rm x_1 \leq 1 \\\\ \rm x_1, x_2 \geq 0 \end{cases}\end{array} maxZ=x1+x2s.t14x1+9x2516x1+3x21x11x1,x20


    分支 2 2 2 整数规划 : 添加 x i ≥ [ x i ] + 1 x_i \geq [x_i] +1 xi[xi]+1 约束 , 即 x 1 ≥ 2 x_1 \geq 2 x12 ;

    m a x Z = x 1 + x 2 s . t { 14 x 1 + 9 x 2 ≤ 51 − 6 x 1 + 3 x 2 ≤ 1 x 1 ≥ 2 x 1 , x 2 ≥ 0 \begin{array}{lcl} \rm maxZ = x_1 + x_2 \\\\ \rm s.t\begin{cases} \rm 14 x_1 + 9x_2 \leq 51 \\\\ \rm -6 x_1 + 3x_2 \leq 1 \\\\ \rm x_1 \geq 2 \\\\ \rm x_1, x_2 \geq 0 \end{cases}\end{array} maxZ=x1+x2s.t14x1+9x2516x1+3x21x12x1,x20


    这样就将一个线性规划 , 分解成了两个问题分支 , 分别找两个分支问题的所有整数解 ;

    整数规划的整数解 , 肯定在上述两个分支之一中 , 中间将一部分可行域排除在外了 , 就是下图中两个红色箭头之间的可行域部分 , 被排除掉的部分肯定没有整数解 , 都是小数 ;

    在这里插入图片描述

    更多相关内容
  • 分支结构:指程序根据条件有选择的向程序运行方向执行的结构 循环结构:指程序根据一定条件向程序运行之后,也就是程序曾经执行过方向返回执行的这样的结构。 这三种结构覆盖了程序控制的全部内容。 单分支结构:...

    程序的控制结构包括三部分:

    顺序结构:指程序按照线性顺序逐渐执行的结构

    分支结构:指程序根据条件有选择的向程序运行方向执行的结构

    循环结构:指程序根据一定条件向程序运行之后,也就是程序曾经执行过方向返回执行的这样的结构。

    这三种结构覆盖了程序控制的全部内容。

    单分支结构:

    分支结构是根据判断条件结果而选择不同向前路径的运行方式

    单分支结构,语法格式如下:

    if 判断条件:

    代码段

    以上格式中的if关键字和冒号分别标识if语句的起始和结束,判断条件与if关键字以空格分隔,代码段通过缩进与if语句产生关联。类似“如果,则”

    流程图如下所示:

    通过流程图,我们可知,先进行条件的判断,当条件判断成立时,即为True时,运行语句块里面的语句后输出,当条件判断不成立时,即为false时,直接输出即可。

    同时格式也可以写为
    if true:#其中的true即为对条件的判断的真,即符合判断条件。

    print("条件正确”)

    示例一:考试成绩评估程序

    考试成绩不低于60分的学生为“考试及格”

    代码如下:

    score=eval(input("请输入要判断的成绩:"))#eval,评估函数,去掉参数最外侧引号并执行余下语句的函数
    if score>=60:
        print("考试及格!")

    当所评估成绩符合if后面的判断条件时运行界面如下: 

    当所评估成绩不符合if后面的判断条件时直接输出,运行界面如下: 

     示例二:猜数字程序

    如果所猜测数字与给定条件符合则进行输出

    代码如下所示:

    guess=eval(input("请输入要猜测的数字:"))#eval,评估函数,去掉参数最外侧引号并执行余下语句的函数
    if guess==90:
        print('猜对了')

    符合判断条件的运行界面如下所示:

    不符合判断条件的运行界面如下所示: 

    二分支结构:

    二分支结构是根据条件判断的不同而选择不同执行路径的这么一种结构

    if-else语句的语法格式如下:

    if 判断条件:

    代码段1

    else:

    代码段2

    执行if-else语句时,如果判断条件成立,执行if语句后面的代码段1,否则执行else语句后面的代码段2.

    流程图如下所示:

    根据流程图可知,代码格式也可以这么写:

    if True:#其中的True即为对条件的判断的真,即符合判断条件。

    print("语句块1")

    else :

    print("语句块2")

    示例一:考试成绩评估程序

    考试成绩不低于60分的学生为“考试及格”,低于60分即为”考试不及格“

    运行代码如下:

    score=eval(input("请输入要评估的成绩:"))
    if score>=60:
        print("考试及格")
    else:
        print("考试不及格")

    条件为True时运行截图如下: 

     条件为false时运行截图如下: 

    示例二:猜数字

    如果所猜测数字与给定条件符合则进行输出

    代码如下:

    guess=eval(input("请输入要猜测的数字:"))
    if guess==90:
        print("猜对了")
    else:
        print("猜错了")

    条件为False运行界面如图: 

    条件为True运行界面如图:

     紧凑形式:适用于简单表达式的二分支结构:

    <表达式1>if<条件>else<表达式2>

    表达式是语句的一部分

    语句为带赋值形式的有符号构成的语句

    示例如下:猜数字程序

    示例代码如下:

    guess=eval(input("请输入要猜测的数字:"))
    print("猜{}了".format("对" if guess==99 else "错"))

    条件为True运行界面如图:

    条件为False运行界面如图:  

    多分支结构:

    if-elif-else语句格式如下所示:

    if 判断条件:

    代码段1

    elif 判断条件2:

    代码段2

    elif 判断条件3:

    代码段3

    ...

    else:

    代码段n

    流程图如下:

    对不同分数分类的问题:

    代码如下所示:

    score=eval(input("请输入要评估的成绩:"))
    if score>=60:
        grade='D'
    elif score>=70:
        grade='C'
    elif score>=80:
        grade='B'
    elif score>=90:
        grade='A'
    print("输入成绩属于级别{}".format(grade))

    对于这个代码我们看运行结果如下:

    通过运行我们可以得知,当成绩为80或者60时,满足第一个if语句的判断条件,即可输出,

    出现这种情况我们可以得知是由于运行正确,逻辑错误(在设置不同的条件的时候,它的先后关系以及包含关系出现了错误,即判断条件包含了以下的内容。所以我们要注意多条件之间的包含关系,还要注意取值范围的覆盖。

    经过修改。我们得到的代码如下: 

    第一种修改方法:
    将成绩顺序由高到低即可判断:
    score=eval(input("请输入要评估的成绩:"))
    if score>=90:
        grade = 'A'
    elif score >= 80:
        grade = 'B'
    elif score >= 70:
        grade = 'C'
    elif score >= 60:
        grade = 'D'
    print("输入成绩属于级别{}".format(grade))
    
    第二种修改方法:
    设置
    score=eval(input("请输入要评估的成绩:"))
    if score>=90:
        print("grade='A'")
    elif 80 <= score < 90:
        print("grade='B'")
    elif 70 <= score < 80:
        print("grade='C'")
    elif 60 <= score < 70:
        print("grade='D'")
    else:
        print("grade='E'")

    运行界面如下所示: 

    第一种方法输出:

     

    第二种方法输出:

    展开全文
  • 克隆远程仓库 删除远程Git仓库 查看远程分支 推送分支 创建远程分支 拉取分支 关联本地分支和远程分支 删除远程分支 查看分支 版本回退 将多次提交合并成一次提交 分支重命名 7. 标签管理 总结 Python知识图谱 1. ...

    您好,我是码农飞哥,感谢您阅读本文,欢迎一键三连哦
    💪🏻 1. Python基础专栏,基础知识一网打尽,9.9元买不了吃亏,买不了上当。 Python从入门到精通
    ❤️ 2. Python爬虫专栏,系统性的学习爬虫的知识点。9.9元买不了吃亏,买不了上当,持续更新中 。python爬虫入门进阶
    ❤️ 3. Ceph实战,从原理到实战应有尽有。 Ceph实战
    ❤️ 4. Java高并发编程入门,打卡学习Java高并发。 Java高并发编程入门
    😁 5. 社区逛一逛,周周有福利,周周有惊喜。码农飞哥社区,飞跃计划
    全网同名【码农飞哥】欢迎关注,个人VX: wei158556

    1. Git是什么?

    Git是一款开源的分布式版本控制系统,可以有效,高速处理从很小到非常大的项目版本管理。 Git是通过C语言开发实现的。

    2. Git与SVN的比较

    Git和SVN是两种截然不同的版本控制系统,Git是分布式版本控制系统,而SVN则是集中式版本控制系统。要想比较Git和SVN的区别,首先需要了解分布式版本控制系统和集中式版本控制系统的基本概念。
    集中式版本控制系统:一个显著的特征是版本库是存放在中央服务器上的,由中央服务器统一管理项目的版本信息和分支信息。团队中的每个成员在工作时都需要先从中央服务器上拉取最新的代码,然后开始干活。干完活之后再将代码提交到中央服务器上。集中式版本服务器有两个弊端:

    1. 必须联网才能工作,当没有网络或者网络很差时,则团队中的成员无法协同工作。
    2. 安全性不好,因为版本库存放在了中央服务器,当中央服务器损坏时则会丢失版本库,使所有成员都没法工作。

    集中式版本控制系统的网络拓扑图如下图所示:
    在这里插入图片描述
    可以看出团队中所有成员的工作电脑都只与中央服务器打交道。如果把版本库比做书库的话,那么每个人(每个电脑)都需要先从书库借到书(拉取最新的代码),阅读完之后然后还给书库(修改之后提交到中央服务器)

    分布式版本控制系统: 与集中式版本控制系统最大的不同是团队中所有成员的工作电脑上都有一个完整的版本库,并且没有中央服务器。,这就相当于团队中每个成员都有一个自己的小书库(版本库),成员之间可以互相交换自己书库中的图书(将自己的修改提交给对方)。这里完全不需要中央服务器来管理协调管理。
    在实际使用分布式版本控制系统时,其实很少在两人之间的电脑上进行版本库推送,这是因为有时候你们不在同一个局域网内,或者你同事的电脑关机了。因此,分布式版本控制系统通常也有一台充当“中央服务器”的电脑,但这个服务器的作用仅仅是用来方便“交换”大家的修改,没有它大家也一样干活,只是交换修改不方便而已。这台充当“中央服务器”的电脑上的版本库称之为远程版本库,其他成员电脑上的版本库称之为本地版本库。后面会详细介绍。

    分布式版本控制系统的网络拓扑图如下图所示:

    在这里插入图片描述
    分布式版本控制系统剔除了中央服务器,这充分体现了分布式的核心概念,就是去中心化。这样带来的好处有两点:

    1. 没有网络也能上班:团队中的每个成员在没有网络的情况下也能工作,因为本地有完整的版本库,不需要担心数据的丢失。
    2. 数据更安全:当某个成员的电脑坏掉了不要紧,只需要从其他成员的电脑上复制一份即可。但是集中式版本控制系统的中央服务器出问题,则可能会丢失版本库,使得所有人都没法工作。

    3. 系统环境

    系统版本
    WindowsWindows10
    LinuxUbuntu16.04

    4. 安装Git客户端

    说完了Git的基本概念,接下来还是安装个Git客户端下来耍一耍。这里分不同的操作系统简单的介绍一下Git客户端的安装。

    Linux系统下

    首先通过git --version 命令查看电脑上是否已经安装了Git客户端。
    在这里插入图片描述
    如果已经安装了就可以跳过此章节。如果没有安装的话就接着往下面看:
    Linux系统有不同的发行版本,可以通过cat /proc/version 命令查看Linux的版本。

    1. Debian或Ubuntu下安装Git
      在 Debian或Ubuntu可以通过apt包管理工具安装Git,命令如下:
    sudo apt-get install git
    
    1. Red Hat 或者CentOS下安装Git
      Red Hat 或者CentOS下可以通过yum包管理工具安装Git,命令如下:
    yum install git -y
    

    如果找不到yum命令的话,则需要先安装yum工具。可以参考下面命令

    #删除yum.repos.d目录下所有文件
    rm -f /etc/yum.repos.d/*
    #然后重新下载阿里的yum源
    wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
    #清理缓存
    yun clean all
    

    Windows系统下

    Git的官方下载地址是:Git的下载地址
    在这里插入图片描述
    下载好安装包之后,一直点击下一步即可安装。再次就不在赘述。

    5.本地版本库操作

    Windows下安装好Git之后会出现Git Bash 和Git GUI两个应用程序,其中Git Bash是Git的命令行工具,而Git GUI则是Git的可视化工具(一般很少用)。

    创建本地版本库

    创建本地版本库分为两步:
    第一步是创建一个空文件夹,命名为: git_learn。
    第二步就是在该文件夹下执行git init 命令将该文件夹变成git可以管理的版本库。
    执行第二步之后,在 git_learn目录下会出现一个名为.git的隐藏文件夹,该文件夹就是git的版本库。切记不要手动修改.git文件夹下的任何内容,以免本地版本库不可用

    本地版本库建好之后就可以在git_learn文件夹下创建一个文件进行测试了。这里创建了一个名为readme.txt的文件。
    添加到暂存区
    通过git add readme.txt命令可以将readme.txt文件提交到暂存区(关于暂存区的概念后面会详细介绍)。如果有多个文件需要添加的话,可以执行git add . 命令。
    提交到版本库
    因为git的本地都是有完整版本库的,所以还需要将前面创建的readme.txt文件提交到本地版本库的当前分支,默认是master。命令格式是git commit -m '<message>' ,其中写入你的提交备注。

    工作区和暂存区

    这里有两个很重要的概念,一个是工作区,另一个是暂存区(Git特有的概念)。
    工作区
    工作区就是你电脑上能看到的目录(不包括隐藏文件),例如:git_learn目录就是一个工作区。

    暂存区
    工作区有一个隐藏目录.git,这个不算工作区,而是Git的版本库,其中最重要的是暂存区(stage)。

    还有Git为我们自动创建的第一个分支叫master,以及指向master的一个指针叫HEAD。

    前面提到了工作区,暂存区,git add命令和git comit 命令。那么他们之间有啥关系呢?下面就用一张流程图展示一下:
    在这里插入图片描述
    通过add命令将工作区中ABC文件夹提交到暂存区stage,在通过commit命令将stage中的ABC文件夹提交到当前分支master。

    管理修改

    Git管理的是修改而非文件。这里的修改指的是对工作区的任何操作,包括新增文件;删除文件;修改文件等等。哪怕是在文件中增加一句话或者删除一个字符都可以算是修改。下面就举例说明下,还是以readme.txt文件为例:

    1. 第一次在readme.txt文件中增加一个词语 gittest。然后执行git add readme.txt,并通过命令git status查看状态。
      hello world
      gittest

      在这里插入图片描述
    2. 第二次再在readme.txt文件上添加一行内容git tracks changes
      hello world
      gittest
      git tracks changes

    直接执行git commit -m 'git tracks changes'命令。然后通过 git status ,可以发现第二次的修改没有提交。这是因为第二次的修改没有先提交到暂存区中。
    在这里插入图片描述
    我们的操作过程是第一次修改 -> git add -> 第二次修改 -> git commit。当使用git add 命令后,在工作区中的第一次修改被放入暂存区中,准备提交,在工作区中的第二次修改没有被放入暂存区中,所以,git commit只负责把暂存区中的修改提交到当前分支。所以第二次的修改没有提交。
    也就是说,所有的修改必须先通过git add 提交到暂存区,然后通过git commit 提交到当前分支。。在实际开发中一般是将所有修改合并起来add,然后在一起commit。

    删除文件

    当前分支上有一个已经废弃不用的文件,该如何删除呢?比如要删除一个名为test1.txt文件。只需要两行命令。

    git rm test1.txt
    git commit -m "remove test.txt"
    

    5.Ubuntu搭建私有的git仓库

    前面介绍了在实际开发中,一般会拿一台电脑作为“中央仓库”,充当中央仓库的电脑需要安装一个代码仓库软件,这里选用开源软件GitLab,它是基于git实现的在线代码仓库软件,提供web可视化管理界面,可以在本地部署。通常用于企业团队内部协作开发。当然,如果你不想搭建私人的git仓库,那么也可以直接使用最大的同性交友网站Github(使用与GitLab类似)。
    那么该如何在Ubuntu上安装GitLab软件,搭建私有的Git仓库呢?

    1. 安装必须的一些服务
    #更新apt源
    sudo apt-get update
    #安装依赖包,运行命令
    sudo apt-get install curl openssh-server ca-certificates postfix
    sudo apt-get install -y postfix
    
    1. 接着信任 GitLab 的 GPG 公钥:
    curl https://packages.gitlab.com/gpg.key 2> /dev/null | sudo apt-key add - &>/dev/null  
    
    1. 配置镜像路径
      由于国外的下载速度过慢,所以配置清华大学镜像的路径。
    sudo vi /etc/apt/sources.list.d/gitlab-ce.list  
    

    在该文件中写入如下代码

    deb https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/ubuntu xenial main 
    
    1. 安装gitlab-ce
    sudo apt-get update
    sudo apt-get install gitlab-ce
    

    安装gitlab-ce成功之后。
    5. 修改外部url
    在gitlab配置文件/etc/gitlab/gitlab.rb中修改外部url,改为自己的ip地址或者域名。

    sudo vi /etc/gitlab/gitlab.rb
    

    找到external_url,修改其默认的地址,这里改成了我本机局域网IP:192.168.40.138

    external_url 'http://192.168.40.138/'  ## 本机的局域网ip地址为192.168.41.128
    
    1. 执行配置
      前面步骤顺利的话就可以执行配置了,该过程可能需要较长的时间。
    sudo gitlab-ctl reconfigure
    
    1. 启动GitLab
    sudo gitlab-ctl start
    

    可以通过ps -ef|grep gitlab 命令查看GitLab是否启动成功。
    8. 进行浏览器访问
    GitLab成功启动之后就可以通过浏览器访问GitLab的主页了。在浏览器上输入http://192.168.40.138/;
    在这里插入图片描述
    默认输入的用户名是root用户,输入的密码是root的账户密码。
    至此GitLab的安装就全部结束,我们也成功的搭建了属于自己的Git仓库。

    GitLab的使用

    添加用户

    点击设置按钮,进入设置栏,选中Users->New User 进入添加用户页面。
    在这里插入图片描述
    在这里插入图片描述
    输入姓名,用户名,和邮箱即可注册添加新用户。

    添加团队

    用户添加好之后,就是将用户添加到团队中,GitLab中默认会有一个名为GitLab Instance的团队,你也可以添加自己的团队,这里我添加了一个名为ai_edu的团队。并在团队中添加了两个成员。
    在这里插入图片描述
    选中要添加成员的团队,在右侧会出现一个添加Add user(s) to the group的栏目。再此栏目中所有用户并添加到团队中。用户的角色有游客,测试人员,开发人员,管理者,拥有者等几个不同的角色。
    在这里插入图片描述

    新建远程仓库

    说完了用户和团队的设置后,现在就进入了重点了,如何新建一个远程仓库。同样也是比较方便。操作步骤是:Project->Your projects->New project
    在这里插入图片描述
    在这里插入图片描述
    这里新建了一个名为git_test的远程仓库,仓库的所有这是属于ai_edu团队。
    在这里插入图片描述

    这里仓库的权限等级有三个等级,分别是:Private(只有你团队的人才能拉取和推送代码),Internal(除了黑名单之外的用户可以拉取和推送代码)。Public (所有的用户都可以拉取)。

    SSH key的配置(生成公钥和私钥)

    为啥要配置SSH key呢?这是因为GitLab与你的电脑是通过SSH协议来通信的。说白了,如果你没有配置SSH key的话,则你不能推送代码到远程库。这里首先在你本地生成公钥和私钥文件,然后把公钥文件的内容复制到GitLab上。

    1. 配置用户名
    git config --global user.name “username”
    
    1. 配置邮箱
     git config --global user.email  jayxiang31@gmail.com
    

    jayxiang31@gmail.com替换成你实际的邮箱地址。不需要加单引号。
    4. 生成公钥和私钥

    ssh-keygen -C 'you email jayxiang31@gmail.com' -t rsa
    

    如果简单些的话可以直接填写ssh-keygen 命令。邮箱地址填写前面设置的邮箱地址。有提示的话一直按Enter键。正确执行后会输入如下信息
    在这里插入图片描述

    2 找到公钥文件id_rsa.pub,复制公钥内容到GitLab
    在这里插入图片描述

    6. 分支管理

    创建与合并分支

    分支的概念:分支就是每次提交创建的点所连接成的时间线。这条时间线就是一个分支,默认的话只有一个主分支master分支。HEAD严格来说不是指向提交,而是指向master,master才是指向提交,HEAD指向的就是当前分支。
    一开始的时候,master分支就是一条线,Git用master指向最新的提交,再用HEAD指向master,就能够确定当前的分支以及当前分支的提交点。
    每次提交,master分支都会向前进移动一步,这样随着你不断提交,master分支的线也会越来越长。其结构如下图所示:
    在这里插入图片描述

    1. 创建dev分支

    当我们新创建一个分支dev时,Git会创建一个指针dev指向master分支当前的提交点。当切换到dev分支后,HEAD指针会指向dev。也就是说HEAD始终是指向当前分支的

    git checkout -b dev
    

    git checkout 加上-b参数表示创建并切换到dev分支上,相当于下面两条命令。

    $ git branch dev
    $ git checkout dev
    

    执行该上面的命令之后的git的提交时间线如下图所示:
    在这里插入图片描述
    当在dev分支上提交代码(未改变master分支)之后,dev分支会不断的向后推进。而master指针的指向则不会变。
    在这里插入图片描述
    git checkout命令是一个比较特殊的命令,传入不同的参数会有截然不同的效果。例如:git checkout -- file 命令,表示的意思是撤销file文件中所有的修改。所以Git还提供了git switch命令用于创建和切换分支。

    ## 创建并切换到新的dev分支
    git switch -c dev
    ## 切换到已有的master分支
    git switch master
    

    2. 查看所有分支

    分支创建好之后,可以通过git branch命令进行查看。

    3. 分支合并

    当团队成员在dev分支上开发完毕之后,就可以将dev分支上的内容合并到master分支上,合并分支的原理就是将master指针指向dev的当前提交。Git合并分支只是改了下指针,工作区的内容没有改变。
    在这里插入图片描述

    其合并的命令分两步,第一步是切换到master分支,第二步是合并dev分支

    #切换到master分支
    git checkout master
    #合并dev分支
    git merge dev
    
    1. 删除dev分支
      现在dev分支的内容也合并到了master分支上了,可以将dev分支删除了。Git删除dev分支其实就是删除dev指针。删除之后又只剩下master分支了。需要注意的是必须要先切换到master分支上再进行删除dev分支的操作。删除dev分支的命令如下:
    git branch -d dev
    

    解决冲突

    在团队协作过程中,难免会碰到各种修改冲突。那么该如何解决这些冲突呢? 例如:你和你同事分别修改了readme.txt文件,那么当你们同时提交时就会出现冲突。又或者在你在master分支和feature1分支上分别修改了readme.txt文件。那么当你合并feature1分支到master分支时就会出现冲突。举个栗子吧:

    1. 在feature1分支上给readme.txt文件中加上了文本处理冲突。然后提交到feature1分支。
    2. 切换到master分支,给readme.txt文件中加上文本
    冲突处理
    master有冲突
    

    然后提交到master分支上。
    3. 将feature1分支合并到master分支,此时就会出现合并冲突。如下图所示:

    冲突之后,Git用<<<<<<<,=======,>>>>>>>标记出不同分支的内容。如下图所示:
    处理冲突的方式就是编辑冲突内容。然后重新提交。

    $ git add README.md
    $ git commit -m "解决冲突"
    

    比较差异

    1. 比较两个提交之间的差异 git diff 36e4fd7 b55da38
      在这里插入图片描述
    2. 比较工作区与仓库区的不同,HEAD表示最新的那次提交 git diff HEAD

    分支管理策略

    通常情况下,Git在合并分支时,会使用Fast forward模式。但是,这种模式下,删除分支后,会丢掉分支信息。如下图所示,删除dev分支之后,分支的信息也就就丢失了

    在这里插入图片描述
    如果要强制禁用Fast forward模式,Git会在merge时生成一个新的commit。当删除分支时就不会丢失分支信息。其命令是
    git merge --no-ff -m "merge with no-ff" dev
    准备合并dev分支,其中--no-ff参数,表示禁用Fast forward,因为本次合并要创建一个新的commit,所以加上-m参数。把commit描述写进去。

    Bug分支

    当你接到一个修复代号为01的bug的任务时,很自然地,你会创建一个分支issue-01来修复它,但是,如果这是你正在dev分支上进行的工作还没有提交,提交吧,可是你在dev上的工作只进行了一般,还没法提交,预计完成还需1天的时间。但是,现在必须要在两个小时内修复代号01的bug。这时候该怎么办呢?你不是期望有一个功能可以隐藏你当前在dev上未提交的工作,然后,切换到issue-01分支修改bug呢。
    通过stash功能可以满足你的愿望,将当前工作现场隐藏起来。如下图所示:执行git stash命令之后,新建的hello.html文件就从工作区中消失了。
    在这里插入图片描述

    保存工作现场

    git stash
    

    git stash命令可以将当前未提交的工作隐藏起来。让你的工作区变的干净清爽。

    查看工作现场

    git stash list 可以查看当前仓库所有已经保存的工作现场。

    git stash list
    

    恢复工作现场

    现在代号为01的bug已经修复好了,你可以继续切换到dev分支上进行开发了。那么这时候你需要做的第一件事就是恢复之前保存的工作现场。恢复工作现场的命令是:

    git stash apply
    

    删除工作现场

    通过git stash apply 命令可以恢复工作现场。但是,恢复之后工作现场还在。那么这时候我们还需要一个命令来删除工作现场。其命令是:

    git stash drop
    

    恢复并删除工作现场

    恢复工作现场一条命令,删除工作现场又是一条命令。未免有点繁琐了吧。有没有将两者合二为一的命令呢?答案是有的:通过下面的命令就可以实现:

    git stash pop
    

    在master分支上修复了bug后,我们想一想,dev分支是早期从master分支分出来的,所以,这个bug其实在当前dev分支上也存在。那怎么在dev分支上修复同样的bug?重复操作一次,提交不就行了?这种方法也不是不行,如果该BUG涉及的修改过多,这样的方式就显得有点捉襟见肘了。那么我们能不能把修改BUG做的提交复制到当前的dev分支呢?答案是有的:

    合并某一次的提交

    git cherry-pick  821ea4d
    

    通过git cherry-pick 命令可以将单个的提交复制到当前分支。可以通过 git log 查看提交的提交的版本号。

    feature分支

    添加一个新功能时,你肯定不希望因为一些实验性质的代码,把主分支搞乱了,所以,每添加一个新功能,最好新建一个feature分支,在上面开发,完成后,合并,最后,删除该feature分支。
    前面介绍可以通过git branch -d branchname 命令删除分支。但是,如果被删除的分支还没有合并到主分支的话,用该命令删除的话分支的话,Git会抛出一个错误提示并不能删除该分支。如下:要删除一个名为feature-01的分支。但是该分支还没有被merge。这时候就需要强制删除分支的命令了。

    git branch -D feature-01
    

    其中feature-01为待删除的分支名。其实就是将-d参数换成-D参数。

    远程仓库(多人协作)

    前面说了那么多,好像都是一个人在本地操作,没有涉及到多人协作的情况。这在团队开发中肯定是不可能的啦,因为我们是一个team。那么多人协作的情况涉及哪些操作呢?

    本地仓库关联远程仓库

    git remote add origin http://192.168.40.138/ai-edu/git-demo.git
    

    或者,推荐使用下面这种,因为前面配置了SSH公钥和私钥

    git remote add origin git@gitee.com:jayxiang31/python_learn.git
    

    第一次先拉取远程库中的README.md和.gitignore等文件

    git pull --rebase origin master
    

    克隆远程仓库

    前面第三章已经搭好了私有的Git仓库管理器GitLab。同时也创建了一个名为git_test的仓库。现在要做的就是将远程仓库克隆下来。克隆的命令是git clone

    git clone http://192.168.40.138/ai-edu/git_test.git
    

    其中http://192.168.40.138/ai-edu/git_test.git 是远程仓库的地址。
    当然也可以在IDEA上直接通过图形界面操作,还省去了导入项目的过程。其操作步骤是:

    1. 选中File->New->Project from Version Control->Git。如下图所示:
      在这里插入图片描述
    2. 在URL中填入远程仓库的地址,点击Clone按钮。如下图所示:
      在这里插入图片描述
      需要注意的是默认情况下只会克隆master分支,其他的分支不会被克隆下来。其他的分支需要通过git pull命令拉取,后面会详细介绍。

    删除远程Git仓库

     git remote rm origin
    

    查看远程分支

    通过git remote命令可以查看远程仓库,origin表示远程主机。
    通过git remote -v 命令可以查看远程仓库详细的信息,包括远程仓库的地址。

    $ git remote -v
    origin  http://192.168.40.138/ai-edu/git_test.git (fetch)
    origin  http://192.168.40.138/ai-edu/git_test.git (push)
    

    上面显示了可以抓取和推送的origin的地址。如果没有推送权限,就看不到push的地址。

    推送分支

    现在将远程仓库克隆下来了,那么该如何将当前分支上所有的本地提交推送到远程库呢?答案是通过git push命令,其语法结构是git push <remote branch> <local branch> 其中<remote branch>表示远程分支名,<local branch>表示本地分支名。

    git push origin master
    

    该语句表示将本地的master分支推送到远程的origin分支上。在实际应用中会在git push命令后面加上-u参数,就像git push -u origin master这样。这是因为如果当前分支与多个主机存在追踪关系,则可以使用 -u 参数指定一个默认主机,这样后面就可以不加任何参数使用git push。那么哪些分支该与远程分支保持一致呢?一般认为:

    1. master 分支是主分支,需要时时与远程同步
    2. dev分支是开发分支,团队所有成员都需要在上面工作,所以也需要与远程同步
    3. bug分支只用于在本地修复bug,就没必要推到远程了,除非老板要看看你每周到底修复了几个bug;
    4. feature分支是否推到远程,取决于你是否和你的小伙伴合作在上面开发。
      说白了就是需要团队协作的分支一定要推送到远程库,否则则不需要。
      在这里插入图片描述

    创建远程分支

    通过git push命令还能创建远程分支。

    git push origin dev
    

    假设你本地已经有了dev分支。通过上面的命令可以将dev分支推送到远程库,并创建远程的dev分支。

    拉取分支

    通过git pull命令可以拉取远程仓库的数据和分支信息。假设如下这个场景:你同事在他本地创建了一个dev分支,并提交到了远程库。同时你也在本地创建了一个dev库,当你push时会推送失败。结果如下图所示:

    因为你同事的最新提交和你试图推送的的提交有冲突。解决的办法就是根据Git的提示,先用git pull把最新的提交从origin/dev抓下来,然后,在本地合并,解决冲突后,在推送。

    $ git pull
    There 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> <branch>
    
    If you wish to set tracking information for this branch you can do so with:
    
        git branch --set-upstream-to=origin/<branch> dev
    

    git pull也失败了。原因是没有指定本地dev分支与远程origin/dev分支的链接,根据提示,设置dev和origin/dev的链接:

    关联本地分支和远程分支

    $ git branch --set-upstream-to=origin/dev dev
    Branch 'dev' set up to track remote branch 'dev' from 'origin'.
    

    关联好本地分支和远程分支之后,在pull就能成功了。这回git pull成功,但是合并有冲突,需要手动解决,解决的方式也是在本地手动处理冲突文件,解决后,提交,在push。

    删除远程分支

    通过

    git push origin :dev
    

    命令可以删除远程dev分支。但是这时候本地的dev分支还是存在的。所以还需要通过git branch -d dev删除本地的dev分支。

    查看分支

    通过git branch可以查看本地分支
    通过git branch -a 可以查看本地分支和远程分支。
    在这里插入图片描述

    版本回退

    在实际开发中我们经常会碰到这样一个场景,比如:你误提交了一段有问题的代码,导致其他同事更新代码之后项目启动不了,这时候该怎么办呢?我们首先想到的就是将版本回退。回退到之前那个没有问题的版本。

    1. 通过git log 命令找到当前的仓库所有的提交日志。然后,找到你需要回退到的版本。如下图所示:
    2. 回退到上一个版本:git reset HEAD
    3. 回退到指定版本:git reset commitId 其中commitId是指定版本的版本号,比如这里将版本信息回退到b50c9bdcbf9641d33e4b531bd96dc1f27d4bf602 这个版本。那么命令就是:
    git reset b50c9bdcbf9641d33e4b531bd96dc1f27d4bf602
    

    回退之后,再次通过git log查看,则最新的提交日志已经变成了hello 提交这个版本了。
    当然,通过IDEA来回退则更加的简单。直接在Version Control->Log 在待回退到的版本上右键,选中Reset Current Branch to Here 即可。
    在这里插入图片描述
    其实回退操作的本质,就是将HEAD指针的指向要回退的那个版本上。

    将多次提交合并成一次提交

    在实际开发中我们经常需要进行代码Review。如果同一个功能点分了很多次提交话,那么在进行代码Review时则会非常的不方便。这时候就需要将多次提交合并成一次提交。具体的步骤是:

    1. 通过git switch <branchname>命令切换到需要合并提交的代码的分支,比如:git switch test
    2. 查看需要合并的提交,如下有三次提交需要合并
      在这里插入图片描述
    3. 通过rebase命令修改提交指令,这里git rebase -i HEAD~3 表示查看最近的三次提交命令,合并几次则需要将对应的数字改成几。
    git rebase -i HEAD~3
    

    执行该命令之后会打开提交指令的日志文件,这里只保留第一次的提交,将另外的两次提交改成 s
    在这里插入图片描述
    保存之后会进入另外一个文件,该文件无需修改,直接输入:q! 命令退出即可。操作之后我们可以看到之前的三次提交记录变成了一次提交记录。
    在这里插入图片描述
    4. 如何要把这次提交合并到其他分支只需要切换到目标分支,执行如下命令;

    git cherry-pick <commitid>
    

    分支重命名

    git branch -m oldname newname
    

    7. 标签管理

    标签管理比较简单,再此只是简单描述一下。

    #创建标签 v1.0
    git tag v1.0
    #查看标签
    git tag
    #删除标签v1.0
    git tag -d v0.1
    #推送标签
    git push origin --tags
    #删除远程标签
    git push origin :refs/tags/v1.0
    

    在这里插入图片描述

    总结

    一万六千多字,我写的累,你们看的也累!!!文中奉上几张美女照片给各位读者大大解解乏。我真真正正的肝了两天了。现在终于肝完了。希望对读者朋友们有所帮助。
    看文字实在是太累了。下面就用一张图来做一个总结吧。
    在这里插入图片描述
    这张图清晰的表明了Git的基本流程。

    Python知识图谱

    为了更好帮助更多的小伙伴对Python从入门到精通,我从CSDN官方那边搞来了一套 《Python全栈知识图谱》,尺寸 870mm x 560mm,展开后有一张办公桌大小,也可以折叠成一本书的尺寸,有兴趣的小伙伴可以了解一下------扫描下图中的二维码即可购买。

    在这里插入图片描述
    我本人也已经用上了,感觉非常好用。图谱桌上放,知识心中留
    在这里插入图片描述

    我是码农飞哥,再次感谢您读完本文

    展开全文
  • DevOps系列之 —— 持续开发与集成(二)代码托管与分支策略(Git Flow、GitHub Flow & GitLab Flow)

    DevOps系列之 —— DevOps概览(一)软件产业和交付模式发展趋势
    DevOps系列之 —— DevOps概览(二)新型软件技术及交付模式
    DevOps系列之 —— DevOps概览(三)DevCloud HE2E DevOps 框架及其主要服务
    DevOps系列之 —— 持续规划与设计(一)敏捷项目管理理念与方法实践
    DevOps系列之 —— 持续规划与设计(二)规划与设计
    DevOps系列之 —— 持续规划与设计(三)敏捷项目管理的方法【Kanban 与 Scrum】
    DevOps系列之 —— 持续规划与设计(四)敏捷需求管理【用户故事 & 敏捷估算】
    DevOps系列之 —— 持续规划与设计(五)团队与协作
    DevOps系列之 —— 持续规划与设计(六)华为敏捷项目管理企业实践
    DevOps系列之 —— 持续开发与集成(一)持续集成理念、方法及实践
     
    DevOps 系列文章,持续更新中 ~~~

    代码托管与分支策略

    版本管理

    • 我们先来看下面两幅对比图,这两幅图的区别是向主干分支合并代码的周期不同,那么哪一幅图更符合持续集成的原则呢?
      在这里插入图片描述
    • 很显然,答案是第二幅。DevOps 团队通过基于主干开发的方式践行持续集成,让开发者更频繁地将代码合并到中央仓库,理想的情况下是每天几次
    • 当团队能够经常合并较小的变更时,将减少合并的复杂性,促使提前发现问题

    版本规划

    • 产品的生命周期中,会遇到多种渠道获得的各种各样的需求,比如部门内部由于运营需要提出的需求,产品经理提出的需求,以及通过用户投诉或反馈得来的需求,通过研发人员对资深产品和竞品的体验分析得来的需求,如何将这些需求落地,做好版本规划呢?
    • 软件版本管理,不只是分支管理
      • Build Manager?
      • 配置管理员?
      • IT Support?
    • 版本管理的目的
      • 版本控制,历史信息
      • 团队协作并行开发
      • 过程管理(变更、审批、流程)
      • 问题追踪

    持续交付,从代码分支策略,看到的是软件的发布机制;发布的过程,是开发与运维的沟通

    工作流

    1. Git Flow

    • 用于记录历史的分支

      • Git Flow 使用两个分支来记录项目开发的历史,而不是使用单一的 Master 分支。在Git Flow 流程中,Master 只是用于保存官方的发布历史(一般设置成分支保护模式),而 Develop 分支才是用于集成各种功能开发的分支
        在这里插入图片描述
    • 用于功能开发的分支

      • 每一个新功能的开发都各自使用独立的分支。在创建新的功能开发分支时,父分支选择 Develop(而不是 Master)。当功能开发完成时,改动的代码被合并(merge)到 Develop 分支
      • 很多时候,Feater 向 Develop 合并的时候,会提交一个合并请求,有专门的技术负责人进行审核,把控代码质量,审核通过才允许合并
      • Feater 是一个临时分支,生命周期随着功能开发完成而结束
        在这里插入图片描述
    • 用于发布的分支

      • Release 分支基于 Develop 分支创建,我们可以在这个 Release 分支上测试,修改 Bug 等。这个分支的创建意味着一个发布周期的开始,也意味着本次发布不会再增加新的功能。在一切准备就绪的时候,合并该分支到 Master 和 Develop,并且用版本号打上标签
        在这里插入图片描述
    • 用于维护的分支

      • 发布后的维护工作或者紧急问题的快速修复也需要使用一个独立的分支(Hotfix)。这是唯一一种可以直接基于 Master 创建的分支
      • 问题被修复后,所做的改动合并入 Master 和 Develop 分支
      • Master 上使用更新的版本号打上标签
        在这里插入图片描述

    2. Github Flow

    • Github Flow 工作流仅具有特性分支和主干分支,非常简单和干净
    • 将所有内容合并到主干分支和部署,最大限度地减少了“库存”中的代码量
    • 基本原则:任何主干上的版本都是可发布的
    • 开发人员创建的新分支,无论是新增特性,还是修改bug,分支命名应该具有较好的描述性。其他人就可以看出分支的意图
    • 特性分支创建成功后,无论什么操作,新增、修改或是删除文件,都可以及时地提交到特性分支,便于跟踪开发速度
    • Github 工作流特点之一:pull request,可以为提交初始化一个讨论组,在开发过程中的任何时候都可以创建一个 pull request(甚至没有写代码,只是想寻求他人帮助 / 功能开发完成,让其他人检查代码),一旦 pull request 被审核通过,新功能就进入了产品中等待验证
    • Github 工作流隐含的问题:每次合并新功能,主分支的代码是应该及时发布的,但实际中常常不能做到这一点,比如 APP 发布前需要一定的审核时间(如何解决此问题,请继续往下看 Gitlab Flow 工作流)
      在这里插入图片描述

    3. Gitlab Flow

    最大的原则:上游优先,即只存在一个主分支 Master,它是所有其他分支的上游,只有上游分支采纳的代码变化,才能应用到其他分支

    • 带生产分支工作流
      • 创建一个反映已部署代码的 PRODUCTION 分支

      • 将 MASTER 合并到 PRODUCTION 分支来部署新版本
        在这里插入图片描述

      • 优点

        • 可以随时检出 PRODUCTION 分支,查看生产代码
        • 可以清晰查看提交合并记录
        • 可避免 Git Flow 中常见的发布,打标签和合并的开销
    • 带环境分支工作流
      • MASTER 分支部署测试环境
      • MASTER 分支向 PRE-PRODUCTION 分支合并,部署预生产环境
      • PRE-PRODECTION 分支向 PRODUCTION 分支合并,部署生产环境
      • 当要部署预生产环境时,它会创建从测试分支到预生产分支的合并请求,而将预生产分支合并到生产分支则会触发代码的直接上线。这种变更的提交,优点是只向下游流动的工作流,可确保所有的变更在所有环境中都经过测试, 但是,在某些极端的情况下,可能需要执行更多的手工测试,这就导致无法执行上述的从测试环境到预生产环境,到生产环境的标准流程,那么我们可以直接从特性分支 cherry pick 一个合并请求,
        到其他的下游分支
        在这里插入图片描述
        • 优点
          • 这种变更提交(commits)只向下游流动的工作流可确保所有变更在所有环境中都经过测试
    • 带发布分支工作流
      • 只有一个 MASTER 分支
      • 每次需要发布时拉取发布分支,并对发布分支打标签
      • 发布分支(STABLE)以 MASTER 分支为起点,尽可能晚的创建
      • 在一个发布分支被公布后,仅有严重错误的修复能被包括在该分支中
      • bug修复也可以独立地创建分支(建议以 fix 前缀命名),它属于临时分支,bug 解决后,可以删除改分支
        在这里插入图片描述
      • 优点
        • 分支数少,易于管理
        • 发布分支明确,从项目管理维度可以明确的判断 bugfix 需要合入分支的策略

    企业实践

    1. Google

    • 工作流程
      • 开发者先创建文件的本地拷贝,这叫做 “工作区”(workspace)。完成开发后,工作区的快照分享给其他开发者进行代码评审。只有通过了评审,代码才能合并到中央仓库
        在这里插入图片描述
    • Google 采用 “主干分支”(trunk-based development)。代码一般提交到主分支的头部。这样保证了所有用户看到的都是同一份代码的最新版本
    • “主干开发” 避免了合并分支时的麻烦。Google 一般不采用分支开发,分支只用来发布。大多数时候,发布分支是主干某个时点的快照。以后的除错和功能增强,都是提交到主干,必要时 cherry-pick 到发布分支
    • 由于不采用 “分支开发”,Google 引入新功能,一般在代码中使用开关控制。这避免了另起一个分支,也使得通过配置切换功能变得容易,一旦新功能发生故障,很容易切换回旧功能。等到新功能稳定,再彻底删除旧代码
      在这里插入图片描述

    2. 华为云

    开发流程

    在这里插入图片描述

    • 三种不同角色的项目成员分工协作
      • Developer 的任务是开发特性需求,修改问题,对合入代码质量承担第一责任
      • Reviewer 的任务是对业务逻辑的正确性,代码规范的遵从度,代码架构等方面进行检视,并提出修改意见,若有多名 Reviewer,分工可各有侧重
      • Committer 的作用是审核代码的整个解释过程,申请入库的代码质量需要其把控,对审核的代码质量承担共同的责任(建议担任 committer 角色的人员应作为 reviewer 成员之一)
    • IT 工具触发门禁检查,门禁检查成功后,通知 reviewer 检视
    • reviewer 收到代码检视通知后,对代码进行检视并提出代码检视意见
    • Developer 收到检视意见后,完善代码并闭环检视意见,更新代码入库申请
    • 最后,Committer 根据工具检查的结果和 reviewer 的意见以及闭环情况,并从代码和架构的长远视角进一步对代码进行审核,决策是否接纳本次代码入库申请
    • 在保证代码质量的前提下,工具门禁检查和人工代码检视可并行执行
    • 工具检查关注的是圈复杂度,嵌套层数,有效注释比例,编译告警,冗余代码,危险函数,重复代码,PC link 告警,编程规范等等
    • 专家评审关注的是命名准确,功能耦合以及架构逻辑的错误
    • 在不同的项目团队中,committer 还可对代码检视的策略进行灵活调整

    分支策略

    工作流的选取

    • 项目版本发布周期
      • 发布周期较长:可选择 Git Flow 工作流,可以很好的解决新功能开发,版本发布,生产系统维护等问题
      • 发布周期较短:可选择 Github 工作流
    • 分支规则:Feature 分支向 Master 分支合入
      • 从 Master 分支拉取 Feature 分支
      • 根据版本节奏,Feature 分支向 Master 分支合入发布版本代码
      • 优点
        • 分支简洁,可以保证主分支的随时可发布特性,可以保证热补丁版本的快速上线,提升客户满意度
      • 问题
        • 这种分支策略对自动化测试等基础设施要求比较高

    小结

    • 生产(master)严禁直接提交代码
    • 在合并到 master 之前执行代码审查,而不是事后审查
    • 功能分支命名应该体现当前功能
    • 重视测试,测试全自动化,合入前确保代码的正确性
    • 提交信息(commit message)应体现意图

    最后,欢迎大家关注我的个人微信公众号 『小小猿若尘』,获取更多IT技术、干货知识、热点资讯。同时,我在公众号中分享了精心整理的一些视频资料(包括 Python全栈教程、AI教程、前端、数据库等),大家回复相应关键词即可获取网盘视频链接,感谢大家的关注😊

     在这里插入图片描述

    展开全文
  • Git合并分支超详细解释

    千次阅读 多人点赞 2021-02-07 13:02:13
    在执行"合并"操作时,我们可以根据具体情况,选择不同的合并模式去合并,不同的合并模式对应了不同的命令参数,而且在合并的过程中,还可能...第2步表示基于base分支,创建了new分支,此时,base分支的指针和new分支
  • git推送本地分支到远程分支

    千次阅读 2021-03-23 15:37:49
    1. commit 信息分类标准...2. git推送本地分支到远程分支 git 拉取远程分支到本地 场景 有时候我们开发需要开一个分支,这样可以有效的并行开发. 开分支有两种方式: 一种是在远程开好分支,本地直接拉下来; 一种是本地开
  • git命令创建分支|合并分支|删除分支

    千次阅读 2022-04-06 10:47:22
    一、 创建test分支提交步骤 1.列出所有分支: # git branch -a 2.创建test分支: # git branch test 3.切换到test分支: # git checkout test 4.添加add修改: # git add . 5.添加commit注释: # git ...
  • (1)git checkout -b 本地分支名 origin/远程分支名 (2)git checkout --track origin/远程分支名 (这种写法是上面的简化版,效果完全一样) (3)git checkout -t origin/远程分支名(这种写法是2的简化版) ...
  • git从某个分支创建新分支

    千次阅读 2022-04-27 14:56:02
    如题,记录一下从某个分支创建新分支的方法。 如从dev分支创建一个test分支 第一种:纯命令行的方式 第一步,切换到你指定的分支 如我要从dev上拉一个分支,代码一模一样 git checkout dev 第二步,拉取dev的最新...
  • TortoiseSVN打分支、合并分支、切换分支

    万次阅读 多人点赞 2018-08-31 17:45:50
    分支,我们一般把那些需要打分支,但是有可能会修改的项目代码,打分支到此目录。 tags文件夹 :分支,我们一般把那些阶段性(如迭代各期)的项目代码,打分支到此目录。 注:其实也不一定非要手动创建这三个...
  • 如何查看本地分支和远程分支之间的diff ?
  • 在Stack Overflow上看到了这样的一个帖子,觉得挺值得学习的,这个帖子是...看完后面的回答,然后得到了一个概念,就是“分支预测”,然后针对分支预测查看了许多资料和论文,觉得收获挺多的,所以写一篇博文记录一下。
  • git 合并分支

    千次阅读 2021-12-12 20:21:37
    假如在one分支上并且one提交项目到仓库完毕 现在想要把one分支合并到master分支下 首先切换到master分支下 git checkout master 把远程master上的代码pull下来 git pull origin master 查看状态 git ...
  • git 创建远程分支和删除 master 分支

    万次阅读 2018-07-19 19:57:54
    最近需要将不同的客户的代码分开管理,所以需要为这些代码分别创建分支。 目前版本库中分支结构如下: [yuhuashi@local:Project]$ git branch -a * master remotes/origin/HEAD -&gt; origin/master rem...
  • git拉取远程分支到本地分支

    千次阅读 2022-03-25 10:50:45
    命令 ...2、拉取远程分支到本地 git fetch origin 远程分支名:本地分支名 这个远程分支名和本地分支名可以不一样, 不过一般都会取一样的名字这样不容易混淆 # 拉取远程 Develop 分支到本地 Develop
  • Git拉取远程分支并创建本地分支

    千次阅读 2022-02-14 18:52:04
    一、查看远程分支 使用如下git命令查看所有远程分支: git branch -r 查看远程和本地所有分支: git branch -a 查看本地分支: git branch 在输出结果中,前面带* 的是当前分支。 二、拉取远程分支并创建本地分支 ...
  • 本地分支合并远程分支 创建本地分支 本地分支修改后commit 切换到远程分支 合并本地分支 push代码 远程分支合并到本地分支 切换到本地分支 合并远程分支
  • Git分支详解

    千次阅读 多人点赞 2022-04-16 01:21:33
    一、什么是分支? 二、图解分支 三、分支的好处 四、基本命令 1. 新增分支 2. 查看分支 3. 切换分支 4. 删除分支 五、分支冲突与解决
  • git本地分支

    千次阅读 2019-07-13 15:13:40
      使用分支你可以把你的工作从开发主线上分离开来,以免影响开发主线 分支简介   我们假设现在有一个工作目录,里面包含了三个将要被暂存和提交的文件。 git add README test.rb LICENSE git commit -m 'The...
  • Git 之 本地分支关联远程分支

    千次阅读 2021-11-03 22:40:00
    本地分支dev,远程分支dev,两者没有关联起来; 一、本地有分支,远程也有对应分支 解决方案一: // 普通删除分支:git branch -d dev git branch -D dev // 这个是强制删除该分支(未被合并的分支被删除的时候需要...
  • git命令-切换分支

    万次阅读 2020-12-19 05:25:09
    git一般有很多分支,我们clone到本地的时候一般都是master分支,那么如何切换到其他分支呢?1. 查看远程分支$ git branch -a我在mxnet根目录下运行以上命令:~/mxnet$ git branch -a* masterremotes/origin/HEAD -&...
  • git 创建本地分支及远程分支

    千次阅读 2021-10-14 14:12:09
    1.创建分支 git branch dev 2.查看本地分支: git branch 注:名称前面加* 号的是当前的分支 3.查看远程分支: 加上-a参数可以查看远程分支,远程分支会用红色表示出来(如果你开了颜色支持的话) git ...
  • git创建分支,合并分支,常用命令

    千次阅读 2017-09-21 16:18:16
    本文非原创, 来源于:http://www.open-open.com/lib/view/open1328069889514.html 这篇文章写得非常全面,而且通俗易懂,本文详细的介绍了:git如何创建分支,如何合并分支,如何管理分支,如何解决冲突。
  • git分支合并到另一个分支

    千次阅读 2022-03-23 17:17:03
    假设当前开发的分支为dev,要合并的目标分支为prd 方式一:IDEA直接操作合并 1、先提交本地dev分支上的代码到远程dev分支 2、右击项目,Git——>Branches,然后切换到目标分支 3、再拉一下远程prd分支的代码 4...
  • 文章目录Git如何合并分支到主干及合并主干到分支零、预备知识一、创建分支二、合并分支到主干三、合并主干到分支 参考资料 精益开发实践用看板管理大型项目 Git如何合并分支到主干及合并主干到分支 Git 分支代码...
  • Git分支管理及命名规范

    千次阅读 2020-12-31 12:19:33
    Git分支管理及命名规范发布时间:2018-05-17 11:24,浏览次数:2056, 标签:Git一、分支分类Git主分支(保留分支):master 、releaseGit辅助分支(临时分支):dev-*、bugfix-*、release-*二、分支简介2.1 master 主分支...
  • 一、查看分支 查看的git命令如下: git branch:列出本地已经存在的分支,并且当前分支会用*标记 git branch -r: 查看远程版本库的分支列表 git branch -a :查看所有分支列表(包括本地和远程,remotes/开头的...
  • 一,git切换到指定分支使用git进行开发的时候经常会遇到需要切换远程分支并且提交到远程指定分支的情况,操作如下1,查看远程所有分支git branch -agit branch不带参数,列出本地已经存在的分支,并且在当前分支的...
  • 一、在Idea中 创建分支 创建方式一: 1.还是选择Git,在Repository中点击branches(分支),操作如图所示: 2.点击后,new branch就是创建新分支啦 3.为你的新分支起个名字吧 而且 这个checkout branch 就是 创建...
  • git新建分支及提交代码到分支

    千次阅读 2021-03-22 01:18:11
    git仓库中只有一个分支,且已经有上传过代码,新的代码不允许直接把你的代码覆盖上去。所以需要你掌握新建分支的方法 问题描述: 如果你在没有新建分支的情况下上传代码,将会报错,如下: To ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 921,976
精华内容 368,790
关键字:

分支

友情链接: sifarish-master.zip