编辑推荐: |
本文来自csdn,主要介绍了集成管理员工作流,怎么使用多个远程仓库,以及协作的过程。 |
|
并行开发
集成管理员工作流
由于 Git 允许使用多个远程仓库,开发者便可以建立自己的公共仓库,往里面写数据并共享给他人,而同时又可以从别人的仓库中提取他们的更新过来。这种情形通常都会有个代表着官方发布的项目仓库(blessed
repository),开发者们由此仓库克隆出一个自己的公共仓库(developer public),然后将自己的提交推送上去,请求官方仓库的维护者拉取更新合并到主项目。维护者在自己的本地也有个克隆仓库(integration
manager),他可以将你的公共仓库作为远程仓库添加进来,经过测试无误后合并到主干分支,然后再推送到官方仓库。工作流程看起来就像图所示:
项目维护者可以推送数据到公共仓库 blessed repository。
贡献者克隆此仓库,修订或编写新代码。
贡献者推送数据到自己的公共仓库 developer public。
贡献者给维护者发送邮件,请求拉取自己的最新修订。
维护者在自己本地的 integration manger 仓库中,将贡献者的仓库加为远程仓库,合并更新并做测试。
维护者将合并后的更新推送到主仓库 blessed repository。
并行开发模拟
如果有几个小组分头负责若干特性的开发和集成,那他们之间的协作过程是怎样的。
假设 John 和 Jessica 一起负责开发某项特性 A,而同时 Jessica 和 Josie
一起负责开发另一项功能 B。公司使用典型的集成管理员式工作流,每个组都有一名管理员负责集成本组代码,及更新项目主仓库的
master 分支。所有开发都在代表小组的分支上进行。
让我们跟随 Jessica 的视角看看她的工作流程。她参与开发两项特性,同时和不同小组的开发者一起协作。克隆生成本地仓库后,她打算先着手开发特性
A。于是创建了新的 featureA 分支,继而编写代码:
# Jessica's Machine
$ git checkout -b featureA
Switched to a new branch "featureA"
$ vim lib/simplegit.rb
$ git commit -am 'add limit to log function'
[featureA 3300904] add limit to log function
1 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/master
Switched 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 recursive
1 files changed, 1 insertions(+), 1 deletions(-)
$ vim lib/simplegit.rb
$ git commit -am 'add ls-files'
[featureB 8512791] add ls-files
1 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/featureBee
Auto-merging lib/simplegit.rb
Merge 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.git
fba9af8..cd685d1 featureB -> featureBee |
接下来,John 发邮件给 Jessica 告诉她,他看了之后作了些修改,已经推回服务器 featureA
分支,请她过目下。于是 Jessica 运行 git fetch 下载最新数据:
$ git fetch
origin
...
From jessica@githost:simplegit
3300904..aad881d featureA -> origin/featureA |
接下来便可以用 git log 查看更新了些什么:
$ git log origin/featureA
^featureA
commit aad881d154acdaeb2b6b18ea0e827ed8a6d671e6
Author: John Smith <jsmith@example.com>
Date: Fri May 29 19:57:33 2009 -0700
changed log output to 30 from 25 |
最后,她将 John 的工作合并到自己的 featureA 分支中:
$ git checkout
featureA
Switched to branch "featureA"
$ git merge origin/featureA
Updating 3300904..aad881d
Fast forward
lib/simplegit.rb | 10 +++++++++-
1 files changed, 9 insertions(+), 1 deletions(-) |
Jessica 稍做一番修整后同步到服务器:
$ git commit
-am 'small tweak'
[featureA ed774b3] small tweak
1 files changed, 1 insertions(+), 1 deletions(-)
$ git push origin featureA
...
To jessica@githost:simplegit.git
3300904..ed774b3 featureA -> featureA |
现在的 Jessica 提交历史如图所示:
现在,Jessica,Josie 和 John 通知集成管理员服务器上的 featureA 及 featureBee
分支已经准备好,可以并入主线了。在管理员完成集成工作后,主分支上便多出一个新的合并提交(5399e),用
fetch 命令更新到本地后,提交历史如图所示:
许多开发小组改用 Git 就是因为它允许多个小组间并行工作,而在稍后恰当时机再行合并。通过共享远程分支的方式,无需干扰整体项目代码便可以开展工作,因此使用
Git 的小型团队间协作可以变得非常灵活自由。以上工作流程的时序如图所示:
|