Git工作流可以理解为团队成员遵守的一种代码管理方案,在Git中有以下几种常见工作流:

  • 集中式工作流
  • 功能开发工作流
  • Gitflow工作流
  • Forking工作流

1)集中式工作流

这种工作方式跟svn类似,它只有一个master分支,开发者会先把远程的仓库克隆到本地,之后的修改和提交都在本地操作,直到在某个合适的时间点将本地的代码合入到远程master。这种工作流比较适合小团队,因为小团队可能不会太多的协作和合流的动作。

在开发者提交自己的修改到master前,需要先fetch在master的新增提交,rebase自己的提交于master的最新版本。
这样做的意思是在说,『我要把自己的修改加到别人已经完成的修改之上』。如果本地修改和上游提交有冲突,Git会暂停rebase过程,给你手动解决冲突的机会.

示例:

第一步,有人在服务器上创建好中央仓库。如果是新项目,你可以初始化一个空仓库;否则你要导入已有的Git或SVN仓库。
中央仓库应该是个裸仓库(bare repository),即没有工作目录(working directory)的仓库。可以用下面的命令创建:
ssh user@host
git init --bare /path/to/repo.git
确保写上有效的user(SSH的用户名),host(服务器的域名或IP地址),/path/to/repo.git(你想存放仓库的位置)。
注意,为了表示是一个裸仓库,按照约定加上.git扩展名到仓库名上。

第二步,所有人克隆中央仓库。

各个开发者创建整个项目的本地拷贝。通过git clone命令完成:

git clone ssh://user@host/path/to/repo.git

基于你后续会持续和克隆的仓库做交互的假设,克隆仓库时Git自动添加远程别名origin(『父』仓库)。

然后,成员A开发功能,并在本地使用标准的Git过程开发功能:编辑、暂存(Stage)和提交:

git status # 查看本地仓库的修改状态
git add # 暂存文件
git commit # 提交文件-(这些命令生成的是本地提交,以按自己需求反复操作多次,而不用担心中央仓库上有了什么操作。)

一旦成员A完成了他的功能开发,会发布他的本地提交到中央仓库中,这样其它团队成员可以看到他的修改。他可以用下面的git push命令:
git push origin master
(注意,origin是在其克隆仓库时Git创建的远程中央仓库别名,master参数告诉Git推送的分支。)

由于中央仓库自从成员A克隆以来还没有被任何人更新过,所以push操作不会有冲突,成功完成。

然后,成员B完成在本地的功能开发,并欲推送到中央仓库里面。由于,中央仓库已经被成员A进行了修改,如果B直接运行git push origin master,GIt会提示错误,拒绝其提交,以防止B的提交将A已经提交的新代码覆盖。成员B需要先git pull 合并上游的修改到自己本地仓库中(类似svn update)。具体指令:

git pull --rebase origin master

rebase说明:点击打开链接

--rebase 选项告诉Git把B的提交移到同步了中央仓库修改后的master分支的顶部。不使用rebase这个选项,在Pull之前需要先将远程master分支的最新内容同步到本地,然后将自己的修改加进去,再Pull,这样会导致提交历史会以一个多余的『合并提交』结尾。

对于集中式工作流,最好是使用rebase而不是生成一个合并提交。

2)功能开发工作流

这种工作流关注功能开发,不直接往master提交代码保证它是稳定并且干净的,而是从master拉取feature分支进行功能开发,团队成员根据分工拉取不同的功能分支来进行不同的功能开发,这样就可以完全隔离开每个人的工作。当功能开发完成后,会向master分支发起Pull Request,只有审核通过的代码才真正允许合入master,这样就加强了团队成员之间的代码交流,也就是我们常说的Code Review。

开发者每次在开始新功能前先创建一个新分支(这个创建的新分支只在开发者本地吗,还是远程也有?--都有), 功能分支应该有个有描述性的名字,这样可以让分支有个清楚且高聚焦的用途。   一旦某个开发完成一个功能,不是立即合并到master,而是push到中央仓库的功能分支上 并 发起一个Pull Request请求去合并修改到master。 

