Pull Request的正确打开方式(如何在GitHub上贡献开源项目)

本文详细介绍了如何使用GitHub的Pull Request流程进行开源项目协作,包括创建主题分支、提交Pull Request及后续处理等步骤。

GitHub的官方帮助如下:

发现这个官方文档写得比较简单,并没有提到开源项目协作方式的一些必要的trick(比如建立topic branch),还有PullRequest的运作细节也没有提到。写个简单的总结补充一下。

Step 1: Fork原项目

这个不解释了,单击一下鼠标就能做到的事情。参见GitHub帮助的原文

记得用git remote add添加上游远程库的地址,否则无法追踪上游库的更新。

Step 2: 创建你的主题(topic)branch

这一步非常重要GitHub的帮助里没有提到创建主题branch的必要性,你当然可以直接在原项目的默认branch(如master)上进行工作,但实际上:

如果打算为原项目作贡献,强烈建议你为每个主题创建一个单独的branch。

举例:如果需要修复原项目的一个和Unicode相关的issue:

$ git branch fix-unicode-error
$ git checkout fix-unicode-error

然后在自己的主题branch(这里是fix-unicode-error)下进行工作。

Step 3: 在主题branch下完成需要的工作

记得push相应的主题branch到GitHub

*(针对贡献者)rebase还是merge

从实用的角度来讲,

  • 当你在主题branch下工作,想要导入来自上游库的(与你当前的工作不冲突的情况下)更新时,使用git rebase

例如,(假设上游branch为upstream/master)

$ git rebase upstream/master fix-unicode-error

或者直接(如果当前branch已经是fix-unicode-error):

$ git rebase upstream/master

这将把当前branch的开发“base(基础)”推进到一个新的起点,而不会引入多余的commits。

  • 当你在某个branch下工作时,git merge可以用来合并来自其他branch的更新。

如果merge的branch来自远程库,一次merge操作会增加一个额外的commit(“Merge branch 'master' of something”)。如果在一个需要发送PullRequest的主题branch下面进行这种操作,(我个人觉得)这不是一种干净的手段。

当你在主线branch(例如master)下进行开发时,git merge可以用来吸收其他开发branch引入的新特性(包括主项目维护者用来直接mergePullRequests),很恰当。

Step 4: 发送第一个PullRequest

GitHub的界面:左边选择base branch,右边选择head branch。

  • base branch:相当于target branch,你希望PullRequest被merge到上游项目的哪个branch里。

    • 为什么要叫basebranch:base可以理解为你在进行git rebase操作时的那个“base”,也就是你的主题branch所基于的开发base(基础)。
  • head branch:相当于source branch,你希望自己开发库里的哪个branch被用来进行PullRequest(当然也就是你的主题branch)。

    • 为什么要叫headbranch:参见下面关于head的定义。

注意head与HEAD(大写)的区别:

  • head:简单地理解,就是指向某个commit对象的一个reference。它可以是一个branch的名称(例如,默认的master),也可以是一个tag的名称。一个库可以同时有任意多个head。

  • HEAD当前活动的head。在任意时刻,存在且仅存在一个HEAD。它可以是指向当前branch的head(比如,指向master,假如master是当前branch的话);也可以不指向任何特定的branch(这叫做detached HEAD)。

系统会从你选择的head branch(在这里,是主题branch)的这个head开始匹配所有不包含在base branch中的commits,然后自动视作你的主题branch相对于base所增加的新特性,放进同一个PullRequest中提交。

Step 5:PullRequest发送之后……

一旦你从自己的主题branch(例如fix-unicode-error)推送了一条PullRequest,那么在这条PullRequest被关闭之前,再次向这个branch里push代码,所有的commits都会被自动追加到这个PullRequest后面(不需要再另开PullRequest)。

这个功能尤其有用,比如你最初提交的PullRequest里存在某些问题,项目维护者要求你打回去修改;或者要求你给你的新feature添加一条相应的unit test(这种情况简直太常见了)。只要追加commits到你的这个主题branch中即可。

(题外话:如果原项目有Travis CI,那么它也会在每次追加push之后对PullRequest重新执行一遍测试)

*(针对项目维护者)cherry-pickformat-patcham

这几条命令主要针对项目的维护者,稍微提一下。

