使用git pull请求为开源项目做出贡献的工作流程是什么? (例如,通过Github)

时间:2014-01-06 17:54:20

标签: git github open-source pull-request

我对如何执行此操作有一个全面的逐步说明,我想在此处分享,以便开发人员可以从中受益(我将回答我自己的问题)。

2 个答案:

答案 0 :(得分:55)

由于对开源项目的贡献必须经过同行评审,因此通常会看到依赖于git pull请求的工作流。直接克隆的repos不允许提取请求(您需要自己的fork)。因此,这些是我遵循的步骤,以保持健康的分叉并定期为开源做出贡献:

注意:步骤1,2和3仅在一台开发机器上完成一次以设置所有内容:

1)确保您在项目的“分支”上本地工作,而不是在指向项目作为原点的克隆存储库上工作。为了分叉Github项目,请转到https://github.com/entity/project,单击“Fork”并为分叉选择合适的GitHub帐户,例如。您的个人Github帐户。请注意,您的分叉项目“origin”将不再是原始项目仓库,而是您自己在Github上的分支。如果你要私人项目,请小心隐私,因为你可能不希望你的分支是公开的。

2)将您自己的项目分支克隆到您的开发机器并进入该目录。

git clone git@github.com:yourgithubuser/project.git

3)在分叉项目中将原始项目仓库添加为上游存储库。

git remote add upstream git@github.com:entity/project.git

原来的主要项目回购现在是“上游”而不是“原产地”

现在,当您使用分叉项目时,您将重复工作循环:

4)在开始工作之前,请务必确保forked repo的master分支与原始项目repo的master分支同步:

git checkout master
git fetch upstream
git merge upstream/master
git push origin master

5)在项目分支中为您要贡献的特定修补程序创建一个新分支(在修正错误,跟踪器问题,文档部分等之后命名)并切换到它

git checkout -b myfixes

这会自动创建分支并切换到它。 确保分支不存在。您可能还想删除已经合并到文档中的旧修复分支(否则您的项目中将有大量无用的分支)。您可以通过发出git branch来查看本地分支机构,如果在该列表中找到已与上游项目合并的分支,则可以执行以下操作:

git branch -D myoldfixes
git push origin --delete myoldfixes

重要提示:如果您已经在另一台计算机上工作并希望在新计算机上继续工作,则需要在新计算机上重做步骤2,3和4,在第5步,而不是做 git checkout -b myfixes ,你应该做 git checkout myfixes (删除-b )。否则你最终会得到一个“分离的头”状态,这种状态并不好(某种匿名分支)

6)在该分支上工作(例如myfixes)并提交您的更改:

git commit -a -m "My fixes"

(或者您可以在不使用-a的情况下暂存特定文件并提交。您可以根据需要提交多次,但不要在分支中保留未经修改的更改)

7)当您处理修补程序时,原始上游项目仓库可能已更改(由于其他贡献者正在处理它)。首先,您必须从上游目标分支重新定义当前分支(myfixes)。换句话说,您需要在上游repo master分支的最新工作之上重放您的修复,以确保您的提交仍然与上游的最新提交兼容。这将导致拉取请求的快进合并,这是我们想要的:

git checkout myfixes
git pull --rebase upstream master

注意:这可能会导致冲突,但这是正常的,修复它们是流程的一部分(这种情况在非常活跃的项目中更常发生)

8)修复上一步的冲突(如果有)后,您已将修复程序应用于最新版本的上游主服务器。由于拉取请求是从Github上的分叉存储库启动的,因此您希望保持同步:

git checkout myfixes
git push origin myfixes -f

9)最后,你可以去Github https://github.com/entity/project(原来的项目而不是你的叉子)并点击“Pull Request”。确保选择上游repo“master”作为目标分支,并将forked repo“myfixes”选为源分支(在接受pull请求后,将自动删除分支)

享受!

答案 1 :(得分:0)

6a)提交消息的提交和格式主题也很重要。

提交主题

提交主题应该只涵盖一个逻辑更改。例如,如果您要描述对某人的更改(例如,在提交消息中,请参见下文),您应该无法使用“和”一词来描述该主题,例如。 “修复错误123并更新配置默认值。”这些应该是两个单独的提交。

如果您的工作树中有许多单独的问题已解决但未提交,那么一个很棒的工具就是交互式添加。让你的手指记住这批命令,然后按照说明进行操作:

git add -i
5<CR>
*<CR>

你可以通过其他选项获得更好的体验,但是这表示“向我展示我工作树中的每一个变化,让我选择要播放的内容。”

然后,像往常一样:

git ci

提交消息

您希望对扫描历史记录的人提供简洁的标题,同时还为未来的人(包括您自己六个月内)提供身体的详细信息!挖掘涉及您的问题变化

我最喜欢的撰写良好提交消息的指南是Erlang/OTP wiki page on good commit messages,我将补充一点,您不会出现以下格式:

Short (<50 chars) present-tense summary of changes

Previously, <a couple sentences clearly describing the previous behavior
and the resulting customer issue>. 

This commit <a sentence or two clearly describing the code change, and the
resulting expected behavior>.