`
阅读更多

GIT introduce:

From

http://blog.leezhong.com/translate/2010/10/30/a-successful-git-branch.html

 

 

Git开发管理之道

2010-10-30

Git的强大是众所周知的,本文要分享的是关于"使用Git的分支和合并功能来进行版本管理的开发模型"。以下是译文,原文地址

这篇文章我想介绍一下一年前就提到过的我所有项目(工作/私有)都在使用的开发模式,经过事实验证,确实非常可行。很早就想写了,一直没腾出时间。我不会涉及项目的细节,只是谈谈分支的使用策略和发布管理。

上图是使用Git这个版本控制工具来管理所有源码的。

为什么使用Git

如果要看详细的Git与集中式源码管理工具的优势与劣势,可以参见这篇文章 ,那里有很多口水仗。作为一个开发人员,所有的源码管理工具中,我最喜欢Git。Git从根本上改变了开发人员对分支和合并的使用,传统的CVS/SVN,分支和合并都是高级话题,而且使用起来稍显麻烦,隔一段时间才会用一次。但是有了Git,这些操作就成了家常便饭。

由于使用简单,方便重复操作,分支和合并不再是让人望而生畏的操作,版本管理工具应该尽可能地对分支/合并提供最好的支持。

工具谈得差不多了,回到开发上。我待会要讲到的模型其实是一些每个开发人员都应该遵守的步骤,如果想管理好软件的开发流程的话。

分布式但集中化

我们要使用的仓库是一个"中心库",当然这个中心库只是被认为是这样(因为Git是分布式的,从技术层面上来说是没有中心库的),我们将把这个仓库叫做"origin",因为Git用户都熟悉这个名字。

每个开发者pull和push到origin,但除了中心化的push-pull关系外,每个开发者还可以从其他开发者那pull changes。比如说,对于一个比较大的新特性,在把代码提交到origin之前,很可能会安排2个或多个开发者。上图中有几个小团队:Alice和 Bob,Alice和David,Clair和David。

从技术角度来说,其实就是Alice定义了一个叫Bob的Git remote,指向到Bob的仓库。

main分支

中心仓库有两个分支:

  • master
  • develop

origin上的master分支,Git用户应该很熟悉,跟master并行的有一个develop分支

我们把origin/master作为主要分支,源码的HEAD总是表示production-ready(可随时部署)状态。而origin/develop上的代码是为下一次的代码发布准备的。每日构建也是基于此分支。

当develop分支达到了一个稳定状态并准备发布时,所有的改变都要合并到master分支,并标上版本号。如何实现的下面细说。

这样每次与master合并都会有新的部署发布。这点可以自动化,如使用Git hook脚本来实现自动部署代码到线上。

支持(supporting)分支

我们的开发模型使用了一些支持分支放在master和develop分支的旁边,方便开发小组之间的并行开发。不像main分支,这些分支是有时间限制的,因为他们最终都会被移除。

我们会使用到的不同的分支

  • Feature branches
  • Release branches
  • Hotfix branches

每个分支都有各自的作用,并且有严格的规定,如:只能从哪个分支上去新开分支,只能合并到那个分支。这个待会细说。

Feature branches

继承分支: develop
合并分支:develop
命名规范:除了master,develop,release-,hotfix-

Feature branches是用来开发新特性的(短期,远期都可以)。当开始开发新特性时,很可能不知道这个特性会出现在哪个目标版本。一旦开发完成就可以合并到develop,当然如果开发失败,就可以抛弃。

创建一个 Feature branch

当要创建一个新特性时,从develop分支上再进行分支

$

 git checkout -b myfeature develop
Switched to a new branch "myfeature"




新特性完成时,可以合并到develop

$

 git checkout develop
Switched to branch 'develop'


$

 git merge --no-ff myfeature
Updating ea1b82a..05e9557


(Summary of changes)


$

 git branch -d myfeature
Deleted branch myfeature (was 05e9557).


$

 git push origin develop


—no-ff (译者注:no fast foward)标签,使得每一次的合并都创建一个新的commit记录。即使这个commit只是fast-foward,这样可以避免丢失信息

不幸的是,我没有找到让—no-ff成为commit默认参数的方法(译者注:修改.consolerc?),但确实应该提供一个方法。

Release branch

继承分支: develop
合并分支:develop 和 master
命名规范:release-*

Release branch 是为新的production release准备的(译者注:相当于RC版),可以有一些小的bug,并为发布准备一些元数据(版本号,构建日期等等)。把所有的这些工作都放到 Release branch,develop branch就能更清晰地知道下一个版本要开发哪些特性。

从develop分支合并到release分支的关键因素是:develop分支达到了release分支所要求的状态。至少所有针对该release的特性要被合并。至于那些将来会有的特性可以先放一放。然后就是为接下来即将要发布的版本分配一个版本号。

创建一个Release branch

Release branch是通过develop分支而创建。举个例子,假如1.1.5是当前的production release,然后会有一个比较大的版本发布。develop的状态已经可以发布版本了,经过商榷后,决定发布为1.2版本(而不是1.1.6或 2.0),所以我们创建一个release分支,并给这个分支一个新的版本号

$

 git checkout -b release-1.2 develop
Switched to a new branch "release-1.2"


$

 ./bump-version.sh 1.2
Files modified successfully, version bumped to 1.2.


$

 git commit -a -m "Bumped version number to 1.2"


[release-1.2 74d9424] Bumped version number to 1.2


1 files changed, 1 insertions(+), 1 deletions(-)




这个新分支可能会存在一定的时间,直到可以被合并到production branch。这段时间内,bug修补可以在这个分支上进行(而不是develop分支)。添加新特性(尤其比较大的)是不允许的。最后还是要被合并到 develop,然后继续在develop分支上开发,直到下一个版本。

完成一个release branch

当release branch已经准备就绪,需要做几件事。首先,release分支被合并到master分支上(每一个提交到master上的commit都是一个新版 本,切记)。然后master上的commit都要添加tag,方便将来查看和回滚。最后release上所做的修改必须合并到develop分支上,保 证bug已被修补。

前两个步骤:

$

 git checkout master
Switched to branch 'master'


$

 git merge --no-ff release-1.2
Merge made by recursive.


(Summary of changes)


$

 git tag -a 1.2


为了把release上的改变保存到develop,我们需要合并到develop

$

 git checkout develop
Switched to branch 'develop'


$

 git merge --no-ff release-1.2
Merge made by recursive.


(Summary of changes)




这个步骤可能会导致冲突,如果这样的话,解决冲突,然后再提交。

现在一切都完成了,可以把release branch干掉了。

$

 git branch -d release-1.2
Deleted branch release-1.2 (was ff452fe).




Hotfix branch

继承分支: master
合并分支:develop 和 master
命名规范:hotfix-*

Hotfix branch和Release branch有几分相似,都是为了新的production release而准备的。比如运行过程中发现了bug,就必须快速解决,这时就可以创建一个Hotfix branch,解决完后合并到master分支上。好处是开发人员可以继续工作,有专人来负责搞定这个bug。

创建Hotfix branch

Hotfix是从master分支上创建的。假如当前运行版本是1.2,然后发现有bug,但是develop还在开发中,不太稳定,这时就可以新开一个Hotfix branch,然后开始解决问题。

$

 git checkout -b hotfix-1.2.1 master
Switched to a new branch "hotfix-1.2.1"


$

 ./bump-version.sh 1.2.1
Files modified successfully, version bumped to 1.2.1.


$

 git commit -a -m "Bumped version number to 1.2.1"


[hotfix-1.2.1 41e61bb] Bumped version number to 1.2.1


1 files changed, 1 insertions(+), 1 deletions(-)




解决问题,一次或几次commit

$

 git commit -m "Fixed severe production problem"


[hotfix-1.2.1 abbe5d6] Fixed severe production problem


5 files changed, 32 insertions(+), 17 deletions(-)




完成Hotfix branch

当结束时,bugfix要被合并到master,同时也要合并到develop,保证下个版本发布时该bug已被修复。这跟release branch完成时一样。

首先更新master和tag release

$

 git checkout master
Switched to branch 'master'


$

 git merge --no-ff hotfix-1.2.1
Merge made by recursive.


(Summary of changes)


$

 git tag -a 1.2.1


接下来与develop合并

$

 git checkout develop
Switched to branch 'develop'


$

 git merge --no-ff hotfix-1.2.1
Merge made by recursive.


(Summary of changes)




有一个例外,就是当一个release branch存在时,bugfix要被合并到release而不是develop,因为release最终会被合并到develop。

最后移除branch

$

 git branch -d hotfix-1.2.1
Deleted branch hotfix-1.2.1 (was abbe5d6).




总结

这个开发模型其实没有什么新颖的,一开始提到的"大图"确实在我们的项目起到了非常大的作用。这是很优雅的一个模型,很容易实现,也容易在团队成员之间达成一致。

PS:需要这个模型大图的,可以去原文地址 下载

--EOF--

若无特别说明,本站文章均为原创,转载请保留链接,谢谢

分享到:
评论

相关推荐

    linux系统安装git及git常用命令

    1 安装GIT 代码如下:$ sudo aptitude install git$ sudo aptitude install git-doc git-svn git-email git-gui gitk git软件包包含了大部分Git命令,是必装的软件包,第二行命令也是Git软件包,但是是单独发布的,...

    git压缩包下载git下载

    Git是世界上最流行的分布式版本控制系统,它允许开发人员协作开发代码并跟踪每一次更改。"git压缩包下载git下载"这个标题和描述可能指的是提供Git的安装程序压缩包的下载服务。在本篇中,我们将深入探讨Git的核心...

    GIT 压缩包 适用于压缩包式安装git

    接下来,你可以学习基本的Git命令,如`git clone`(克隆远程仓库)、`git add`(暂存更改)、`git commit`(提交更改)、`git push`(推送本地更改至远程仓库)和`git pull`(拉取远程仓库的更新)等。 总的来说,...

    git安装包git-2.34.0-64-bit.rar

    4. **命令行基础**:Git主要是通过命令行工具使用的,掌握常用的命令如`git clone`、`git add`、`git commit`、`git push`、`git pull`等是必不可少的。 5. **分支管理**:Git的分支机制强大且灵活,允许快速创建和...

    Git-2.37.3-64-bit_3Git-2.37.3-64-bit_3Git-2.37.3-64-bit_3Git-2.3

    对于团队项目,可以使用`git clone`下载远程仓库,`git pull`同步远程更新,`git push`推送本地更改,以及`git fetch`和`git merge`或`git rebase`来整合远程分支。 总之,Git-2.37.3-64-bit_3.exe是Git的64位...

    windows64位git安装包

    Git是分布式版本控制系统,它在软件开发领域尤其是开源项目中起着至关重要的作用。Windows 64位Git安装包是专门为64位Windows操作系统设计的Git版本,确保在该平台上高效稳定地运行。官方下载的Git安装包可以保证其...

    Keil配置Git教程

    标题“Keil配置Git教程”指明了本文主要讨论的内容是关于如何在Keil开发环境中配置Git以进行软件项目的版本控制管理。Keil是一款常用于嵌入式系统开发的集成开发环境(IDE),而Git则是一种流行的分布式版本控制系统,...

    学习git和gitbash使用的一些详细操作

    Git是一个分布式版本控制系统,它最初由Linus Torvalds在2005年创建用于管理Linux内核的开发。Git的目的是快速高效地处理从小型到大型项目的所有事务。Git不仅是一个版本控制工具,它更是一个内容管理系统或文件系统...

    Git for Windows 2017 最新版,Git-2.15.0

    Git for Windows 2017 最新版,Git-2.15.0 是Git的Windows适配版本,它为Windows用户提供了完整的Git功能,并且优化了在Windows环境下的使用体验。Git是一个分布式版本控制系统,由Linux之父Linus Torvalds开发,...

    git客户端离线安装包

    常见的命令包括`git init`用于初始化新的Git仓库,`git clone`用于复制远程仓库到本地,`git add`用于将文件添加到暂存区,`git commit`用于提交更改,`git push`用于将本地更改推送到远程仓库,以及`git pull`用于...

    GitBash和GitGui右键失效解决方法

    6.选中 Git GUI Here 右键新建(项),并重命名为command,command的值设置为 D:\Program Files\Git\cmd\git-gui.exe --working-dir %v,其中--working-dir和git-gui.exe之间有空格,--working-dir和%v之间也有空格 ...

    最新Git与Github首篇巨作课程 Git&Github极速入门与攻坚实战结合课程 一次搞定Git.txt

    Git与Github教程详细介绍了Git的工作机制,Git命令行的基础学习,Git-Eclipse和Nginx的准备工作,Git与Github分支体系,Git与Github的远程和本地工作原理,Git与Github克隆实战和最后的课程精华总结部分,可以帮助...

    Git离线rpm安装包

    Git是世界上最流行的分布式版本控制系统,它允许开发者跟踪和管理代码变更,协同开发项目。在某些没有网络连接或者网络环境受限的场景下,离线安装Git变得尤为重要。本篇将详细介绍如何使用提供的Git离线rpm安装包在...

    完全学会GIT+GITHUB+GIT+SERVER的24堂课

    Git的基本操作包括初始化仓库(`git init`)、克隆仓库(`git clone`)、添加文件到暂存区(`git add`)、提交更改(`git commit`)、查看历史(`git log`)以及分支管理(`git branch`和`git merge`)等。...

    Git使用手册.pdf

    Git是世界上最流行的分布式版本控制系统,它允许开发者跟踪和管理代码变更。Git的使用涉及多个步骤,从安装到日常操作,每个环节都有其特定的命令和流程。 首先,安装Git非常简单,可以从Git官方网站...

    Gitblit搭建及Git协作开发流程参考

    Gitblit搭建及Git协作开发流程参考 本文档主要介绍了Gitblit的搭建和Git协作开发流程,旨在帮助创业团队和小型开发团队快速搭建自己的代码服务器。同时,文档也提供了基本的开发流程,代码提交、代码上传、代码...

    git创建服务器端

    Git是世界上最流行的分布式版本控制系统,它允许开发者跟踪和管理代码变更,从而实现高效的协作和版本控制。本教程将深入讲解如何在自己的计算机上创建一个Git服务器端,建立远程代码仓库,以便团队成员可以进行协作...

    Git(Git-2.36.1-64-bit.exe)

    Git是世界上最流行的分布式版本控制系统,它由Linus Torvalds为Linux内核开发而创建,如今已被广泛应用于各种软件开发项目。Git-2.36.1-64-bit.exe是Git的最新稳定版本,专为Windows x86-64架构设计。这个安装程序将...

    git客户端、服务端安装、代码上传和eclipse安装git插件

    git 客户端、服务端安装、代码上传和 Eclipse 安装 Git 插件 git 客户端安装是在使用 Git 版本控制系统的第一步。安装客户端可以从官方网站下载安装包,或者使用包管理器进行安装。例如,在 Windows 平台上,可以...

    Git-2.32.0-64-bit

    3. **Git命令**:Git有许多命令,如`git init`用于初始化新的Git仓库,`git clone`用于复制远程仓库,`git add`用于将更改添加到暂存区,`git commit`用于保存更改,`git push`用于将本地更改推送到远程仓库,`git ...

Global site tag (gtag.js) - Google Analytics