前言
为更好利用git分布式协作的功能,这里介绍最典型的 Forking + Pull Request 工作流的方法提交相关作业或代码。目前 Pull Request 已是对当前开源社区贡献代码的主要方法。在熟悉该模式和流程后,可直接迁移该过程用于对开源项目的代码贡献中。
整体过程的基本思路为:
首先,在团队项目主页或者开源项目主页上 Fork 该项目,将项目 Fork 至自己仓库中。然后,将该项目 Clone 至本地,建立相关分支,完成相关作业。随后,提交该版本,将本地仓库的分支Push到自己的远程仓库中。再操作远程仓库发出 Pull Request 向上游发出 Pull 的请求,完成相关分支的合并。
Pull Request 的流程图,源自论文 Reviewer Recommender of Pull-Requests in GitHub
远程仓库准备: Forks and Clones
这里以码云为例,一般在项目页面的右上角,点击 Fork 按钮,将远程仓库 Fork 到自己的远程仓库中。这时候,自己便有一个独立的远程仓库,并有属于自己的地址。
在拥有了自己的远程仓库后,就可以 Clone 该仓库,在本机的工作区内Clone出一个拷贝。
git clone 远程仓库地址
下一步,即可在本机的工作区内完成任务或者一个新的特性开发。当然,在此之前,最好 新建一个分支。 这里,假设新的分支名称为 feature。
在完成相关功能,并在本地仓库提交完成一个版本后,就可将本地的这个开发分支(feature分支),push到自己的远程仓库中。
git push origin feature
以下,正式进入到 Pull Request 部分。
Pull Request
首先,Pull Request 本身是发送一种请求,刚开始听起来可能有点迷惑,主要可能会搞错 Pull 的主体和目标。实际上,Pull request 是 你自己发送请求,让别人来pull你所做出的更改。
Pull Request 是一种通知机制。你修改了他人的代码,将你的修改通知原来的作者,希望他合并你的修改,这就是 Pull Request
这里,你Push到你自己远程仓库的内容,实际上是你所做出的修改。不要忘记,你的远程仓库是Clone自项目组或者开源项目的页面,现在你就需要向这个项目的源头发送请求,将你所作的变更,合并到源头的仓库中去。因此,你需要向项目的主人发送一个 Request,来请求他 Pull 你所提交的分支(Pull 命令实际上是 Fetch + Merge 命令的组合)。
点击你自己远程仓库主页上的 “+Pull Request” 按钮,正式进入 Pull Request 操作。
在正式发布 Pull Request 之前,无非需要指定一下你的源分支(你所作更改的功能分支)和目标分支(最原始的项目地址和分支)。然后,再提供该次 Pull Request 的标题和描述信息。是否加一些标签和优先级信息等。完成后,点击“创建”按钮,就正式完成 Pull Request ,这时候会有通知发送至该项目的负责人,进行测试和审核。
Pull Request 的补充提交
通常,一个 Pull Request 不会一次性就能满足提交,项目的负责人会对该次 Pull Request 作必要的测试和审查,这个过程后,也常常会提出一些反馈和意见,可能需要你多次修改这个 Pull Request ,并重新和项目的负责人进行交互。此时,无需增加一个新的 Pull Request,只需要在本地分支进行修改,Push到自己的远程仓库中。此时,这些变更会自动向后累加到该 Pull Request 当中。项目负责人可重新审查新增加的变更。
参考文献
- 这里有一个不错的 Git Workflows and Tutorials可参考
- 上面那个 Tutorials 和本文对应的工作流部分的 Pull Request 工作流翻译
- Pull Request 的命令行管理
- Github工作流交互式解释
- 五个基本的Git工作流