Git workflow工作流及边角知识

Git workflow工作流及边角知识

开篇

Git是个老生长谈的问题了,如何在工作协作中使用Git,不同团队有不同的使用方式,最简单的可能就单个master分支直接撸,把Git当成svn来使用,这样用起来简单,但是缺乏分布式的思想,而且在并行开发过程中,光建立trunk、branch、tag等等的就很繁琐了。业界通用的用法还是Git workflow工作流。

workflow工作流

标准的workflow工作流是如下图所示:
workflow

具体的使用方式可以参考以下两篇文章:

什么是GitFlow工作流?.
Git Flow工作流程.

我们在此框架上,结合团队特点,简化了流程,定的规则是:

  1. 基本分支: master、develop、feature、release、bugfix
  2. master分支: 只向master做并入操作,当feature开发完毕,向master并入并打上标签。
  3. develop分支: 当新feature需要开发的时候,直接从develop创建分feature分支;
  4. feature分支: feature分支作为特定版本开发分支,提测通过后,向develop并入,同时向master合并并打上标签,切出release分支,配置上线参数,删除feature分支。
  5. release分支: 作为打包发布的分支,同时也作为bugfix的分支,修复完就向develop和master合并;
  6. hotfix分支 从release上fork出来,然后并入到release中,其后生命周期和release一样,视情况而定,有时直接在release分支上做bugfix就不需要用到hotfix了;

rebase onto

在说rebase onto之前,我们先来谈一谈rebase。把其他分支或者其他修改commit合并到工作分支上,一般的处理方式是merge和rebase(衍合)。
merge的两种主要用途:

  1. 用于pull (pull=fetch+merge)
  2. 用于其他的分支合并到工作分支

首先我们有两个分支feature分支和master分支,feature分支有节点E、F、G,master分支有A、B、C、D。
在这里插入图片描述

现在我们在当前的master分支上执行merge feature分支的操作git merge feature,这个命令将会把在master分支上二者共同的节点(B节点)之后分离的节点(即feature分支的E F G节点)重现在master分支上,直到feature分支当前的commit节点(G节点),并位于master分支的顶部。并且沿着master分支和feature分支创建一个记录合并结果的新节点,该节点带有用户描述合并变化的信息。

即下图中的H节点,G节点和D节点都是H节点的父节点。这就是我们常见的钻石链了。如下图所示:
在这里插入图片描述

git rebase 则不一样,它形成的是feature分支在共同节点B以后的快照(E’、F’、G’),并直接插入到master的尾部commit节点上,完成变基操作,这就是git rebase master feature的整个过程。
在这里插入图片描述

rebase是一个变基操作,rebase onto则是多主题变基操作。
来看看以下的情况:

在这里插入图片描述

我们在feature分支上开发到F节点的时候,突然发现有个bug需要修复,然后就从F节点上新建了分支bugfix,提交了H、I、J节点,修复完成后想直接讲这三个节点合并到master上。
这个时候,如果直接用rebase命令的话,那么接在master D节点后面的就会是E、F、H、I、J这五个节点的快照,但是我们只想要H、I、J的快照啊。
这时,就可以用git rebase --onto master feature bugfix了。其中feature、bugfix形成了一个前开后闭的区间,及前面feature分支上的E、F不要了,后面的bugfix分支H、I、J才需要。
最后的结果是
在这里插入图片描述

reset

git reset命令是Git提供的后悔药之一,它可以帮我们把内容恢复到指定的commit提交版本。
这个操作比较吓人,一般慎用。还是用revert多一点
一共有三种调用模式

  1. 比如我们得知某个提交的哈希值是df132es
git reset df132es --hard
  1. 使用HEAD作为参数
git reset HEAD^ --hard

HEAD执行当前分支, ^ 当前分支所指向提交的前一个提交,^ ^ 表示当前分支所指向提交的前一个分支的前一个分支,以此类推;^^过多自然不太方便,可以使用HEAD~2表示

  1. 将分支指向最后一次commit,下面使用分支名称(master)作为参数,将分支指reset 向前一个commit向前一个commit)作为参数,将分支指reset 向前一个commit向前一个commit
git reset master^ --hard

revert

git revert 撤销某次操作,此次操作之前和之后的 commit 和 history 都会保留,并且把这次撤销作为一次最新的提交。git revert是提交一个新的版本,将需要revert的版本的内容再反向修改回去,版本会递增,不影响之前提交的内容。
命令用法与reset类似,但是revert并不会对原有的提交记录产生影响,只会生成一个反向的commit来进行恢复,所以回滚版本的时候一般会选择这个。
具体可以参考这个:
回滚revert和reset区别

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值