Git 分支管理最佳实践

article/2025/11/8 13:22:08

Git 是目前最流行的源代码管理工具。大量的软件项目由 GitHub、Bitbucket 和 GitLab 这样的云服务平台或是私有的 Git 仓库来管理。在使用 Git 时通常会遇到的一个问题是采用何种分支管理实践,即如何管理仓库中作用不同的各类分支。和软件开发中的其他实践一样,Git 分支管理并没有普遍适用的最佳做法,而只有对每个团队和项目而言最适合的做法。简单来说,在项目开发中使用多个分支会带来额外的管理和维护开销,但是多个分支对于项目的团队合作、新功能开发和发布管理都是有一定好处的。不同的团队可以根据团队人员组成和意愿、项目的发布周期等因素选择最适合的策略,找到最适合团队的管理方式。本文将介绍三种常见的 Git 分支管理方式。

单主干

单主干的分支实践(Trunk-based development,TBD)在 SVN 中比较流行。 Google 和 Facebook 都使用这种方式。trunk 是 SVN 中主干分支的名称,对应到 Git 中则是 master 分支。TBD 的特点是所有团队成员都在单个主干分支上进行开发。当需要发布时,先考虑使用标签(tag),即 tag 某个 commit 来作为发布的版本。如果仅靠 tag 不能满足要求,则从主干分支创建发布分支。bug 修复在主干分支中进行,再 cherry-pick 到发布分支。图 1 是 TBD 中分支流程的示意图。

图 1. TBD 中的分支流程的示意图

由于所有开发人员都在同一个分支上工作,团队需要合理的分工和充分的沟通来保证不同开发人员的代码尽可能少的发生冲突。持续集成和自动化测试是必要的,用来及时发现主干分支中的 bug。因为主干分支是所有开发人员公用的,一个开发人员引入的 bug 可能对其他很多人造成影响。不过好处是由于分支所带来的额外开销非常小。开发人员不需要频繁在不同的分支之间切换。

GitHub flow

GitHub flow 是 GitHub 所使用的一种简单的流程。该流程只使用两类分支,并依托于 GitHub 的 pull request 功能。在 GitHub flow 中,master 分支中包含稳定的代码。该分支已经或即将被部署到生产环境。master 分支的作用是提供一个稳定可靠的代码基础。任何开发人员都不允许把未测试或未审查的代码直接提交到 master 分支。

对代码的任何修改,包括 bug 修复、hotfix、新功能开发等都在单独的分支中进行。不管是一行代码的小改动,还是需要几个星期开发的新功能,都采用同样的方式来管理。当需要进行修改时,从 master 分支创建一个新的分支。新分支的名称应该简单清晰地描述该分支的作用。所有相关的代码修改都在新分支中进行。开发人员可以自由地提交代码和 push 到远程仓库。

当新分支中的代码全部完成之后,通过 GitHub 提交一个新的 pull request。团队中的其他人员会对代码进行审查,提出相关的修改意见。由持续集成服务器(如 Jenkins)对新分支进行自动化测试。当代码通过自动化测试和代码审查之后,该分支的代码被合并到 master 分支。再从 master 分支部署到生产环境。图 2 是 GitHub flow 分支流程的示意图。

图 2. Github flow 中的分支流程的示意图

GitHub flow 的好处在于非常简单实用。开发人员需要注意的事项非常少,很容易形成习惯。当需要进行任何修改时,总是从 master 分支创建新分支。完成之后通过 pull request 和相关的代码审查来合并回 master 分支。GitHub flow 要求项目有完善的自动化测试、持续集成和部署等相关的基础设施。每个新分支都需要测试和部署,如果这些不能自动化进行,会增加开发人员的工作量,导致无法有效地实施该流程。这种分支实践也要求团队有代码审查的相应流程。

git-flow

