Git学习文档之一 学习文档-并行开发

来源:互联网 发布:jquery数组清空 编辑:程序博客网 时间:2024/05/22 12:57

并行开发

集成管理员工作流

由于 Git 允许使用多个远程仓库,开发者便可以建立自己的公共仓库,往里面写数据并共享给他人,而同时又可以从别人的仓库中提取他们的更新过来。这种情形通常都会有个代表着官方发布的项目仓库(blessed repository),开发者们由此仓库克隆出一个自己的公共仓库(developer public),然后将自己的提交推送上去,请求官方仓库的维护者拉取更新合并到主项目。维护者在自己的本地也有个克隆仓库(integration manager),他可以将你的公共仓库作为远程仓库添加进来,经过测试无误后合并到主干分支,然后再推送到官方仓库。工作流程看起来就像图所示:

  1. 项目维护者可以推送数据到公共仓库 blessed repository。
  2. 贡献者克隆此仓库,修订或编写新代码。
  3. 贡献者推送数据到自己的公共仓库 developer public。
  4. 贡献者给维护者发送邮件,请求拉取自己的最新修订。
  5. 维护者在自己本地的 integration manger 仓库中,将贡献者的仓库加为远程仓库,合并更新并做测试。
  6. 维护者将合并后的更新推送到主仓库 blessed repository。

输入图片说明

并行开发模拟

如果有几个小组分头负责若干特性的开发和集成,那他们之间的协作过程是怎样的。

假设 John 和 Jessica 一起负责开发某项特性 A,而同时 Jessica 和 Josie 一起负责开发另一项功能 B。公司使用典型的集成管理员式工作流,每个组都有一名管理员负责集成本组代码,及更新项目主仓库的 master 分支。所有开发都在代表小组的分支上进行。

让我们跟随 Jessica 的视角看看她的工作流程。她参与开发两项特性,同时和不同小组的开发者一起协作。克隆生成本地仓库后,她打算先着手开发特性 A。于是创建了新的 featureA 分支,继而编写代码:

# Jessica's Machine$ git checkout -b featureASwitched to a new branch "featureA"$ vim lib/simplegit.rb$ git commit -am 'add limit to log function'[featureA 3300904] add limit to log function1 files changed, 1 insertions(+), 1 deletions(-)

此刻,她需要分享目前的进展给 John,于是她将自己的 featureA 分支提交到服务器。由于 Jessica 没有权限推送数据到主仓库的 master 分支(只有集成管理员有此权限),所以只能将此分支推上去同 John 共享协作:

$ git push origin featureA...To jessica@githost:simplegit.git* [new branch] featureA -> featureA

Jessica 发邮件给 John 让他上来看看 featureA 分支上的进展。在等待他的反馈之前,Jessica 决定继续工作,和 Josie 一起开发 featureB 上的特性 B。当然,先创建此分支,分叉点以服务器上的 master 为起点:

# Jessica's Machine$ git fetch origin$ git checkout -b featureB origin/masterSwitched to a new branch "featureB"

随后,Jessica 在 featureB 上提交了若干更新:

$ vim lib/simplegit.rb$ git commit -am 'made the ls-tree function recursive'[featureB e5b0fdc] made the ls-tree function recursive1 files changed, 1 insertions(+), 1 deletions(-)$ vim lib/simplegit.rb$ git commit -am 'add ls-files'[featureB 8512791] add ls-files1 files changed, 5 insertions(+), 0 deletions(-)

现在 Jessica 的更新历史如图所示:

输入图片说明

Jessica 正准备推送自己的进展上去,却收到 Josie 的来信,说是她已经将自己的工作推到服务器上的 featureBee 分支了。这样,Jessica 就必须先将 Josie 的代码合并到自己本地分支中,才能再一起推送回服务器。她用 git fetch 下载 Josie 的最新代码:

$ git fetch origin...From jessica@githost:simplegit* [new branch] featureBee -> origin/featureBee

然后 Jessica 使用 git merge 将此分支合并到自己分支中:

$ git merge origin/featureBeeAuto-merging lib/simplegit.rbMerge made by recursive.lib/simplegit.rb | 4 ++++1 files changed, 4 insertions(+), 0 deletions(-)

合并很顺利,但另外有个小问题:她要推送自己的 featureB 分支到服务器上的 featureBee 分支上去。当然,她可以使用冒号(:)格式指定目标分支:

$ git push origin featureB:featureBee...To jessica@githost:simplegit.gitfba9af8..cd685d1 featureB -> featureBee

接下来,John 发邮件给 Jessica 告诉她,他看了之后作了些修改,已经推回服务器 featureA 分支,请她过目下。于是 Jessica 运行 git fetch 下载最新数据:

$ git fetch origin...From jessica@githost:simplegit3300904..aad881d featureA -> origin/featureA

接下来便可以用 git log 查看更新了些什么:

$ git log origin/featureA ^featureAcommit aad881d154acdaeb2b6b18ea0e827ed8a6d671e6Author: John Smith <jsmith@example.com>Date: Fri May 29 19:57:33 2009 -0700changed log output to 30 from 25

最后,她将 John 的工作合并到自己的 featureA 分支中:

$ git checkout featureASwitched to branch "featureA"$ git merge origin/featureAUpdating 3300904..aad881dFast forwardlib/simplegit.rb | 10 +++++++++-1 files changed, 9 insertions(+), 1 deletions(-)

Jessica 稍做一番修整后同步到服务器:

$ git commit -am 'small tweak'[featureA ed774b3] small tweak1 files changed, 1 insertions(+), 1 deletions(-)$ git push origin featureA...To jessica@githost:simplegit.git3300904..ed774b3 featureA -> featureA

现在的 Jessica 提交历史如图所示:

输入图片说明

现在,Jessica,Josie 和 John 通知集成管理员服务器上的 featureA 及 featureBee 分支已经准备好,可以并入主线了。在管理员完成集成工作后,主分支上便多出一个新的合并提交(5399e),用 fetch 命令更新到本地后,提交历史如图所示:

输入图片说明

许多开发小组改用 Git 就是因为它允许多个小组间并行工作,而在稍后恰当时机再行合并。通过共享远程分支的方式,无需干扰整体项目代码便可以开展工作,因此使用 Git 的小型团队间协作可以变得非常灵活自由。以上工作流程的时序如图所示:

输入图片说明

0 0
原创粉丝点击