GIt 学习 (3) - git flow

什么是 git-flow?

   git-flow 是对 Git 管理代码的一种流程和规范,git-flow 并不会为 Git 扩展任何新的功能,它仅仅使用了脚本来捆绑了一系列 Git 命令来完成一些特定的工作流程。简而言之, git-flow 封装了一系列 Git 命令,开发者不需要关心内部的具体实现,只需要关心每个操作所实现的功能即可。它是开发过程中”分支”创建、销毁、合并的一种规范,并不是一定要学习和使用,但是它引入的这种规范和概念是有学习的必要。
   举个简单的例子,在开发过程中,我们经常把重复的代码,封装到一个方法供我们调用。git-flow 则是将重复可用的 git 命令封装到 git-flow 中。

为什么选择 git-flow ?

实际开发中,如果团队成员比较多,开发迭代频繁,对 Git 的应用比较混乱,会产生很多不必要的冲突或者代码丢失等。 而 git-flow 可以使得版本库的演进保持简洁,主干清晰,各个分支有不同的职责,在很大程度上减少冲突的产生。

基本概念

  • master : 保留完全稳定的代码,一般不直接在该分支上修改,在其他分支上修改,然后合并到 master 分支上 。
  • develop : 是你进行任何新的开发的基础分支,当你开始一个新的功能分支时,它将是开发的基础。另外,该分支也汇集所有已经完成的功能,并等待被整合到 master 分支中。
  • feature : 基于 develop 分支, 开发新的功能 , 开发完成后合并到 develop 分支 。同时删除 featrure 分支。
  • release : 基于 develop 分支,准备发布新的版本,在该分支上修改版本名和版本号,开发完成后,分支会被合并到 develop 和 master 。同时会为 release 分支 打标签(tag), 并删除 release 分支。
  • hotfix : 基于 master 分支,版本发布后,需要在该分支上修复 bug 。bug 修复完成后,分支会被合并到 develop 和 master 。同时会为 hotfix 分支 打标签(tag), 并删除 - hotfix 分支。

下载

首选你需要安装 Git ,其次安装 git-flow 。
Windows 下 Tortoisegit 默认已支持 git-flow 。如果你已经安装 Tortoisegit ,那么不需要额外安装。
如果你是其他平台,相应的下载链接如下 :
https://github.com/petervanderdoes/gitflow-avh/wiki#installing-git-flow

具体操作

初始化 : 使用 git-flow,从初始化一个现有的 git 库内开始, 你必须回答几个关于分支的命名约定的问题,建议使用默认值,直接敲回车即可。

git flow init

创建 feature 分支,如下。 可以看到 git flow 帮我做了下面几件事 :
1. 基于develop 分支创建 feature/rss-feed 。
2. 切换到 feature/rss-feed 分支 。

$ git flow feature start rss-feed
Switched to a new branch 'feature/rss-feed'

Summary of actions:
- A new branch 'feature/rss-feed' was created, based on 'develop'
- You are now on branch 'feature/rss-feed'

Now, start committing on your feature. When done, use:
      git flow feature finish rss-feed

开发完成后,合并 feature/rss-feed 分支 到 develop 分支并删除分支 。如果不想合并后删除分支,可添加 -k 。

$ git flow feature finish rss-feed
Switched to branch 'develop'
Updating f4ac634..9fdd259
Fast-forward
 HelloWorld.txt | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
Deleted branch feature/rss-feed (was 9fdd259).

Summary of actions:
- The feature branch 'feature/rss-feed' was merged into 'develop'
- Feature branch 'feature/rss-feed' has been locally deleted
- You are now on branch 'develop'

当你认为现在在 “develop” 分支的代码已经是一个成熟的 release 版本时,这意味着:第一,它包括所有新的功能和必要的修复;第二,它已经被彻底的测试过了。如果上述两点都满足,那就是时候开始生成一个新的 release 了。

$ git flow release start 1.0
Switched to a new branch 'release/1.0'

Summary of actions:
- A new branch 'release/1.0' was created, based on 'develop'
- You are now on branch 'release/1.0'
Follow-up actions:
- Bump the version number now!
- Start committing last-minute fixes in preparing your release
- When done, run:
     git flow release finish '1.0'

有了一个 release 分支,再完成针对 release 版本号的最后准备工作(如果项目里的某些文件需要记录版本号),并且进行最后的编辑。
可以看到, release finish 合并代码到 master 和 develop 。并删除了 release/1.0 分支。并且帮你在本地生成了 tag 1.0 版本,因此执行 release finish , 你会被要求输入 tag 的提交信息(通过 Vim 编辑器输入提交信息,因此你需要了解一点 Vim 的基本操作)。

$ git flow release finish 1.0
Switched to branch 'master'
Switched to branch 'develop'
Merge made by the 'recursive' strategy.
 bugfix.txt | 2 ++
 1 file changed, 2 insertions(+)
 create mode 100644 bugfix.txt