git-flow 应该是目前流传最广的 Git 分支管理实践。git-flow 围绕的核心概念是版本发布(release)。因此 git-flow 适用于有较长版本发布周期的项目。虽然目前推崇的做法是持续集成和随时发布。有的项目甚至可以一天发布很多次。随时发布对于 SaaS 服务类的项目来说是很适合的。不过仍然有很大数量的项目的发布周期是几个星期甚至几个月。较长的发布周期可能是由于非技术相关的因素造成的,比如人员限制、管理层决策和市场营销策略等。

git-flow 流程中包含 5 类分支,分别是 master、develop、新功能分支(feature)、发布分支(release)和 hotfix。这些分支的作用和生命周期各不相同。master 分支中包含的是可以部署到生产环境中的代码,这一点和 GitHub flow 是相同的。develop 分支中包含的是下个版本需要发布的内容。从某种意义上来说,develop 是一个进行代码集成的分支。当 develop 分支集成了足够的新功能和 bug 修复代码之后,通过一个发布流程来完成新版本的发布。发布完成之后,develop 分支的代码会被合并到 master 分支中。

其余三类分支的描述如所示。这三类分支只在需要时从 develop 或 master 分支创建。在完成之后合并到 develop 或 master 分支。合并完成之后该分支被删除。这几类分支的名称应该遵循一定的命名规范,以方便开发人员识别。

表 1. git-flow 分支类型

