From db94d6f5e265b079bd1752bf945d7bb471e85c36 Mon Sep 17 00:00:00 2001 From: Jerry Lee Date: Fri, 29 Aug 2014 14:01:55 +0800 Subject: [PATCH] update workflow-feature-branch.md --- .../images/git-workflow-feature-branch-2.png | Bin 0 -> 5748 bytes .../workflow-centralized.md | 2 +- .../workflow-feature-branch.md | 60 +++++++++++++++++- 3 files changed, 59 insertions(+), 3 deletions(-) create mode 100644 git-workflows-and-tutorials/images/git-workflow-feature-branch-2.png diff --git a/git-workflows-and-tutorials/images/git-workflow-feature-branch-2.png b/git-workflows-and-tutorials/images/git-workflow-feature-branch-2.png new file mode 100644 index 0000000000000000000000000000000000000000..37b600a8bf02c283135219f03cc511f684117c40 GIT binary patch literal 5748 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 HNBqA4x{yAM literal 0 HcmV?d00001 diff --git a/git-workflows-and-tutorials/workflow-centralized.md b/git-workflows-and-tutorials/workflow-centralized.md index 9916602..ffefb60 100644 --- a/git-workflows-and-tutorials/workflow-centralized.md +++ b/git-workflows-and-tutorials/workflow-centralized.md @@ -3,7 +3,7 @@ ![Git Workflows: SVN-style](images/git-workflow-svn.png) -转到分布式版本控制系统看起来像个吓人的任务,但不需要改变你已有流程就可以用上Git的好处。你的团队可以用和`Subversion`完全不变的方式来开发项目。 +转到分布式版本控制系统看起来像个吓人的任务,但不改变已用的工作流程你也可以用上`Git`的好处。你的团队可以用和`Subversion`完全不变的方式来开发项目。 但用上`Git`可以比`SVN`在开发流程上有所改进。首先,每个开发可以有自己的是整个工程拷贝的本地分支。隔离的环境让各个开发者的工作独立于项目其它修改的 —— 即自由地提交到自己的本地仓库,先完全忽略上游的开发,走到合适的时候把修改反馈给他们。 diff --git a/git-workflows-and-tutorials/workflow-feature-branch.md b/git-workflows-and-tutorials/workflow-feature-branch.md index c49e102..10e1ced 100644 --- a/git-workflows-and-tutorials/workflow-feature-branch.md +++ b/git-workflows-and-tutorials/workflow-feature-branch.md @@ -12,7 +12,7 @@ 功能开发隔离也让[`pull requests`](pull-request.md)工作流成功可能, [`pull requests`](pull-request.md)工作流能为每个分支发起一个讨论,给另外开发者在分支合入正式项目之前表示赞同机会。 另外,如果你在功能开发中有问题卡住了,可以开一个`pull requests`来向同学们征求建议。 -这些做法的重点就是,`pull requests`让团队成员之间评论各自工作变成灰常方便! +这些做法的重点就是,`pull requests`让团队成员之间互相评论工作变成非常方便! :beer: 工作方式 --------------------- @@ -21,4 +21,60 @@ 但不是直接提交本地历史到各自的本地`master`分支,开发者每次在开始新功能前先创建一个新分支。 功能分支应该有个有描述性的名字,比如`animated-menu-items`或`issue-#1061`,这样可以让分支有个清楚且高聚焦的目标。 -在`master`分支和功能分支,`Git`是没有技术的区别的。 +在`master`分支和功能分支,`Git`是没有技术上的区别,所以开发者可以用和集中式工作流中完全一样的方式编辑、暂存和提交修改到功能分支上。 + +并且功能分支也可以(且应该)`push`到中央仓库中。这样不修改正式代码不可以和其它开发者分享提交的功能。 +在中央仓库上有多个功能分支不会带任何问题,而`master`仅有的一个『特殊』分支。当然,这也是备份大家本地提交一个便利的做法。 + +### `Pull Requests` + +分支除了可以隔离功能的开发,也使得通过[`Pull Requests`](pull-request.md)讨论变更成为可能。 +一旦某个开发完成一个功能,不是立即合并到`master`,而是`push`到中央仓库的功能分支上并发起一个`Pull Request`请求合并修改到`master`。 +在修改成为主干代码前,这让其它的开发者有机会先去`Review`变更。 + +`Code Review`是`Pull Requests`的一个重要的收益,但Code Review实践的目的实际上是讨论代码一个通用方式。 +你可以把`Pull Requests`作为专门给某个分支的讨论。这意味着可以在更早的开发过程中就可以进行`Code Review`。 +比如,一个开发者开发功能时需要帮助,要做的就是发起一个`Pull Request`,相关的人就会自动收到通知,在相关的提交旁边能看到需要帮助解决的问题。 + +一旦`Pull Request`被接受了,发布功能要做的和集中式工作流就很像了。 +首先,确定本地的`master`分支和上游的`master`分支是同步的。然后合并功能分支到本地`master`分支并`push`已经更新的本地`master`分支到中央仓库。 + +仓库管理的产品解决方案像[`Bitbucket`](http://bitbucket.org/)或[`Stash`](http://www.atlassian.com/stash),可以良好地支持`Pull Requests`。可以看看`Stash`的[`Pull Requests`文档](https://confluence.atlassian.com/display/STASH/Using+pull+requests+in+Stash)。 + +:beer: 示例 +--------------------- + +下面的示例演示了如何把`Pull Requests`作为`Code Review`的方式,但注意`Pull Requests`可以用于很多其它的目的。 + +### 小红开始开发一个新功能 + +![](images/git-workflow-feature-branch-2.png) + +在开始开发功能前,小红需要一个独立的分支。使用下面的命令[新建一个分支](https://www.atlassian.com/git/tutorial/git-branches#!checkout): + +```bash +git checkout -b marys-feature master +``` + +这个命令检出一个基于`master`名为`marys-feature`的分支,`Git`的`-b`选项表示如果分支还不存在则新建分支。 +这个新分支上,小红按老套路编辑、暂存和提交修改,按需要提交以实现功能: + +```bash +git status +git add +git commit +``` + +### 小红要去吃个午饭 + +早上小红为新功能添加一些提交。 +去吃午饭前,`push`功能分支到中央仓库是很好的做法,这是一个方便的备份,如果和其它开发协作,也让他们可以看到小红的提交。 + +```bash +git push -u origin marys-feature +``` + +这条命令`push` `marys-feature`分支到中央仓库(`origin`),`-u`选项设置本地分支去跟踪远程对应的分支。 +设置好跟踪的分支后,小红就可以使用`git push`命令省去指定推送分支的参数。 + +### 小红完成功能开发