pull requests能为每个分支发起一个讨论,在分支合入正式项目之前,给其它开发者有表示赞同的机会。另外,如果你在功能开发中有问题卡住了,可以开一个pull requests来向同学们征求建议。pull requests让团队成员之间互相评论工作变成非常方便!

在master分支和功能分支之间,Git是没有技术上的区别,所以开发者可以用和集中式工作流中完全一样的方式编辑、暂存和提交修改到功能分支上。

一旦Pull Request被接受了,发布功能要做的就和集中式工作流就很像了,首先,确定本地的master分支和上游的master分支是同步的。然后合并功能分支到本地master分支 并 push已经更新的本地master分支到中央仓库。

应用例子介绍:

下面的示例演示了如何把Pull Requests作为Code Review的方式,但注意Pull Requests可以用于很多其它的目的。
小红开始开发一个新功能, 在开始开发功能前,小红需要一个独立的分支。使用下面的命令新建一个分支:

git checkout -b marys-feature master

这个命令检出一个基于master名为marys-feature的分支,Git的-b选项表示如果分支还不存在则新建分支。这个新分支上,小红按老套路编辑、暂存和提交修改,按需要提交以实现功能:

git status
git add <some-file>

git commit

然后,小红去吃午饭前,先push 一次,这样可以方便地备份,如果和其它开发协作,也让他们可以看到小红的提交。

git push -u origin marys-feature

这条命令push marys-feature分支到中央仓库(origin)的marys-feature分支,-u选项设置本地分支去跟踪远程的哪一个分支,设置好跟踪的分支后,后面小红就可以使用git push命令, 省去指定推送分支的参数。

小红吃完午饭回来,完成整个功能的开发,并合并到远程分支。然后,在她的Git GUI客户端中发起Pull Request,请求合并marys-feature到master,团队成员会自动收到通知(GUI客户端??????)。

Pull Request很酷的是可以在相关的提交旁边显示评注,所以你可以很对某个变更集提问。

..............going..............

3)Gitflow工作流

该种工作流会相对复杂一点,但非常适合用来管理大型项目的发布和维护。贯穿整个开发周期,master和develop分支是一直存在的。

master分支可以被视为稳定的分支,一般不允许直接往master分支提交代码,只允许往这个分支发起merge request,只允许release分支和hotfix分支进行合流。

develop分支是相对稳定的分支,用于日常开发,包括代码优化、功能性开发。

feature分支从develop分支拉取,特性开发会在其上进行,开发完毕合后并到develop分支。

release分支从develop分支拉取,用于回归测试,完成后打tag并合入master和develop。
hotfix分支用于紧急修复上线版本的问题,修复后打tag并合入master和develop。

4)Forking工作流

Forking工作流常用于开源项目,它有一个公开的中央仓库,其他贡献者可以Fork(克隆)这个仓库作为你自己的私有仓库,开源项目维护者可以直接往中央仓库push代码,而代码贡献者只能将代码push到自己的私有仓库,只有项目维护者接受代码贡献者往中央仓库发起的pull request才会真正合入。

Reference:

https://blog.csdn.net/wwj_748/article/details/55226044