分支类型 命名规范 创建自 合并到 说明
feature feature/* develop develop 新功能
release release/* develop develop 和 master 一次新版本的发布
hotfix hotfix/* master develop 和 master 生产环境中发现的紧急 bug 的修复

对于开发过程中的不同任务,需要在对应的分支上进行工作并正确地进行合并。每个任务开始前需要按照指定的步骤完成分支的创建。例如当需要开发一个新的功能时,基本的流程如下:

  • 从 develop 分支创建一个新的 feature 分支,如 feature/my-awesome-feature。
  • 在该 feature 分支上进行开发,提交代码,push 到远端仓库。
  • 当代码完成之后,合并到 develop 分支并删除当前 feature 分支。

在进行版本发布和 hotfix 时也有类似的流程。当需要发布新版本时,采用的是如下的流程:

  • 从 develop 分支创建一个新的 release 分支,如 release/1.4。
  • 把 release 分支部署到持续集成服务器上进行测试。测试包括自动化集成测试和手动的用户接受测试。
  • 对于测试中发现的问题,直接在 release 分支上提交修改。完成修改之后再次部署和测试。
  • 当 release 分支中的代码通过测试之后,把 release 分支合并到 develop 和 master 分支,并在 master 分支上添加相应的 tag。

因为 git-flow 相关的流程比较繁琐和难以记忆,在实践中一般使用 辅助脚本 来完成相关的工作。比如同样的开发新功能的任务,可以使用 git flow feature start my-awesome-feature 来完成新分支的创建,使用 git flow feature finish my-awesome-feature 来结束 feature 分支。辅助脚本会完成正确的分支创建、切换和合并等工作。

Maven JGit-Flow

对于使用 Apache Maven 的项目来说,Atlassian 的 JGit-Flow 是一个更好的 git-flow 实现。JGit-Flow 是一个基于 JGit 的纯 Java 实现的 git-flow,并不需要安装额外的脚本,只需要作为 Maven 的插件添加到 Maven 项目中即可。JGit-Flow 同时可以替代 Maven release 插件 来进行发布管理。JGit-Flow 会负责正确的设置不同分支中的 Maven 项目的 POM 文件中的版本,这对于 Maven 项目的构建和发布是很重要的。

在 Maven 项目的 pom.xml 文件中添加中的插件声明就可以使用 JGit-Flow。<configuration>中包含的是 JGit-Flow 不同任务的配置。

清单 1. JGit-Flow 的 Maven 设置

<build><plugins><plugin><groupId>external.atlassian.jgitflow</groupId><artifactId>jgitflow-maven-plugin</artifactId><version>1.0-m5.1</version><configuration><flowInitContext><versionTagPrefix>release-</versionTagPrefix></flowInitContext><releaseBranchVersionSuffix>RC</releaseBranchVersionSuffix><noDeploy>true</noDeploy><allowSnapshots>true</allowSnapshots><allowUntracked>true</allowUntracked></configuration></plugin></plugins>
</build>

JGit-Flow 提供了很多配置选项,可以在 POM 文件中声明。这些配置项可以对不同的任务生效。常用的配置项如所示。

表 2. JGit-Flow 的配置项

名称 描述 适用任务
flowInitContext 配置不同类型的分支的名称 全局
allowSnapshots 是否允许存在 SNAPSHOT 类型的依赖  
allowUntracked 是否允许本地 Git 中存在未提交的内容  
scmCommentPrefix 和 scmCommentSuffix JGit-Flow 会进行代码合并工作。通过这两个配置项来设置 JGit-Flow 进行代码提交时的消息的前缀和后缀 全局
username 和 password 进行 Git 认证时的用户名和密码,适用于 HTTPS 仓库 全局
releaseBranchVersionSuffix release 分支中项目的 POM 文件版本号的后缀  
developmentVersion 下一个开发版本的版本号  
releaseVersion 发布版本的版本号  
pushReleases 是否把 release 分支 push 到远程仓库  
goals 当部署发布版本到 Maven 仓库时执行的目标 release-finish,hotfix-finish
keepBranch 当发布完成之后是否保留相应的分支 release-finish,hotfix-finish
noDeploy 是否启用部署到 Maven 仓库的功能 release-finish,hotfix-finish
noReleaseBuild 在完成发布时是否禁用 Maven 构建 release-finish
noReleaseMerge 在完成发布时是否把 release 分支合并回 develop 和 master 分支 release-finish
noTag 在完成发布时是否添加标签 release-finish,hotfix-finish
squash 在进行分支合并时,是否把多个 commit 合并成一个 release-finish,hotfix-finish
featureName 新特性分支的名称 feature-start,feature-finish,feature-deploy
pushFeatures 是否把特性分支 push 到远程仓库 feature-start,feature-finish
noFeatureBuild 在完成特性时是否禁用 Maven 构建 feature-finish
noFeatureMerge 在完成特性时是否把特性分支合并回 develop feature-finish
pushHotfixes 在完成 hotfix 时是否把分支合并回 master hotfix-finish
noHotfixBuild 在完成 hotfix 时是否禁用 Maven 构建 hotfix-finish

其余的配置项可以参考插件不同任务的 文档 。

在启用了 JGit-Flow 之后,可以通过 mvn 运行 jgitflow:feature-start 和 jgitflow:feature-finish 来开始和结束新特性的开发。与版本发布和 hotfix 相关的命令分别是 jgitflow:release-start 和 jgitflow:release-finish 以及 jgitflow:hotfix-start 和 jgitflow:hotfix-finish。在运行命令之后,JGit-Flow 会完成相关的 Git 分支创建、合并、删除、添加 tag 等操作,不需要开发人员手动完成。

每个分支的 pom.xml 中的版本号的格式并不相同。如 master 分支的版本号是标准的发布版本号,如 1.2.3;develop 分支中则是 SNAPSHOT 版本,比 master 分支的版本号要高,如 1.2.4-SNAPSHOT;release 分支可以通过<releaseBranchVersionSuffix>配置来指定版本号的后缀,如 1.2.3-RC-SNAPSHOT;feature 分支可以通过<enableFeatureVersions>配置来把 feature 分支名称作为后缀添加到版本号中,如 1.2.3-my-awesome-feature-SNAPSHOT;hotfix 分支的版本号基于 master 分支的版本号,如 1.2.3.1 是对于 1.2.3 版本的第一个 hotfix。当使用 jgitflow:release-finish 完成一个 release 分支时,develop 分支的版本号会被自动更新成下一个小版本,如从 1.2.3 到 1.2.4。当需要手动修改版本号时,可以使用 Versions 插件 ,如 mvn versions:set -DnewVersion=2.0.0-SNAPSHOT。

持续集成

由于 JGit-Flow 是纯 Java 的 Maven 插件实现,可以很容易的与常用的持续集成服务器进行集成。不过在与 Atlassian 的 Bamboo 集成时,有几个细节需要注意。首先是 Bamboo 在进行构建的时候,使用的是一个虚拟的 Git 仓库,其仓库地址是一个不存在的文件系统路径。因此需要在 JGit-Flow 的配置中手动设置 Git 仓库的地址,保证 Git 操作可以正确执行,如所示。

清单 2. 手动设置 JGit-Flow 的 Git 仓库地址

<configuration><defaultOriginUrl>[Git url]</defaultOriginUrl><alwaysUpdateOrigin>true</alwaysUpdateOrigin>
</configuration>

另外在开始新的 release 之前,需要确保前一个发布分支已经被删除。JGit-Flow 在默认情况下会自动在发布完成之后,删除对应的 Git 分支。但是可能本地仓库中还保留有之前的发布分支,这会导致新的 release-start 任务执行失败。一种解决方式是每次都重新 checkout 新的仓库,这样可以保证不会出现已经在远程被删除的分支。不过可能会增加构建的时间。另外一种解决方式是通过 Git 命令来删除本地分支,如所示。

清单 3. 删除 Git 本地分支

${bamboo.capability.system.git.executable} fetch --prune --verbose${bamboo.capability.system.git.executable} branch -vv | awk '/: gone]/{print $1}' | xargs ${bamboo.capability.system.git.executable} branch -d 2> /dev/nullecho 'stale branches deleted'Git 分支合并冲突处理

当把发布分支合并到 develop 时,可能会出现冲突。因为在发布分支中有与 bug fix 相关的改动,在 develop 分支中有可能修改相同的文件。当有冲突时,直接运行 JGit-Flow 的 release-finish 任务会出错。这个时候需要开发人员手动把发布分支合并到 develop 分支,并解决相应的冲突。然后再次运行 release-finish 任务即可。

选择合适的实践

每个开发团队都应该根据团队自身和项目的特点来选择最适合的分支实践。首先是项目的版本发布周期。如果发布周期较长,则 git-flow 是最好的选择。git-flow 可以很好地解决新功能开发、版本发布、生产系统维护等问题;如果发布周期较短,则 TBD 和 GitHub flow 都是不错的选择。GitHub flow 的特色在于集成了 pull request 和代码审查。如果项目已经使用 GitHub,则 GitHub flow 是最佳的选择。GitHub flow 和 TBD 对持续集成和自动化测试等基础设施有比较高的要求。如果相关的基础设施不完善,则不建议使用。

小结

Git 作为目前最流行的源代码管理工具,已经被很多开发人员所熟悉和使用。在基于 Git 的团队开发中,Git 分支的作用非常重要,可以让团队的不同成员同时在多个相对独立的特性上工作。本文对目前流行的 3 种 Git 分支管理实践做了介绍,并着重介绍了 git-flow 以及与之相关的 Maven JGit-Flow 插件。


原文:http://www.ibm.com/developerworks/cn/java/j-lo-git-mange/index.html?ca=drs-

关于gitflow的实践可参考:http://www.cnblogs.com/cnblogsfans/p/5075073.html


http://chatgpt.dhexx.cn/article/MMYoyo4f.shtml

相关文章

Git分支管理办法,每个团队不一样,仅供参考!

原创不易&#xff0c;转载注明出处&#xff0c;喜欢就点个赞吧&#xff01; 网上有很多文章&#xff0c;很少有实际具体的流程图说明&#xff0c;我根据我们团队的情况&#xff0c;画了几张简图&#xff0c;仅供参考。 每个公司的代码管理方式都不一样 主要有两种 1.TrunkB…

Git分支管理与常用命令

一、分支管理 Git在创建分支仅是生成了一个指针又称快照&#xff08;有的工具则进行了物理拷贝&#xff09;&#xff0c;这样在使用起来就非常的方便。方便的同时问题随之而来&#xff0c;如果不加管理&#xff0c;那么就会到处开枝散叶&#xff0c;完全看不出主干。因此&…

复杂项目的版本管理及git分支管理建议

在复杂项目中&#xff0c;特别是多团队的快速迭代中&#xff0c;版本管理与分支管理&#xff0c;总是我们难以回避的问题&#xff0c;这里分享一下我们在团队中使用的规范&#xff0c;以及对应的每一步的步骤。 为什么需要GIT使用建议 团队开发中&#xff0c;遵循一个合理、清…

2022新版Git教程 从入门到实战(三)Git分支管理

&#x1f41f; 个人主页 &#xff1a;https://blog.csdn.net/qq_52007481⭐个人社区&#xff1a;【小鱼干爱编程】&#x1f4f0;最近专栏&#xff1a;Git教程专栏 文章目录 分支工作的工作流程Git分支管理分支的好处 前期准备查看分支分支创建分支转换在新分支中添加记录切换回…

Git 分支管理最佳实践(转载)

前言 Git 是目前最流行的源代码管理工具。大量的软件项目由 GitHub、Bitbucket 和 GitLab 这样的云服务平台或是私有的 Git 仓库来管理。在使用 Git 时通常会遇到的一个问题是采用何种分支管理实践&#xff0c;即如何管理仓库中作用不同的各类分支。和软件开发中的其他实践一样…

Git 分支管理策略汇总

原文链接&#xff1a; Git 分支管理策略 最近&#xff0c;团队新入职了一些小伙伴&#xff0c;在开发过程中&#xff0c;他们问我 Git 分支是如何管理的&#xff0c;以及应该怎么提交代码&#xff1f; 我大概说了一些规则&#xff0c;但仔细想来&#xff0c;好像也并没有形成…

Git分支管理

四、分支管理 分支的存在&#xff0c;极大的强化了不同开发者的协作管理&#xff0c;在一个功能的开发过程中&#xff0c;可以在一个单独的分支上完成&#xff0c;这样不影响主分支的开发&#xff0c;待功能完成后再将分支的内容合并到主分支。 每次提交到分支&#xff0c;Gi…

git的分支管理

这篇文章主要想讲一下git下的分支管理&#xff0c;因为分支管理是你在日常工作中必不可少的一项操作&#xff0c;觉得自己之前了解的不是很多&#xff0c;这次便决定利用一些细碎的时间好好去再次学习巩固一下&#xff0c;初衷也是为了加深自己的理解&#xff0c;便写下此文&am…

【Git】“分支” 如何管理和使用?这一篇就够了~

目录 一、什么是分支&#xff1f; 二、分支的操作 2.1、查看分支 2.2、创建分支 2.3、切换分支 和 修改分支 2.4、合并分支 2.4.1、正常合并 2.4.2、合并冲突 三、创建分支和切换分支的底层原理 一、什么是分支&#xff1f; 在版本控制中&#xff0c;我们可以针对每个任…

管理Git的分支

目录 一、本地分支&#xff08;local branches&#xff09;管理 1.1 查看和建立分支&#xff08; git branch&#xff09; 1.2 分支中提交的浏览与比较&#xff08;git log&#xff09; 1.3 切换当前分支&#xff08;git switch&#xff09;与合并分支&#xff08;git mer…

常用的git分支管理方法都在这了

一、分支管理定义 几乎每一种版本控制系统都以某种形式支持分支&#xff0c;一个分支代表一条独立的开发线&#xff0c;使用分支意味着你可以从开发主线上分离开来&#xff0c;然后在不影响主线的同时继续工作&#xff0c;Git 分支实际上是指向更改快照的指针。 其作用显然…

前端安全之xss与xsrf

提到前端安全&#xff0c;往往离不开xss(跨站脚本攻击)、xsrf(跨站伪造请求)&#xff0c;在此记录一下关于前端安全的学习过程。 什么是xss&#xff1f; 跨站脚本攻击(Cross Site Scripting)&#xff0c;为了不和css(层叠样式表)混淆&#xff0c;故记为xss。其原理是利用用户…

前端安全问题及防范

目录 XSS攻击反射型存储型DOM型总结 CSRF攻击点击劫持CDN带来的风险文件上传漏洞本地存储信息泄露 XSS攻击 XSS(Cross-Site Scripting,跨站脚本)&#xff0c;是比较常见的安全漏洞问题&#xff0c;其主要的攻击方式是通过表单或者页面url参数来注入一些可执行的代码&#xff0…

前端安全之csp

最近前端项目被白帽子使用appscan扫到安全漏洞,老大勒令我们抓紧修复,我们先来看两个级别比较低的漏洞 看到这儿对于我个渣渣前端来说是懵逼的,难道我设置一下http header 就ok了 简单来介绍下什么叫做csp内容安全策略 (CSP) 是一个额外的安全层,用于检测并削弱某些特定类型…

Web前端安全系列之:XSS攻防及Vue防御(万字长文)

关注公众号 笑果杂谈 前言 Web 安全的兴起 Web 攻击技术的发展也可以分为几个阶段。在 Web 1.0 时代&#xff0c;人们更多的是关注服务器端 动态脚本的安全问题&#xff0c;比如将一个可执行脚本&#xff08;俗称 webshell&#xff09;上传到服务器上&#xff0c;从而获得权…

前端安全:CSRF、XSS该怎么防御?

近几年随着业务的不断发展&#xff0c;前端随之面临很多安全挑战。我们在日常开发中也需要不断预防和修复安全漏洞。接下来&#xff0c;梳理一些场景的前端安全问题和对应的解决方案。 XSS攻击介绍 XSS是后端的责任&#xff0c;后端应该在用户提交数据的接口对隐私敏感的数据…

如何解决Web前端安全问题?

我国网络技术水平的提升&#xff0c;带动着WEB前端业务量的显著增长&#xff0c;人们对于网络服务的需求也日益复杂&#xff0c;与此同时&#xff0c;越来越多的黑客出现&#xff0c;其攻击水平也有了明显提升&#xff0c;WEB前端也成为了众多黑客进行网络攻击的主要目标。 因…

前端安全问题的解决方法

目录 前言&#xff1a; 1.常见的安全性问题 2.XSS攻击的解释和解决方法 2.1 XSS攻击是什么&#xff1a; 2.2 经常出现的原因&#xff1a;用户输入&#xff0c;如input框 2.3 防御方式&#xff1a; 3.CSRF&#xff08;跨站请求伪造&#xff09;的解释和解决方法 3.1 是什么…

前端常见的安全问题

一、XSS &#xff08;Cross-Site Scripting&#xff09;跨站脚本攻击 通常指通过“HTML注入”篡改了网页&#xff0c;插入了恶意的脚本&#xff0c;从而在用户浏览网页时&#xff0c;获取用户信息、控制用户浏览器等的一种攻击 分类&#xff1a;持久性&#xff08;存储型xss&…

前端常见安全性问题

文章目录 一、常见的安全性问题二、XXS攻击&#xff08;Cross Site Scripting&#xff09;&#xff08;跨站脚本攻击&#xff09;三、CSRF安全漏洞&#xff08;跨站请求伪造&#xff09;四、文件上传漏洞五、限制URL访问&#xff0c;越权访问六、不安全的加密存储七、SQL注入攻…