Java程序员学习资料—Git Flow

简介: 在Java程序开发中的定制开发规范,想要把项目正规高效的跑起来。引入 Git 版本控制,Git-Flow 便成为了首选。今天动力节点Java学院来带你了解一下。一、为什么使用 git-flow当在团队开发中使用版本控制系统时,商定一个统一的工作流程是至关重要的。

在Java程序开发中的定制开发规范,想要把项目正规高效的跑起来。引入 Git 版本控制,Git-Flow 便成为了首选。今天动力节点Java学院来带你了解一下。
一、为什么使用 git-flow
当在团队开发中使用版本控制系统时,商定一个统一的工作流程是至关重要的。 Git 的确可以在各个方面做很多事情,然而,如果在你的团队中还没有能形成一个特定有效的工作流程,那么混乱就将是不可避免的。
基本套路:你可以定义一个完全适合你自己项目的工作流程,或者使用一个别人定义好的。
二、安装 git-flow
我们使用 Homebrew 来安装 git-flow:
1.brew install git-flow
之后,通过 git-flow 来初始化项目:
1.git flow init
这时候就会有一些配置的操作,先默认操作:
1.Initialized empty Git repository in /Users/jartto/Documents/git-flow-demo/.git/
2.No branches exist yet. Base branches must be created now.
3.Branch name for production releases: [master]
4.Branch name for "next release" development: [develop]
5.
6.* Please tell me who you are.
7.
8.Run
9.

  1.  git config --global user.email "you@example.com"
  2.  git config --global user.name "Your Name"
    12.

13.to set your account's default identity.
14.Omit --global to set the identity only in this repository.
15.
16.fatal: unable to auto-detect email address (got 'jartto@bogon.(none)')
17.fatal: Not a valid object name: 'master'.
18.error: pathspec 'develop' did not match any file(s) known to git.
19.
20.How to name your supporting branch prefixes?
21.Feature branches? [feature/]
22.Release branches? [release/]
23.Hotfix branches? [hotfix/]
24.Support branches? [support/]
25.Version tag prefix? []
需要强调一点:git-flow 只是封装了 git 的命令。
所以在我们初始化的时候,对仓库并没有其他改动,只是创建了几个分支。当然,如果你不想继续使用 git-flow ,那么只需要简单的停用 git-flow 的命令即可,不需要修改或者删除任何文件。
为了验证一下,我们看下目前的分支,执行:
1.git branch
输出:
1.* develop

  1.  master
    很简单, develop 分支是我们日常开发的分支,会有很多改动。而 master 主要针对线上分支,下面会细说。

这里补充一点,我们可以通过 help 命令来查看用例。
1.git flow help
输出如下:
1.usage: git flow
2.
3.Available subcommands are:

  1.   init      Initialize a new git repo with support for the branching model.
  2.   feature   Manage your feature branches.
  3.   release   Manage your release branches.
  4.   hotfix    Manage your hotfix branches.
  5.   support   Manage your support branches.
  6.   version   Shows version information.
    10.

11.Try 'git flow help' for details.
如果我要看 feature 相关命令呢?
1.git flow feature help
使用规范就会列出来:
1.usage: git flow feature [list] [-v]

  1.       git flow feature start [-F] []
  2.       git flow feature finish [-rFk]
  3.       git flow feature publish
  4.       git flow feature track
  5.       git flow feature diff []
  6.       git flow feature rebase [-i] []
  7.       git flow feature checkout []
  8.       git flow feature pull []
    三、分支模式

git-flow 模式会预设两个主分支在仓库中: 1. master 只能用来包含产品代码 我们不能直接工作在这个 master 分支上,而是在其他指定的,独立的特性分支中。
不直接提交改动到 master 分支上也是很多工作流程的一个共同的规则。
2. develop 是你进行任何新的开发的基础分支 当你开始一个新的功能分支时,它将是开发的基础。另外,该分支也汇集所有已经完成的功能,并等待被整合到 master 分支中。
_1

上面说到的这两个分支被称作为长期分支,它们会存活在项目的整个生命周期中。
而其他的分支,例如针对功能的分支,针对发行的分支,仅仅只是临时存在的。它们是根据需要来创建的,当它们完成了自己的任务之后就会被删除掉。
_2

