文档章节

Git Forking工作流

小致dad
 小致dad
发布于 2017/08/19 15:40
字数 2189
阅读 28
收藏 0

Forking工作流的一个主要优势是,贡献的代码可以被集成,而不需要所有人都能push代码到仅有的中央仓库中。开发者push到自己的服务端仓库,而只有项目维护者才能push到正式仓库。这样项目维护者可以接受任何开发者的提交,但无需给他正式代码库的写权限。

效果就是一个分布式的工作流,能为大型、自发性的团队(包括了不受信的第三方)提供灵活的方式来安全的协作。也让这个工作流成为开源项目的理想工作流。

工作方式

和其它的Git工作流一样,Forking工作流要先有一个公开的正式仓库存储在服务器上。但一个新的开发者想要在项目上工作时,不是直接从正式仓库克隆,而是fork正式项目在服务器上创建一个拷贝。

这个仓库拷贝作为他个人公开仓库 —— 其它开发者不允许push到这个仓库,但可以pull到修改(后面我们很快就会看这点很重要)。在创建了自己服务端拷贝之后,和之前的工作流一样,开发者执行git clone命令克隆仓库到本地机器上,作为私有的开发环境。

要提交本地修改时,push提交到自己公开仓库中 —— 而不是正式仓库中。然后,给正式仓库发起一个pull request,让项目维护者知道有更新已经准备好可以集成了。对于贡献的代码,pull request也可以很方便地作为一个讨论的地方。

为了集成功能到正式代码库,维护者pull贡献者的变更到自己的本地仓库中,检查变更以确保不会让项目出错,合并变更到自己本地的master分支,然后pushmaster分支到服务器的正式仓库中。到此,贡献的提交成为了项目的一部分,其它的开发者应该执行pull操作与正式仓库同步自己本地仓库。

正式仓库

Forking工作流中,『官方』仓库的叫法只是一个约定,理解这点很重要。从技术上来看,各个开发者仓库和正式仓库在Git看来没有任何区别。事实上,让正式仓库之所以正式的唯一原因是它是项目维护者的公开仓库。

Forking工作流的分支使用方式

所有的个人公开仓库实际上只是为了方便和其它的开发者共享分支。各个开发者应该用分支隔离各个功能,就像在功能分支工作流Gitflow工作流一样。唯一的区别是这些分支被共享了。在Forking工作流中这些分支会被pull到另一个开发者的本地仓库中,而在功能分支工作流和Gitflow工作流中是直接被push到正式仓库中。

示例

项目维护者初始化正式仓库

和任何使用Git项目一样,第一步是创建在服务器上一个正式仓库,让所有团队成员都可以访问到。通常这个仓库也会作为项目维护者的公开仓库。

公开仓库应该是裸仓库,不管是不是正式代码库。所以项目维护者会运行像下面的命令来搭建正式仓库:

ssh user@host
git init --bare /path/to/repo.git

BitbucketStash提供了一个方便的GUI客户端以完成上面命令行做的事。这个搭建中央仓库的过程和前面提到的工作流完全一样。如果有现存的代码库,维护者也要push到这个仓库中。

开发者fork正式仓库

其它所有的开发需要fork正式仓库。可以用git clone命令用SSH协议连通到服务器,拷贝仓库到服务器另一个位置 —— 是的,fork操作基本上就只是一个服务端的克隆。BitbucketStash上可以点一下按钮就让开发者完成仓库的fork操作。

这一步完成后,每个开发都在服务端有一个自己的仓库。和正式仓库一样,这些仓库应该是裸仓库。

开发者克隆自己fork出来的仓库

下一步,各个开发者要克隆自己的公开仓库,用熟悉的git clone命令。

在这个示例中,假定用Bitbucket托管了仓库。记住,如果这样的话各个开发者需要有各自的Bitbucket账号,使用下面命令克隆服务端自己的仓库:

git clone https://user@bitbucket.org/user/repo.git

相比前面介绍的工作流只用了一个origin远程别名指向中央仓库,Forking工作流需要2个远程别名 —— 一个指向正式仓库,另一个指向开发者自己的服务端仓库。别名的名字可以任意命名,常见的约定是使用origin作为远程克隆的仓库的别名(这个别名会在运行git clone自动创建),upstream(上游)作为正式仓库的别名。

git remote add upstream https://bitbucket.org/maintainer/repo

需要自己用上面的命令创建upstream别名。这样可以简单地保持本地仓库和正式仓库的同步更新。注意,如果上游仓库需要认证(比如不是开源的),你需要提供用户:

git remote add upstream https://user@bitbucket.org/maintainer/repo.git

这时在克隆和pull正式仓库时,需要提供用户的密码。

开发者开发自己的功能

在刚克隆的本地仓库中,开发者可以像其它工作流一样的编辑代码、提交修改和新建分支:

git checkout -b some-feature
// Edit some code
git commit -a -m "Add first draft of some feature"

所有的修改都是私有的直到push到自己公开仓库中。如果正式项目已经往前走了,可以用git pull命令获得新的提交:

git pull upstream master

由于开发者应该都在专门的功能分支上工作,pull操作结果会都是快进合并。

