# GitFlow

# 什么是 GitFlow?

Gitflow 是一种替代的 Git 分支模型,涉及功能分支和多个主分支的使用。该书最初由文森特・德里森在 nvie 出版并推广开来。与基于 trunk 的开发相比,Gitflow 拥有众多且寿命更长的分支和更大的提交。在该模型下,开发者创建一个功能分支,并延迟将其合并到主干分支,直到功能完成。这些寿命较长的特征分支需要更多的协作来合并,且偏离主干分支的风险更高。它们也可能引入冲突更新。

Gitflow 可用于有预定发布周期的项目,也可用于持续交付的 DevOps 最佳实践。除了功能分支工作流程所需的概念或命令外,此工作流程不会添加任何新概念或命令。相反,它为不同的分支分配了非常具体的角色,并定义了它们应该如何以及何时进行交互。除了 feature 分支外,它还使用单独分支来准备、维护和录制版本。当然,您还可以利用功能分支工作流程的所有优势:拉取请求、隔离实验和更高效的协作。

# 五大分支

  1. 主分支:main / master
  2. 开发分支:develop
  3. 功能分支:feature
  4. 发布分支:release
  5. 热修复分支 hotfix

# 主分支: main / master

永远保持可发布状态

每一次提交都应该是已经测试、可上线的版本

通常只允许:

  • release 合并进来
  • hotfix 合并进来

一般会在这里 打 tag

v1.0.0
v1.1.0

不在 main 上直接开发代码

# 开发分支: develop

作用:日常开发的集成分支

  • 所有新功能最终都会合并到这里
  • 包含 “下一个版本” 的所有开发内容
  • 相对不如 main 稳定,但应该是可运行的

特点:

  • feature → develop
  • develop → release

# 功能分支: feature/*

作用:开发具体功能

  • 从 develop 拉出来
  • 一个功能一个分支
  • 功能完成后合并回 develop

# 发布分支: release/*

作用:版本发布前的 “冻结分支”

  • 从 develop 拉出来
  • 只允许:
    • bug 修复
    • 文档 / 版本号修改
  • 不再添加新功能

# 热修复分支: hotfix/*

作用:线上紧急 Bug 修复

  • 从 main 拉出来
  • 修完立刻发布
  • 同时要合并回 develop

# 基本图

1

# 前置流程

1 1 1

# 开发新需求 A

1

提交

1

观察到 dev 并未受影响。

1 1

# 开发新需求 B 与 C

省略,同样提交并合并到 dev 之中

# 合并的结果

1

为了整洁,新特性开发完毕之后需可以删除分支。

1

# 发布分支

1

# 生产环境出 bug 了怎么办

使用 hotfix 分支

1

结束之后合并到 main 与 dev

# GitFlow 的优缺点

优点:分支职责清晰,结构规范,支持并行开发,发布流程可控、可追溯,对线上问题响应快,适合传统软件工程流程

缺点:分支较多,流程偏重,不太适合高频发布,合并冲突概率较高

# 版本回退、撤销、重置

查看当前状态:

git status

# 未 add 的代码行发生改动怎么回退?

1
git checkout -- F2
1 1

# 已 add 未 commit 的代码行发生改动怎么回退?

1
git reset HEAD XXXX
1 1 1

# 已 add 已 commit 未 push 的代码行发生改动怎么回退?

两个异常改动

1

两个 ^ 就是回退两步

1 1

# 已 add 已 commit 已 push 的代码行发生改动怎么回退?

1
git revert --no-edit cxxxxx

其中 cxxxx 是提交流水号。

更方便地使用还原提交。

1 1 1

revert 后是否可以再 revert?答案是可以的。

# git stash

git stash 是临时保存当前未提交的修改,把工作区恢复到 “干净状态”

写了一半代码,还不想 commit ,又必须马上切分支 / 拉代码 / 修 Bug, git stash 就是把现场 “打包放抽屉里”

1 1 1

# git cherry-pick

把 “某一个(或几个)提交” 从别的分支,复制一份,应用到当前分支

关键词:只要这个提交,不要整个分支

或者说,提交了 100 行,有 60 还可以,40 行我有点后悔了,怎么只撤回这 40 行?

1

先 revert,push 到远程

1

基于现有分支,创建新分支

1

撤销修改

1

冻结

1 1 1

# 变基 rebase 和合并 merge

合并( git merge )是什么,就是把两个分支的历史合并到一起。

变基( git rebase )是什么,把一个分支的提交 “挪到” 另一个分支的末尾

merge 通常是弯弯曲曲的路线,而 rebase 把对方的线路合并到你这里,但是这个合并更像是重新播放了一遍,改写了历史,使之成为了更加线性的流程。

rebase 推荐在本地上使用,更加整洁,团队协作推荐使用 merge。

# 拉取 pull 和提取 fetch

提取是看看哪些变了(不修代码),拉取真正到本地(修代码)

最佳实践是,先 fetch 看看那些变了,再 pull 去更新我们的代码。

更新于

请我喝[茶]~( ̄▽ ̄)~*

KarryLiu 微信支付

微信支付

KarryLiu 支付宝

支付宝