zoukankan      html  css  js  c++  java
  • Git笔记:GitFlow工作流模拟、分支管理、使用规范

    参考链接

    http://www.ruanyifeng.com/blog/2012/07/git.html

    http://www.ruanyifeng.com/blog/2015/08/git-use-process.html

    https://github.com/xirong/my-git/blob/master/git-workflow-tutorial.md#25-pull-requests

    https://github.com/xirong/my-git

    https://www.liaoxuefeng.com/wiki/896043488029600/900003767775424

    规范

    分支的命名限定在以下范围(master | dev | develop | release | feature/xxx | hotfix/xxx | fix/xxx ) xxx为任意内容

    Eg. 1.feature/酒店信息管理 2.hotfix/订单流程更改

    每次commit时,添加的描述信息需要有一个特定的前缀,限定在以下范围(feat|doc|test|docs|chore|refactor|fix|style| perf): xxx 注意冒号后面有一个空格

    Eg. 1.feat: 查看酒店信息功能完成 2.fix: 浏览酒店bug修复

    例子

    做个例子来模拟一下这样的一个开发场景

    1583406961320

    • master:主分支
    • release:预发布分支
    • dev:开发分支
    • feature/xxx:开发某个功能
    • fix/xxx:修复功能

    模拟

    建了三个文件夹,模拟三个成员【person1、person2、person3】进行开发

    用了三个不同的终端进行控制

    首先,三个人都给他clone下来

    写完才发现person3没用到,就当他不存在吧

    1583409967242

    person1一开始就给他建好了master和release分支,然后push到远端

    git checkout -b release
    git add .
    git commit -m 'feat: xxx'
    git push --set-upstream origin release
    
    git checkout -b dev
    git add .
    git commit -m 'feat: xxx'
    git push --set-upstream origin dev
    

    这个时候person2和person3还没有这两个branch,最好pull一下

    1583403473485

    此时git仓库的状态时这样的

    1583407171224

    有三个分支,但是分支里面啥也没有

    每个人进行工作

    举个例子

    person1拉了一个分支为feature/a

    做了以下工作:

    • 创建一个a.txt
    • 在readme.md中添加【person1到此一游】

    person2拉了一个分支为feature/b

    做了以下工作

    • 创建一个b.txt
    • 在readme.md中添加【person2到此一游】

    person1先合并

    person1在feature/a上commit了两次,然后拉取dev分支进行merge

    很显然,这时候他是第一个做这个工程的人,什么都没变,直接就push上去了

    git checkout -b feature/a
    git add .
    git commit -m 'feat: xxx'
    git add .
    git commit -m 'feat: xxx'
    git fetch origin dev
    git checkout dev
    此时指向的是dev分支,进行merge
    git merge feature/a --no-ff
    

    注意!!!:

    merge合并的时候最好使用--no-ff指令!

    git merge –no-ff 可以保存你之前的分支历史。能够更好的查看 merge历史,以及branch 状态。

    git merge 则不会显示 feature,只保留单条分支记录。

    1583409334691

    1583407355116

    person2准备合并

    这个时候b的工作也做完了,准备合并到dev分支

    1583407490370

    但是这时候出了一些问题

    直接push的话显示是不行的,因为person2的dev滞后与origin dev

    1583405303289

    于是我们尝试先fetch一下origin dev

    git fetch origin dev
    git checkout dev
    

    新的问题出现了

    当person2 checkout到dev分支上的时候,会提示版本滞后

    1583407671903

    这个时候还挺奇怪的,因为明明把远端仓库的dev分支fetch下来了,为什么还会behind?

    因为fetch下来以后发现比本地的dev还要新,但是git不会自动帮你合并

    img

    这时候有两个选择

    • git pull
    • git fetch + git merge

    推荐使用git fetch+git merge

    Git中从远程的分支获取最新的版本到本地有这样2个命令:

    • git fetch:相当于是从远程获取最新版本到本地,不会自动merge
    git fetch origin master
    git merge origin/master
    

    首先从远程的origin的master主分支下载最新的版本到origin/master分支上

    然后比较本地的master分支和origin/master分支的差别

    最后进行合并

    上述过程其实可以用以下更清晰的方式来进行:

    推荐

    git fetch origin dev:temp
    git diff tmp 
    git checkout dev
    git merge temp
    git add .
    git commit -m"xxx"
    git push origin dev
    

    ​ 从远程获取最新的版本到本地的temp分支上

    ​ 之后再进行比较合并

    ​ 最后可以把temp分支删掉

    • git pull
    git pull origin master
    

    ​ 上述命令其实相当于git fetch 和 git merge

    ​ 在实际使用中,git fetch更安全一些

    ​ 因为在merge前,我们可以查看更新情况,然后再决定是否合并。

    ​ 此外,使用pull还会产生一个问题,git会自动帮你commit一次,放在系统里好像会引起不规范

    1583408305230

    merge时候会提示冲突的地方,手动修改完提交就可以了

    1583408393214

    这时候的状态大概是这样的

    1583408560421

    release分支和master分支

    和上面类似 dev分支开发到一定时期放到预发布分支release上

    之后可以发布到master分支上

    1583408660380

    更清晰一点看就是这这样子

    1583406961320

    tag

    可以先git checkout到某一个节点,然后用git tag打上版本号

    1583408948462

    模拟工具

    https://learngitbranching.js.org/

  • 相关阅读:
    .net的25个小技巧
    使用ASP.Net2.0国际化你的网站祥解
    国外C#开源项目(转)
    千千阙歌
    js中var的有或无重复声明和以后的声明
    XMLHttpRequest
    java参数与引用
    Total Commander
    XMLDOM 的async属性
    Java内嵌类
  • 原文地址:https://www.cnblogs.com/cpaulyz/p/12422311.html
Copyright © 2011-2022 走看看