注: 本文采用知识共享署名-相同方式共享 4.0 国际许可协议进行许可。
名词解释
所谓特性分支工作流(Feature Branching),是指当开发新特性或者进行bug修复的时候,开发人员从master分支出发,建立新的分支,把开发工作放到这些专门的分支上独立进行。
特性分支工作流作为集中式工作流的一种扩展,依然沿用了统一远程Git库,但是它充分发挥了Git分支模型的优势,让多人协作开发同一个项目变得更加方便。在这种工作模式下,每个特性的开发都有自己的分支,对项目的主干(即master分支)不会构成任何影响。在特性分支上的变更,只有经过确认以后才会被合并到master分支,这样就保证了master分支的稳定性。
从特性分支往master分支合并的时候,我们还可以通过创建Pull Request来发起讨论,允许其他人对涉及变更的代码进行复查,给出反馈意见。虽然Git本身并不直接提供Pull Request功能,但是现在很多Git服务解决方案,比如像GitHub,Bitbucket,GitLab等,都有相应的功能,使用起来非常方便。
此外,特性分支工作流是一种非常重要的工作流,后面我们在学习更高层次的工作流时会发现,它们都是以特性分支工作流为基础的。
如何工作
第一步,在服务器上建立一个远程Git库,供所有人使用:
$ ssh git@my-git-remote
git> create test-feature-branching
Initialized empty Git repository in /home/git/test-feature-branching.git/
git> exit
Connection to my-git-remote closed.
第二步,William把远程库克隆到本地:
$ git clone git@my-git-remote:~/test-feature-branching.git
Cloning into 'test-feature-branching'...
warning: You appear to have cloned an empty repository.
$ cd test-feature-branching/
生成了项目的初始提交:
$ touch README
$ git add README
$ git commit -m 'initial commit'
[master (root-commit) 2d6529c] initial commit
1 file changed, 0 insertions(+), 0 deletions(-)
create mode 100644 README
并把它推送到了远程:
$ git push
Counting objects: 3, done.
Writing objects: 100% (3/3), 207 bytes | 29.00 KiB/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To my-git-remote:~/test-feature-branching.git
* [new branch] master -> master
第三步,Nicole也把远程库克隆到了本地:
$ git clone git@my-git-remote:~/test-feature-branching.git
Cloning into 'test-feature-branching'...
warning: You appear to have cloned an empty repository.
$ cd test-feature-branching/
建立了一个新的分支:
$ git checkout -b new-feature
Switched to a new branch 'new-feature'
并在新分支上开始了新特性的开发:
$ vi README
$ cat README
Git workflows
* Feature branching
第四步,Nicole在本地建立了一系列提交以后:
$ git add README
$ git commit -m 'working on new-feature'
[new-feature 30dc189] working on new-feature
1 file changed, 2 insertions(+)
把特性分支推送到远程,作为备份,也作为和其他人协作共享的基础:
$ git push origin new-feature
Counting objects: 3, done.
Writing objects: 100% (3/3), 278 bytes | 46.00 KiB/s, done.
Total 3 (delta 0), reused 2 (delta 0)
To my-git-remote:~/test-feature-branching.git
* [new branch] new-feature -> new-feature
因为是在远程库新建了一个和本地同名的new-feature分支,所以它对master分支不会产生任何影响。
第五步,Nicole的开发工作完成了,在变更被合并到master分支以前,她请William对变更涉及的代码进行复查。由于我们使用的是纯命令行的Git实验环境,所以并不直接提供Pull Request的功能。不过,Git命令行也为我们提供了其他功能,可以模拟这一过程。比如,我们可以让Nicole生成一个包含当前变更的补丁(Patch):
$ git format-patch master --stdout > new-feature.patch
然后发给William,等William拿到这个补丁以后,就可以检查里面的修改:
$ cat new-feature.patch
From 30dc189d391f41f97ef12255b1061880ed75ca23 Mon Sep 17 00:00:00 2001
From: Nicole <nicole@example.com>
Date: Wed, 29 May 2019 03:47:38 +0000
Subject: [PATCH] working on new-feature
---
README | 2 ++
1 file changed, 2 insertions(+)
diff --git a/README b/README
index e69de29..e3e052a 100644
--- a/README
+++ b/README
@@ -0,0 +1,2 @@
+Git workflows
+* Feature branching
--
2.17.1
并把它集成到本地的当前工作目录下,进行验证:
$ git apply new-feature.patch
第六步,William和Nicole之间经过反复的讨论,最后终于达成一致可以合并到master分支了。于是,William再次把补丁集成到本地,并通过--signoff
参数进行签收:
$ git am --signoff < new-feature.patch
Applying: working on new-feature
上述命令执行完以后会在William本地形成新的提交记录。因为使用了参数--signoff
,所以在提交记录里会有“Signed-off-by”这一行:
$ git log
commit b3138e88926c2b6176d7a45fb67ce7b959ae69f9 (HEAD -> master)
Author: Nicole <nicole@example.com>
Date: Wed May 29 03:47:38 2019 +0000
working on new-feature
Signed-off-by: William <william@example.com>
commit 2d6529cb9c190db73b3dd8473477446edd2a7790 (origin/master)
Author: William <william@example.com>
Date: Wed May 29 03:43:04 2019 +0000
initial commit
最后,我们把提交记录推送到远程的master分支:
$ git push
Counting objects: 3, done.
Writing objects: 100% (3/3), 314 bytes | 26.00 KiB/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To my-git-remote:~/test-feature-branching.git
2d6529c..b3138e8 master -> master
留下评论
您的电子邮箱地址并不会被展示。请填写标记为必须的字段。 *