四、明确分支功能
1. master 分支 最为稳定功能比较完整的随时可发布的代码,即代码开发完成,经过测试,没有明显的 bug,才能合并到 master 中。请注意永远不要在 master 分支上直接开发和提交代码,以确保 master 上的代码一直可用;
2. develop 分支 用作平时开发的主分支,并一直存在,永远是功能最新最全的分支,包含所有要发布 到下一个 release 的代码,主要用于合并其他分支,比如 feature 分支; 如果修改代码,新建 feature分支修改完再合并到 develop 分支。所有的 feature、 release 分支都是从 develop 分支上拉的。
3. feature 分支 这个分支主要是用来开发新的功能,一旦开发完成,通过测试没问题,我们合并回 develop 分支进入下一个 release 。
4. release 分支 用于发布准备的专门分支。当开发进行到一定程度,或者说快到了既定的发布日,可以发布时,建立一个 release 分支并指定版本号(可以在 finish 的时候添加)。开发人员可以对 release 分支上的代码进行集中测试和修改 bug。(这个测试,测试新功能与已有的功能是否有冲突,兼容性)全部完成经过测试没有问题后,将 release 分支上的代码合并到 master 分支和 develop 分支。
5. hotfix 分支 用于修复线上代码的 bug 。从 master 分支上拉。完成 hotfix 后,打上 tag 我们合并回 master 和 develop 分支。
需要注意:
所有开发分支从 develop 分支拉。
所有 hotfix 分支从 master 拉。
所有在 master 上的提交都必要要有 tag,方便回滚。
只要有合并到 master 分支的操作,都需要和 develop 分支合并下,保证同步。
master 和 develop 分支是主要分支,主要分支每种类型只能有一个,派生分支每个类型可以同时存在多个。
五、关于 Feature 分支
在 Git-flow 中,通过使用 Feature 分支,使得我们在同一时间开发多个分支更加简单。 我们接到了一个 Test1 需求,使用 feature start 来启动:
git flow feature start test1
当我们开始一个新的 feature 开发后:
1.Switched to a new branch 'feature/test1'
2.
3.Summary of actions:
4.- A new branch 'feature/test1' was created, based on 'develop'
5.- You are now on branch 'feature/test1'
6.
7.Now, start committing on your feature. When done, use:
8.

  1.     git flow feature finish test1
    我们自动切到了 feature/test1 分支下,正好开始我们的开发,建一个文件先:

1.vi main.js
写入 console.log('hello jartto'); 接着提交我们的变更:
1.git add .
2.git commit -m 'feat: add console.log'
好了,现在我们开发完了,结束 feature 开发:
1.git flow feature finish test1
控制台输出了:
1.Switched to branch 'develop'
2.Updating d975789..27e920c
3.Fast-forward
4.main.js | 1 +
5.1 file changed, 1 insertion(+)
6.create mode 100644 main.js
7.Deleted branch feature/test1 (was 27e920c).
8.
9.Summary of actions:
10.- The feature branch 'feature/test1' was merged into 'develop'
11.- Feature branch 'feature/test1' has been removed
12.- You are now on branch 'develop'
这里做了几件事情: 1.将 feature/test1 分支合并到了 develop 分支; 2.删除了 feature/test1; 3.切换到 develop 分支;
需要注意: git-flow 使用的命令是:
1.git merge —no-ff feature/test1
这样,在我们移除 feature 分支之前,是不会丢失任何历史记录的。
如果你还不了解 --no-ff 相关知识,可以先看看:Git merge 的 –ff 和 –no-ff。
接着,我们看一下变更记录:
1.git log --oneline
输出:
1.27e920c (HEAD -> develop) feat: add console.log
2.d975789 (master) Initial commit
六、release 分支-版本发布
当我们开发完毕,需要去发布新版本的时候,我们可以使用:
1.git flow release start 0.1.0
控制台会有一些提示:
1.Switched to a new branch 'release/0.1.0'
2.
3.Summary of actions:
4.- A new branch 'release/0.1.0' was created, based on 'develop'
5.- You are now on branch 'release/0.1.0'
6.
7.Follow-up actions:
8.- Bump the version number now!
9.- Start committing last-minute fixes in preparing your release
10.- When done, run:
11.

  1.     git flow release finish '0.1.0'
    很清晰,我们简单说一下: 1.基于 develop 分支新建了 release/0.1.0 分支; 2.切换至 release/0.1.0 分支;