Git的各种工作流的更多相关文章

  1. Git版本控制与工作流详解

    这篇文章是针对git版本控制和工作流的总结,如果有些朋友之前还没使用过git,对git的基本概念和命令不是很熟悉,可以从以下基本教程入手: 专为设计师而写的GitHub快速入门教程 git – 简明指 ...

  2. 好代码是管出来的——Git的分支工作流与Pull Request

    上一篇文章介绍了常用的版本控制工具以及git的基本用法,从基本用法来看git与其它的版本控制工具好像区别不大,都是对代码新增.提交进行管理,可以查看提交历史.代码差异等功能.但实际上git有一个重量级 ...

  3. Git - Pull Request工作流

    Pull Requests是Bitbucket上方便开发者之间协作的功能.提供了一个用户友好的Web界面,在集成提交的变更到正式项目前可以对变更进行讨论. 开发者向团队成员通知功能开发已经完成,Pul ...

  4. Git版本控制与工作流

    基本概念 Git是什么? Git是分布式版本控制系统,与SVN类似的集中化版本控制系统相比,集中化版本控制系统虽然能够令多个团队成员一起协作开发,但有时如果中央服务器宕机的话,谁也无法在宕机期间提交更 ...

  5. git学习(4)---工作流

    一.目的 前三章介绍了git工具本身的操作,主要包含本地仓库操作和远程库操作两部分内容.接下来,我们将介绍怎样使用git进行项目开发,也叫做git工作流. git工作流分为三种模式:共享远程库模式.独 ...

  6. Git之GitFlow工作流

    一. GitFlow 介绍 1.1 什么是 GitFlow GitFlow 是一种 Git 工作流,它是团队成员遵守的一种代码管理方案 . 1.2 GitFlow 常用分支说明 分支名称 分支说明 P ...

  7. 版本管理工具Git三种工作流

    Git是分布式版本管理控制的工具.学习Git一般都是先去学习Git的命令. 但是学习完Git的基本命令之后还是不知道怎样使用Git.首先,我们要清楚的 一点是Git的使用方法其实有很多种,也就是说Gi ...

  8. git工具SourceTree工作流

    分支模型 master 用来最终上线的分支,最终发布版本,整个项目中有且只有一个 develop 项目中用来开发的分支,原则上项目中有且只有一个,develop 分支下面的分支是经常变化的,会创建新的 ...

  9. git分支管理和工作流规范:不同场景细化和演示

    https://www.iteye.com/blog/qqtalk-2415889 前两篇介绍了 git基本概念 和 具体的规范,本篇针对不同的使用场景做演示. 分支 分支命名 master 分支名称 ...

随机推荐

  1. 完成下方的 which_date() 函数,并返回某一起始时间后特定一段时间的日期

    from datetime import datetime,timedelta import re def which_date(start_date,time): """ ...

  2. Windows 2008R2 安装PostgreSQL 11.6

    前些天在CentOS 7.5 下安装了PostgreSQL 11.6.除了在无外网环境下需要另外配置之外,其他没有什么差别.今天主要写一下在Windows下面安装PostgreSQL的问题. 在官网看 ...

  3. solidworks 学习 (三)

    汽车轮毂三维建模

  4. WinDbg 图形界面功能(四)

    二.工具栏 除了断点按钮在工具栏上的每个按钮相当于菜单命令. 每个按钮的效果的完整说明,请参阅相应的菜单命令的页. 在工具栏上的按钮具有以下效果. 按钮 描述 打开源文件为只读的文件. 等效于文件 | ...

  5. cjss 像编写css 一样开发web应用

    cjss 提供了使用类似css 的方式编写web 应用 cjss 包含的阶段 data prepare body element 几点说明 并不是所以阶段必须使用,但是每个级别只能存在一个script ...

  6. SDSC2019【游记】

    目录 SDSC2019 游记 Day0 Day 1 Day2 Day3 Day4 Day5 Day6 Day 7 Day8 SDSC2019 游记 Day0 这次夏令营在日照某大学举行,我很想夸一夸喷 ...

  7. Linux启动与停止Tomcat

    停止Tomcat: cd 切换到Tomcat的bin目录下,关闭命令:[root@localhost bin]# ./shutdown.sh 检查tomcat是否已关闭,检查命令:[root@loca ...

  8. #C++初学记录(树和二叉树)

    二叉树的编号 例题 6-6 小球下落问题 有一棵二叉树,最大深度为D,且所有叶子深度都相同.所有节点从上到下,从左到右编号为1,2,3,4,....,2^D-1.在节点1处放置小球,他会往下落.每个节 ...

  9. 第07组 Alpha冲刺(4/6)

    队名:摇光 队长:杨明哲 组长博客:求戳 作业博客:求再戳 队长:杨明哲 过去两天完成了哪些任务 文字/口头描述:摇光测评的相关功能. 展示GitHub当日代码/文档签入记录:(组内共用,已询问过助教 ...

  10. 团队作业-Beta冲刺(1/4)

    队名:软工9组 组长博客:https://www.cnblogs.com/cmlei/ 作业博客:https://edu.cnblogs.com/campus/fzu/SoftwareEngineer ...