开发者发布自己的功能

一旦开发者准备好了分享新功能,需要做二件事。首先,通过push他的贡献代码到自己的公开仓库中,让其它的开发者都可以访问到。他的origin远程别名应该已经有了,所以要做的就是:

git push origin feature-branch

这里和之前的工作流的差异是,origin远程别名指向开发者自己的服务端仓库,而不是正式仓库。

第二件事,开发者要通知项目维护者,想要合并他的新功能到正式库中。BitbucketStash提供了Pull Request按钮,弹出表单让你指定哪个分支要合并到正式仓库。一般你会想集成你的功能分支到上游远程仓库的master分支中。

项目维护者集成开发者的功能

当项目维护者收到pull request,他要做的是决定是否集成它到正式代码库中。有二种方式来做:

  1. 直接在pull request中查看代码
  2. pull代码到他自己的本地仓库,再手动合并

第一种做法更简单,维护者可以在GUI中查看变更的差异,做评注和执行合并。但如果出现了合并冲突,需要第二种做法来解决。这种情况下,维护者需要从开发者的服务端仓库中fetch功能分支,合并到他本地的master分支,解决冲突:

git fetch https://bitbucket.org/user/repo feature-branch
// 查看变更
git checkout master
git merge FETCH_HEAD

变更集成到本地的master分支后,维护者要push变更到服务器上的正式仓库,这样其它的开发者都能访问到:

git push origin master

注意,维护者的origin是指向他自己公开仓库的,即是项目的正式代码库。到此,开发者的贡献完全集成到了项目中。

开发者和正式仓库做同步

由于正式代码库往前走了,其它的开发需要和正式仓库做同步:

git pull upstream master

本文转载自:https://my.oschina.net/liuyuantao/blog/1516699

共有 人打赏支持
上一篇: Java装饰者模式
下一篇: Git集中式工作流
小致dad
粉丝 152
博文 539
码字总数 580673
作品 0
济南
技术主管
私信 提问
深入理解学习git工作流

个人在学习git工作流的过程中,从原有的 SVN 模式很难完全理解git的协作模式,直到有一天我看到了下面的文章,好多遗留在心中的困惑迎刃而解,于是我将这部分资料进行整理放到了github上,欢...

xirong
2015/06/18
1
0
深入理解学习Git工作流(git-workflow-tutorial)

一、译序 二、Git工作流指南 2.5.1 解析Pull Request 2.5.2 工作方式 2.5.3 在功能分支工作流中使用Pull Request 2.5.4 在Gitflow工作流中使用Pull Request 2.5.5 在Forking工作流中使用Pul...

北方人在上海
2016/02/27
144
0
初创公司应该如何做好持续集成和部署?

持续集成和部署是每一个互联网开发团队都必须要面对的问题,特别是在初创公司,由于业务和技术团队快速增长,技术积累较弱的,所以一个高效的,可持续的运维规范尤为重要。 最近一段时间一直...

90xa
2016/03/19
87
0
好代码是管出来的——Git的分支工作流与Pull Request

  上一篇文章好代码是管出来的——使用Git来管理源代码 介绍了常用的版本控制工具以及git的基本用法,从基本用法来看git与其它的版本控制工具好像区别不大,都是对代码新增、提交进行管理,...

dotNET跨平台
2018/06/25
0
0
Git基本命令和GitFlow工作流

本篇文章讲解了Git的一些基本的团队协作命令,和GitFlow工作流指南 git 团队协作的一些命令 1.开分支 git branch 新分支名 例如,在master分支下,新开一个开发分支: git branch dev 2.切换...

DR_WHO
2015/10/14
2
3

没有更多内容

加载失败,请刷新页面

加载更多

python精简笔记-[5]-列表[list]

1

平头哥-Enjoystudy
24分钟前
1
0
《如何做好一场技术演讲》笔记

[TOC] 1. 精心准备 1.1. 明确演讲主题 如同架构设计一样,了解需求永远是第一位的,任何脱离需求的架构设计都是耍流氓。 想要开始演讲,首先需要了解听众的诉求,确认下面这些问题: 听众组成...

whoru
26分钟前
3
0
Oracle学习日志-4(查询基础)

首先新建一张Product表格。数据如下 语法 从表名中查询希望查询出的列的名字 SELECT <列名> FROM <表名> 例如从Product表中查询商品编号,商品名称和进货单价三列。 SELECT product_id,prod...

白话
26分钟前
2
0
【重大更新】跨平台移动开发框架Altova MobileTogether v5.0发布

MobileTogether是一款对应用程序进行精心渲染的跨平台移动开发框架,从所处设备到外形因素再到屏幕方向,很大程度的为开发人员和终端用户提供了更好的功能性与灵活性。MobileTogether包括: ...

ymy_666666
36分钟前
1
0
better-scroll的使用

目的:需要在手机端实现上拉加载数据,下拉刷新页面的功能。 使用的控件:better-scroll 难点:目前的better-scroll都是和vue一起使用,公司用的是angularjs1.x,所以需要最原始的使用然后封...

Pcat
39分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部