又出现了新问题: 1.这是什么意思: Bumpthe version number now! 2. last-minute fixes 又是什么意思?
那接下来我们要做什么呢?不着急,按照提示一步步来。
我们修改了代码,进行add,和 commit 之后,执行:
1.git flow release finish 0.1.0
这个过程中间可能出现异常:
1.fatal: no tag message?
2.Tagging failed. Please run finish again to retry.
输出:
1.Switched to branch 'develop'
2.Merge made by the 'recursive' strategy.
3.test.js | 0
4.1 file changed, 0 insertions(+), 0 deletions(-)
5.create mode 100644 test.js
6.Deleted branch release/0.1.0 (was 0426707).
7.
8.Summary of actions:
9.- Latest objects have been fetched from 'origin'
10.- Release branch has been merged into 'master'
11.- The release was tagged '0.1.0'
12.- Release branch has been back-merged into 'develop'
13.- Release branch 'release/0.1.0' has been deleted
这里主要有几个操作: 1.首先, git-flow 会拉取远程仓库,以确保目前是最新的版本。 2.然后, release 的内容会被合并到 master 和 develop 两个分支中去,这样不仅产品代码为最新的版本,而且新的功能分支也将基于最新代码。 3.为便于识别和做历史参考, release 提交会被标记上这个 release 的 Tag。 4.清理操作,版本分支会被删除,并且回到 develop。
七、Hotfix 线上代码
如果线上代码有问题,这时候你需要紧急修复呢?
我们可以使用 git flow hotfix :
1.git flow hotfix start jartto
看一下执行了什么:
1.Switched to a new branch 'hotfix/jartto'
2.
3.Summary of actions:
4.- A new branch 'hotfix/jartto' was created, based on 'master'
5.- You are now on branch 'hotfix/jartto'
6.
7.Follow-up actions:
8.- Bump the version number now!
9.- Start committing your hot fixes
10.- When done, run:
11.

  1.     git flow hotfix finish 'jartto'
    接着我们新建了目录:

1.mkdir assets
放入一张图片,修改完毕,提交并结束 hotfix:
1.git add .
2.git commit -m 'fix: assets img'
3.git flow hotfix finish 'jartto'
看一下 git-flow 有哪些操作:
1.Switched to branch 'master'
2.Merge made by the 'recursive' strategy.
3.assets/git-flow.png | Bin 0 -> 25839 bytes
4.1 files changed, 0 insertions(+), 0 deletions(-)
5.create mode 100644 assets/git-flow.png
6.Switched to branch 'develop'
7.Merge made by the 'recursive' strategy.
8.assets/git-flow.png | Bin 0 -> 25839 bytes
9.1 files changed, 0 insertions(+), 0 deletions(-)
10.create mode 100644 assets/git-flow.png
11.Deleted branch hotfix/jartto (was a734849).
12.
13.Summary of actions:
14.- Latest objects have been fetched from 'origin'
15.- Hotfix branch has been merged into 'master'
16.- The hotfix was tagged 'jartto'
17.- Hotfix branch has been back-merged into 'develop'
18.- Hotfix branch 'hotfix/jartto' has been deleted
查看一下目前的 Tag 情况:
1.git tag
正是我们上面添加的两个标签:
1.0.1.0
2.jartto
总结一下: 1.完成的改动会被合并到 master 中,同样也会合并到 develop 分支中,这样就可以确保这个错误不会再次出现在下一个 release 中。 2.这个 hotfix 程序将被标记起来以便于参考。 3.这个 hotfix 分支将被删除,然后切换到 develop 分支上去。
八、git-flow 流程图示
恭喜你,到这里你已经完成了 git-flow 的基本流程。为了更加整体的理解工作流,我们来看看下面这张流程图: 
_3
Java
清清楚楚,是不是和我们上面的过程一模一样。
九、参考
动力节点Java架构师班深度剖析Java底层原理,热门技术深入探讨,前沿技术深入解读,大项目实战重构,从0到1做架构,从全局思维出发,带你把控大型项目中别人忽略的重要细节节点,站在巨人肩膀上学习架构师,带你领会架构师不一样的视野