Deleted branch release/1.0 (was 265c784).

Summary of actions:
- Release branch 'release/1.0' has been merged into 'master'
- The release was tagged '1.0'
- Release tag '1.0' has been back-merged into 'develop'
- Release branch 'release/1.0' has been locally deleted
- You are now on branch 'develop'

我们说到 git release 会帮助生成 tag 版本 。因此我们输入 git tag , 可以看到一个 1.0 的提示。

$ git tag
1.0

正常的 push 不会推送本地的 tag 。因此记得执行,记得 push 的时候你需要指定远程服务器的 URL

$  git remote add <name> <url>  // 指定远程服务器,如果已经指定,不需要执行
$ git push --tags  // 将本地所有的 tag 推送到远程服务器
或者
$  git push <remote> <tag> // 推送指定 tag 到远程服务器

很多时候,仅仅在几个小时或几天之后,当对 release 版本作做全面测试时,可能就会发现一些小错误。
在这种情况下,git-flow 提供一个特定的 “hotfix” 工作流程 。 hotfix 分支是基于 “master” 分支,并不是基于 develop 分支。
创建 hotfix 分支 :

$ git flow hotfix start issue
Switched to a new branch 'hotfix/issue'

Summary of actions:
- A new branch 'hotfix/issue' was created, based on 'master'
- You are now on branch 'hotfix/issue'

Follow-up actions:
- Start committing your hot fixes
- Bump the version number now!
- When done, run:
     git flow hotfix finish 'issue'

执行 hotfix finish 后, 会将代码合并到 master 和 develop 分支,同时删除 hotfix 分支,并切换到 develop 分支。注意 hotfix 也创建了 tag 分支 ,因此在命名的时候我们可以
这样命名 [版本号]-hotfix-[修复后的版本号]。

$ git flow hotfix finish issue
Switched to branch 'master'
Merge made by the 'recursive' strategy.
 hotfix.txt | 0
 1 file changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 hotfix.txt
Switched to branch 'develop'
Merge made by the 'recursive' strategy.
 hotfix.txt | 0
 1 file changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 hotfix.txt
Deleted branch hotfix/issue (was 2216e8d).

Summary of actions:
- Hotfix branch 'hotfix/issue' has been merged into 'master'
- The hotfix was tagged 'issue'
- Hotfix tag 'issue' has been back-merged into 'develop'
- Hotfix branch 'hotfix/issue' has been locally deleted
- You are now on branch 'develop'

命令汇总

命令 描述
git flow feature start myfeature 基于 develop 分支创建 feaure/myfeature 分支, 并切换到 feaure/myfeature 分支。
git flow feature finish myfeature 合并 myfeature 到 develop 分支, 删除 feaure/myfeature 分支并切换到 develop 分支。
git flow release start 1.0.0 基于 develop 创建 release 1.0.0 分支, 并切换到release /1.0.0分支。
git flow release finish 1.0.0 git-flow 会拉取远程仓库,以确保目前是最新的版本 。2.release 的内容会被合并到 “master” 和 “develop” 两个分支中去,这样不仅产品代码为最新的版本,而且新的功能分支也将基于最新代码。 3. release 会打上 1.0.0 的标签 4. 删除 release 分支并切换到 develop 分支。(记得 git push –tags)
git flow hotfix start missing-link 基于 master 分支, 创建 missing-link 分支,并切换到 missing-link 分支 。
git flow hotfix finish missing-link 1.合并分支代码到 master” 和 “develop” 两个分支 2. hotfix 会打上 missing-link 的标签 3. 删除 missing-link 分支,并切换到 develop 分支。

总结 :

  1. master 分支和 develop 分支 这两个分支被称作为 长期分支。它们会存活在项目的整个生命周期中。而其他的分支,例如针对功能的分支,针对发行的分支,仅仅只是临时存在的。它们是根据需要来创建的,当它们完成了自己的任务之后就会被删除掉。
    他们之间的关系可以用下图表示:
    这里写图片描述
  2. 禁止直接提交到 master 分支

  3. 稳定分支

    • master 是稳定分支
    • 其他分支 都是不稳定分支
  4. 在分支上做什么

    • 一个分支做且只做一件事 (包括但不限于功能开发 修复Bug 整合 发布 紧急修复 等)
    • 如果要做多件事,开多个分支
    • 尽量避免多个人在同一分支上做事
  5. 分支生命周期

    • 如果做完一件事,分支的生命周期就结束了,要删掉这个分支
    • 分支的生命周期,越短越好,不要长期持有一个分支

参考链接

https://www.git-tower.com/learn/git/ebook/cn/command-line/advanced-topics/git-flow
https://danielkummer.github.io/git-flow-cheatsheet/
https://yq.aliyun.com/articles/137035
https://yq.aliyun.com/articles/68655?spm=a2c4e.11153940.blogcont137035.16.5054385eAdgoZe

猜你喜欢

转载自blog.csdn.net/stupid56862/article/details/80708811
今日推荐