gitpullgit mergeGitHub上最常用的mergePullRequests的方式,在命令行下merge之后,GitHub上面的PullRequest也会相应地自动关闭。

如果贡献者一次提交了多条commits,有些是维护者并不想要的,可以用这几条命令来选择性地手动commit。(这也适用于某些项目不是借助于GitHubPullRequest,而是通过邮件列表和patch文件来进行协作开发的情形)

在这种情况下,GitHub上面的PullRequest并不能自动关闭,需要维护者手工操作。

Step 6:PullRequest关闭之后

如果是已经被merge后关闭的PullRequest,你可以在页面的最下方找到一个“Delete this branch”的蓝色按钮。

这表明这个主题branch的历史使命已经完成(fix-unicode-error的commit已经被合并到主项目中),可以安全地从远程库中删除了。

在本地库中亦可删除这个branch:

$ git branch -d fix-unicode-error

反之,如果你的主题branch并没有被merge就被维护者关掉的话,你还可以继续再拿它来开新的PullRequest去骚扰主项目(�0�7▽‘ )。

总结

在哪些情况下可以直接使用master branch来提交PullRequest

  • 你只想为主项目贡献某一处代码,贡献完自己的repo就可以扔的那种。
  • 你打算为主项目长期贡献代码,而且希望追随原项目的主线开发,不保留自己的特性。
  • 你打算为主项目长期贡献代码,默认master branch追随原项目主线,把自己的特性放到别的branch中。

在哪种情况下应该使用主题branch来提交PullRequest

  • 想用master branch完全来做自己的开发。在这种情形下:
    • 会从上游库合并更新,但是这些merge本身的commits显然不可能作为返还到上游库的PullRequest的一部分。
    • 存在自己的(未被merge或者不想被merge到上游库的)commits。

鉴于Git的分布式开发哲学,每一个库均可以看作是一个独立的项目,显然是后一种(为每一个新特性建立一个专门的主题branch来向主项目推送PullRequest)的贡献方式更可取。

### 如何在 GitHub 上查找并下载开源项目GitHub 上查找并下载开源项目是一项常见需求,尤其对于开发者来说,GitHub 提供了丰富的开源资源和协作平台。以下是一些关键步骤和技巧,帮助高效地完成这一任务。 #### 使用 GitHub 的搜索功能 GitHub 提供了强大的搜索功能,可以通过关键词、语言、项目类型等条件筛选项目。例如,可以使用 `topic:python` 来查找所有与 Python 相关的项目,或使用 `stars:>=1000` 来查找至少有 1000 个星标的项目。这些筛选条件可以帮助快速定位高质量的开源项目[^2]。 #### 查看项目页面 进入项目页面后,通常会看到项目的 README 文件,它通常包含项目的简介、安装说明和使用方法。确保阅读这些内容,以便更好地了解项目的结构和功能。 #### 下载开源项目 GitHub 提供了多种方式来下载开源项目。最简单的方式是点击项目页面上的 "Code" 按钮,然后选择 "Download ZIP",这将直接下载项目的源代码压缩包。此外,也可以通过 Git 命令行工具克隆项目到本地: ```bash git clone https://github.com/username/repository.git ``` 这种方式适合需要频繁更新代码的项目,因为可以通过 `git pull` 命令轻松获取最新的代码更新。 #### 使用 GitHub 的高级功能 GitHub 不仅提供公开的开源仓库,还支持私有仓库和企业版实例。对于企业用户,可以购买 GitHub 的私有仓库服务,以便在内部团队中共享代码。虽然这些私有仓库无法充分利用 GitHub 的网络效应,但它们仍然可以利用 GitHub 的协作功能。 #### 参与开源项目 如果希望为开源项目做出贡献,可以通过提交 issue 或 pull request 的方式参与。提交 issue 可以报告项目中的问题或提出新功能的建议,而 pull request 则可以提交自己的代码修改,供项目维护者审核和合并。 #### 开源项目的法律与合规问题 随着开源代码在各行业中的广泛应用,一些开源项目已经变得 "big business",围绕开源的法律和合规问题也日益受到关注。例如,中国首次对 GPL 3.0 协议的法律效力作出判决,以及甲骨文与谷歌之间的版权侵权案件达成和解,这些事件表明软件行业对开源法律和合规问题的关注度正在不断提高[^3]。 ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值