Git的各种工作流
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的各种工作流的更多相关文章
- Git版本控制与工作流详解
这篇文章是针对git版本控制和工作流的总结,如果有些朋友之前还没使用过git,对git的基本概念和命令不是很熟悉,可以从以下基本教程入手: 专为设计师而写的GitHub快速入门教程 git – 简明指 ...
- 好代码是管出来的——Git的分支工作流与Pull Request
上一篇文章介绍了常用的版本控制工具以及git的基本用法,从基本用法来看git与其它的版本控制工具好像区别不大,都是对代码新增.提交进行管理,可以查看提交历史.代码差异等功能.但实际上git有一个重量级 ...
- Git - Pull Request工作流
Pull Requests是Bitbucket上方便开发者之间协作的功能.提供了一个用户友好的Web界面,在集成提交的变更到正式项目前可以对变更进行讨论. 开发者向团队成员通知功能开发已经完成,Pul ...
- Git版本控制与工作流
基本概念 Git是什么? Git是分布式版本控制系统,与SVN类似的集中化版本控制系统相比,集中化版本控制系统虽然能够令多个团队成员一起协作开发,但有时如果中央服务器宕机的话,谁也无法在宕机期间提交更 ...
- git学习(4)---工作流
一.目的 前三章介绍了git工具本身的操作,主要包含本地仓库操作和远程库操作两部分内容.接下来,我们将介绍怎样使用git进行项目开发,也叫做git工作流. git工作流分为三种模式:共享远程库模式.独 ...
- Git之GitFlow工作流
一. GitFlow 介绍 1.1 什么是 GitFlow GitFlow 是一种 Git 工作流,它是团队成员遵守的一种代码管理方案 . 1.2 GitFlow 常用分支说明 分支名称 分支说明 P ...
- 版本管理工具Git三种工作流
Git是分布式版本管理控制的工具.学习Git一般都是先去学习Git的命令. 但是学习完Git的基本命令之后还是不知道怎样使用Git.首先,我们要清楚的 一点是Git的使用方法其实有很多种,也就是说Gi ...
- git工具SourceTree工作流
分支模型 master 用来最终上线的分支,最终发布版本,整个项目中有且只有一个 develop 项目中用来开发的分支,原则上项目中有且只有一个,develop 分支下面的分支是经常变化的,会创建新的 ...
- git分支管理和工作流规范:不同场景细化和演示
https://www.iteye.com/blog/qqtalk-2415889 前两篇介绍了 git基本概念 和 具体的规范,本篇针对不同的使用场景做演示. 分支 分支命名 master 分支名称 ...
随机推荐
- C++内存分配/分布——堆栈存储区
FROM: C++内存分配方式详解——堆.栈.自由存储区.全局/静态存储区和常量存储区 栈,就是那些由编译器在需要的时候分配,在不需要的时候自动清除的变量的存储区.里面的变量通常是局部变量.函数参数等 ...
- tensorflow2.0 学习(二)
线性回归问题 # encoding: utf-8 import numpy as np import matplotlib.pyplot as plt data = [] for i in range ...
- learning at command AT+CPIN
[Purpose] Learning how to check sim ready? [Eevironment] Shell terminal, base on gcom command and gc ...
- zeptojs库
一.简介 ①Zepto是一个轻量级的针对现代高级浏览器的JavaScript库, 它与jquery有着类似的api. ②Zepto的设计目的是提供 jQuery 的类似的API,但并不是100%覆盖 ...
- Python 下载超大文件
使用python下载超大文件, 直接全部下载, 文件过大, 可能会造成内存不足, 这时候要使用requests 的 stream模式, 主要代码如下 iter_content:一块一块的遍历要下载的内 ...
- 洛谷 P3884 [JLOI2009]二叉树问题
目录 题目 思路 \(Code\) 题目 P3884 [JLOI2009]二叉树问题 思路 深搜统计深度,倍增\(\text{LCA}\)求边数 \(Code\) #include<iostre ...
- 用Desmos玩极坐标[适配手机端]
前言 数学给人的印象一直就是算算算,今天我们不算,我们只玩. 必备条件 ①."呆萌"软件--Desmos 网址:https://www.desmos.com/calculator, ...
- 时间datetime模块
datetime模块 import datetime --时间加减的模块 #返回当前时间 print(datetime.datetime.now()) --2019-09-28 17:22:14.54 ...
- shell脚本编程基础之函数
函数 作用:代码重用 定义函数: 方法1: function FUNCTION_NAME { #函数名和定义变量名一样,只能包含数字字母下划线,并且不能以数字开头 command } 方法2: FUN ...
- Vue 自定义编译打包路径
在 vue.config.js 文件下添加 outputDir 配置项: module.exports = { outputDir:"my_target_direct", // o ...