如何在GitHub上为他人的代码做出贡献?

235
我想为GitHub上的某个项目做出贡献。我应该fork它吗?还是branch它?有什么推荐的方法和步骤吗?

4
我在Github上撰写了一份更为详细的逐步指南,以便参与Concrete5项目,但此过程适用于任何项目。请查看 - Joe Meyer
4
请访问 https://github.com/joindin/joind.in/wiki/How-to-Contribute-Code 了解如何贡献代码。 - Konstantinos
1
也许通过足够多的多数投票,先前关闭的问题应该被允许再次复活,并让人们再次为该主题做出贡献。 - Peter Teoh
@wizztjh,又一篇简单的教程:http://www.pontikis.net/blog/how-to-collaborate-on-github-open-source-projects - Pacerier
这是一个实践教程 https://github.com/Roshanjossey/first-contributions - sudo bangbang
7个回答

190
理想情况下,您应该:
  1. Fork 这个项目
  2. 对代码库进行一个或多个注释清晰、代码规范的提交。如果您修改了不止一个部分或功能,则可以在此处创建一个新分支。
  3. 通过github的网页界面执行pull request操作。

如果这是一个新的功能请求,请勿立即开始编码。请记得发布问题以讨论新功能。

如果该功能经过充分讨论并且有一些+1或项目所有者批准了它,请将问题分配给自己,然后执行上述步骤。

有些项目不会使用pull request系统。请与作者或邮件列表联系,询问将代码合并到项目中的最佳方式。


4
关于GitHub的“分叉”(forking)和“拉取请求”(pull requests)的详细信息,请参考以下链接:
  • 分叉:http://help.github.com/forking/
  • 拉取请求:http://help.github.com/pull-requests/
- Gabriel Grant
1
是的,pull request。Merge request 是 Gitorious 的术语。 - Yann Ramin
2
@MariusKavansky 这其实是反过来的!只有你知道要做什么,才能做出贡献 :) - hashbrown
在我为一些开源项目做出贡献后,我认为如果是一个新功能,最好的做法是开启一个问题(issue)以进行讨论。如果这个功能或问题已经充分讨论过了,你应该将其分配给自己,然后按照上述步骤进行操作。这是我的个人建议。 - wizztjh
@hashbrown,他在问已经请求并且点赞的功能“列表”在哪里。 - Pacerier
我按照指示操作,但最终在我的项目分支上创建了一个拉取请求,而不是原作者的项目。因此,说明中缺少某些内容。 - geoidesic

34

除了 Yann 的回答,一旦您 fork 了一个项目,您可以在任何分支中进行开发(新的分支或原始项目的分支)。

请记住:


1
你能在第二点(变基分支)上添加详细信息或链接吗? - JorgeArtware
1
@JorgeArtware 我已经更新了答案,并附上了一些说明rebase的链接。 - VonC
@VonC,我在这里提出一个问题,但如果您认为有必要,我可以将其作为一个全新的问题提出来。除了拥有“直线历史”之外,为什么我要选择变基(rebase)而不是合并(merge)呢?换句话说,当我的功能分支已经被合并到开发分支和主分支后,我会执行以下操作: git checkout master; git pull; 同样的操作也会在开发分支上执行(我的功能分支最初是合并到开发分支上的)。 在阅读了“pull vs pull --rebase”和“merge vs rebase”之后,我能想到的区别只是平面历史。还有其他更深层次的区别吗? - linuxbandit
@grasshopper 在“贡献”方面(本页面的上下文),在推送之前,您总是希望将本地提交重新基于更新的分支:这将使维护者将所述贡献轻松集成到原始项目分支中。在您的问题的上下文中,如果您的PR已被接受,当然,您可以合并而不是重新基于现有分支进行更新。 - VonC
@VonC 谢谢,所以我读到的所有有关rebase在PR之前应用的建议都是有道理的。为了反映已接受和合并的PR在我的本地repo中,是否有常见的做法(重新设置基础分支而不是合并),或者我可以随意操作?如果我将提交另一个PR呢? - linuxbandit
@linuxbandit 事情是这样的:如果你正在谈论一个内部开发,你不打算贡献回去,那么你可以随意使用rebase或merge。但对于另一个将要被贡献回去的wip(工作进行中),在上游进行rebase是更可取的,正如Jon Skeet在一个小时前在https://github.com/google/google-api-dotnet-client/pull/917#issuecomment-289007696中所解释的那样。 - VonC

15

除了Yan和VonC的回答之外,这是github自己提供的一个很好的资源:http://help.github.com/forking/

还要确保在右侧边栏下方的“协作”标题下查看。


10

这里有一个很棒的Railscast视频(链接),向您介绍了贡献开源项目的过程。此外,它还提供了许多好的技巧,比如如何确定希望参与的分支、使用测试、子模块等。

虽然这个视频主要是针对Rails开发人员的,但大部分信息对于贡献任何开源项目都是有效的。


4
Github有很多合作项目的方式。大多数项目使用的模式是pull request模式。我创建了一个项目来帮助人们进行第一次GitHub pull request。你可以通过这里进行实践教程,制作自己的第一个PR。
工作流程如下:
1. 在Github上fork仓库 2. 克隆仓库到您的计算机 3. 创建一个分支并进行必要的更改 4. 将更改推送到您在GitHub上的分叉中,命令为git push origin branch-name 5. 转到您在GitHub上的fork中查看“比较和拉取请求”按钮 6. 点击它并提供必要的细节

3

2

技术流程

我建议以下工作流程:

  1. 在GitHub网页界面上,点击“Fork”按钮来fork该仓库。

  2. 在你的fork仓库中,复制URL。

  3. 在命令行中进行clone操作。

    git clone <来自你的Workspace的URL>

  4. 进入刚刚创建的目录并创建一个分支。

    cd <directory> git checkout -b <branchname>

  5. 现在进行更改。

  6. 每次更改后,你可以创建一个或多个commits:

    git add .; git commit

  7. 完成后,推送更改。

    git push origin <branch>

  8. 在命令行中,你应该看到一个URL用于创建PR。访问该URL并单击按钮以创建PR。

  9. 如果没有,可以在浏览器中访问该仓库,并提供一个用于创建pull request的按钮。

就是这样。

因此,你将该仓库fork到你的Workspace中,创建一个新分支并推送该新分支。

如果以后你从同一克隆的repo中进行了更多PR,则在为另一个PR创建另一个分支之前,应先同步(获取原始仓库的最新更改):

git checkout master
git remote add upstream <url-of-original-repo>
git pull upstream master

其他注意事项:

  • 项目可能有贡献指南:寻找 CONTRIBUTING.rst 或 .md 文件
  • 您可能想要遵循项目的编码规范
  • 您可能想先将您的想法概述为问题
  • 您可能想查看该项目的拉取请求选项卡,并检查是否有开放的 PR、合并的 PR

这些建议是为了帮助您避免在一个不会合并 PR 的项目中浪费工作。如果项目有活动并且合并了 PR,则表示情况良好。如果有贡献指南,请务必遵循。

始终要有礼貌。请记住,该项目的维护者没有义务合并您的 PR。您有有价值的内容要添加到该项目吗?

Translated content in Chinese:
最初的回答

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接