原文 GitHub Standard Fork & Pull Request Workflow

开源社区 save your time!当你想回报 Github 社区,或者用 Git 管理与别人合作的项目时,了解怎么正确的 fork & pull request 是非常必要的。但是,如果你不熟悉这个流程的话,则可能会出错。

这个简单的手册介绍一个相对来说标准的流程:创建 fork, 开发,发起 Pull Request, 以及 merge Pull Request。

创建 Fork

很简单,到 Github 主页上单击 “fork” 按钮。然后在开发目录中执行下面的命令 clone 你 fork 的项目代码。

# Clone your fork to your local machine
git clone git@github.com:USERNAME/FORKED-PROJECT.git

Fork 与 upstream 保持一致

虽然这不是必要的一步,但是如果你想参与更多而不是仅仅做一个 quick fix, 你需要保证你的代码与远程原始代码库 (the original “upstream” repo) 保持一致。做到这一步,你仅需要设置下 remote:

# Add 'upstream' repo to list of remotes
git remote add upstream https://github.com/UPSTREAM-USER/ORIGINAL-PROJECT.git

# Verify the new remote named 'upstream'
git remote -v

当你想更新远程代码到你的 fork 时,首先你需要 fetch 原始上游分支的最新提交到你的项目中:

# Fetch from upstream remote
git fetch upstream

# View all branches, including those from upstream
git branch -va

然后,将上游远程 master 合并到你的 master 分支上:

# Checkout your master branch and merge upstream
git checkout master
git merge upstream/master

注意:如果与上游用非 master 分支交流,则改成相应的分支。

在 merge 过程中,如果没有冲突 git 会执行 fast-forward 合并。如果有冲突的话,请尊重上游的更改解决冲突。现在你的项目就与 upstream 保持一致了。

开发

创建新的分支 Branch

无论什么时候,你想开发一个新的 feature 或者 bugfix, 创建一个新的分支很重要。这不仅仅是正确的 git 工作流,而是这样你的开发的 feature 变化与 master 分支分隔,当每完成一个任务时就可发起 pull request.

创建新分支,开始工作:

# Checkout the master branch - you want your new branch to come from master
git checkout master

# Create a new branch named newfeature (give your branch its own simple informative name)
git branch newfeature

# Switch to your new branch
git checkout newfeature

现在,你就可以开发你的 feture 或者做 bugfix 了。

发起 Pull Request

当你的功能开发完成后可以发起 Pull Request。

开发者向团队成员通知功能开发已经完成,Pull Requests是最简单的用法。开发者完成功能开发后,发起一个Pull Request。这样让涉及这个功能的所有人知道,要去做Code Review和合并到master分支。

Pull Request远不止一个简单的通知,而是为讨论提交的功能的一个专门论坛。如果变更有任何问题,团队成员反馈在Pull Request中,甚至push新的提交微调功能。所有的这些活动都直接跟踪在Pull Request中。

Cleaning up your work

在发起 Pull Request 之前,你可能需要整理下你的分支以保持尽可能的简洁。这样其它维护者可以更方便的测试,accept, merge 你的代码。

如有上游的 master 分支有了新的提交,你需要 rebase 你的开发分支以保证在 merge 时不会有冲突能够执行 fast-forward 。

# Fetch upstream master and merge with your repo's master branch
git fetch upstream
git checkout master
git merge upstream/master

# If there were any new commits, rebase your development branch
git checkout newfeature
git rebase master

再者,在开发的时候你的提交历史可能很混乱,你可以重新整理 squash 你的提交,以保持精简。你可以使用交互式 rebase:

# Rebase all commits on your development branch
git checkout 
git rebase -i master

提交 push request

做完上面的步骤,可以到你的 github 主页上,选择你的开发分支然后单击 pull request 按钮发起 pull request. 如果之后有新的调整,你只需要直接 push 更新的到 github 上就行了。你发起的 pull request 会跟踪的更新。

接受合并 Pull Request

如是你仅仅是代码贡献者,自己不是该项目的管理者。那你的流程就已经结束了,因为这部分是写给上游原始代码库的 owner 的。Owner 要来处理 Pull Request.

Checking out & Testing Pull Requests

打开 .git/config 文件,在 [remote "origin"] 后添加一行:

fetch = +refs/pull/*/head:refs/pull/origin/*

现在,你可以 fetch , checkout 做任意一个 pull request ,以方便你测试它们。

# Fetch all pull request branches
git fetch origin

# Checkout out a given pull request branch based on its number
git checkout -b 999 pull/origin/999

注意: 这些分支你只能测试,而不能变更后提交更新。

自动 Merge Pull Request

如果 Pull Request 是一个 fast-forward 非常简单的功能,你可以直接在 Github 页面上单击 merge 来自动 merge request.

手动 Merge Pull Request

做手动 Merge ,你需要 checkout 源代码库的目标分支,拉下来 fork, 进行 merge 然后 push .

# Checkout the branch you're merging to in the target repo
git checkout master

# Pull the development branch from the fork repo where the pull request development was done.
git pull https://github.com/forkuser/forkedrepo.git newfeature

# Merge the development branch
git merge newfeature

# Push master with the new feature merged into it
git push origin master

最后你就可以删除你的开发分支了, up to you。

git branch -d newfeature

Additional Reading

Sources