相关文章
|
2月前
|
Java 程序员
JAVA程序员的进阶之路:掌握URL与URLConnection,轻松玩转网络资源!
在Java编程中,网络资源的获取与处理至关重要。本文介绍了如何使用URL与URLConnection高效、准确地获取网络资源。首先,通过`java.net.URL`类定位网络资源;其次,利用`URLConnection`类实现资源的读取与写入。文章还提供了最佳实践,包括异常处理、连接池、超时设置和请求头与响应头的合理配置,帮助Java程序员提升技能,应对复杂网络编程场景。
67 9
|
2月前
|
开发工具 git
学习Git的最佳实践有哪些?
遵循这些最佳实践,能让你更高效地使用 Git,更好地管理项目的版本和协作。
|
2月前
|
存储 开发工具 git
Git 学习----基本概念
理解这些基本概念是掌握 Git 操作的重要基础,它们为有效地管理项目的版本和开发过程提供了支持。通过不断实践和使用 Git,开发者可以更加高效地协作和管理项目的演变
|
3月前
|
XML Java 编译器
Java学习十六—掌握注解:让编程更简单
Java 注解(Annotation)是一种特殊的语法结构,可以在代码中嵌入元数据。它们不直接影响代码的运行,但可以通过工具和框架提供额外的信息,帮助在编译、部署或运行时进行处理。
104 43
Java学习十六—掌握注解:让编程更简单
|
2月前
|
SQL 存储 Java
面向 Java 程序员的 SQLite 替代品
SQLite 是轻量级数据库,适用于小微型应用,但其对外部数据源支持较弱、无存储过程等问题影响了开发效率。esProc SPL 是一个纯 Java 开发的免费开源工具,支持标准 JDBC 接口,提供丰富的数据源访问、强大的流程控制和高效的数据处理能力,尤其适合 Java 和安卓开发。SPL 代码简洁易懂,支持热切换,可大幅提高开发效率。
|
2月前
|
Java 大数据 API
14天Java基础学习——第1天:Java入门和环境搭建
本文介绍了Java的基础知识,包括Java的简介、历史和应用领域。详细讲解了如何安装JDK并配置环境变量,以及如何使用IntelliJ IDEA创建和运行Java项目。通过示例代码“HelloWorld.java”,展示了从编写到运行的全过程。适合初学者快速入门Java编程。
|
3月前
|
存储 SQL 小程序
JVM知识体系学习五:Java Runtime Data Area and JVM Instruction (java运行时数据区域和java指令(大约200多条,这里就将一些简单的指令和学习))
这篇文章详细介绍了Java虚拟机(JVM)的运行时数据区域和JVM指令集,包括程序计数器、虚拟机栈、本地方法栈、直接内存、方法区和堆,以及栈帧的组成部分和执行流程。
45 2
JVM知识体系学习五:Java Runtime Data Area and JVM Instruction (java运行时数据区域和java指令(大约200多条,这里就将一些简单的指令和学习))
|
3月前
|
开发工具 git
git学习四:常用命令总结,包括创建基本命令,分支操作,合并命令,压缩命令,回溯历史命令,拉取命令
这篇文章是关于Git常用命令的总结,包括初始化配置、基本提交、分支操作、合并、压缩历史、推送和拉取远程仓库等操作的详细说明。
147 1
git学习四:常用命令总结,包括创建基本命令,分支操作,合并命令,压缩命令,回溯历史命令,拉取命令
|
3月前
|
Shell 开发工具 git
git学习三:git使用:删除仓库,删除仓库内文件
通过GitHub的设置页面删除仓库,以及如何使用Git命令行删除仓库中的文件或文件夹。
188 1
git学习三:git使用:删除仓库,删除仓库内文件
|
2月前
|
SQL Java 程序员
倍增 Java 程序员的开发效率
应用计算困境:Java 作为主流开发语言,在数据处理方面存在复杂度高的问题,而 SQL 虽然简洁但受限于数据库架构。SPL(Structured Process Language)是一种纯 Java 开发的数据处理语言,结合了 Java 的架构灵活性和 SQL 的简洁性。SPL 提供简洁的语法、完善的计算能力、高效的 IDE、大数据支持、与 Java 应用无缝集成以及开放性和热切换特性,能够大幅提升开发效率和性能。