如何进行GitHub的拉取请求

297

我如何创建并/或向托管在GitHub上的另一个代码库发送拉取请求?


2
这个问题在 GitHub 帮助页面 中已经有足够的解释了,不是吗? - lanzz
27
不,帮助页面并不包括一些我在第一次提交拉取请求之前希望知道的有用提示(请参见下文)。 - VonC
10
@ianzz 当然,Github页面已经“足够”,但是学习的方法有很多。我努力做的是制作一个初学者级别的教程。我发现Github的解释不足的地方在于:1)它没有集中在一个来源上(两个页面没有明确的链接),2)不够简明扼要(那些页面很长,长=压倒性),3)关键部分没有用人类语言解释清楚。在教学中,更有经验的老师总是难以知道初学者不知道什么。把自己放在初学者的角度上是我写这篇文章的目的。 - tim peterson
12
长期的学习可能会让人感到难以承受,从而导致放弃学习。人们可以通过很多途径来理解所涉及的过程,但显然其中之一不是长时间的学习。为了结束争论,无需回复,我理解你的立场。 - tim peterson
8
你需要从自己的 fork 中发起一个拉取请求。这明显不是我的最初假设。 - Derek Illchuk
显示剩余2条评论
9个回答

244

除了官方的 "GitHub帮助“使用拉取请求”页面",
还可以参考 "在GitHub中分叉与分支的区别", "在GitHub中origin和upstream的区别是什么"。

关于拉取请求的几个提示:

假设您已经分叉了一个仓库,那么您应该在您拥有的这个分叉中执行以下操作:

  • 创建分支:在分支中隔离您的修改。不要从master创建拉取请求,这样您可能会被诱惑积累和混合多个修改。
  • 在该分支上进行变基:即使您已经从该分支创建了拉取请求,也要将其变基于origin/master(确保您的补丁仍然有效),这将自动更新拉取请求(无需单击任何内容)。
  • 更新该分支:如果您的拉取请求被拒绝,您只需添加新的提交,或者完全重做您的历史记录:它将再次激活您现有的拉取请求。
  • “聚焦”该分支:即使其主题“紧凑”,也不要修改成千上万的类和整个应用程序,只需添加或修复一个明确定义的功能,保持更改小
  • 删除该分支:一旦被接受,您可以安全地在您的分支上删除该分支(和git remote prune origin)。 GitHub GUI将为您提供在拉取请求页面中删除您的分支。
注意:要编写拉取请求本身,请参见“如何编写完美的拉取请求”(2015年1月,GitHub)。

2016年3月:新增PR合并按钮选项:请参见 "Github squash commits from web interface on pull request after review comments?".

squash

仓库的维护者可以选择使用merge --squash合并这些PR提交记录。


拉取请求处理后

关于最后一点,自2013年4月10日起,“重新设计的合并按钮”,分支将被删除:

new merge button

删除分支在合并后也变得更加简单了。我们不再需要额外的确认步骤,当您删除分支时,我们会立即删除它,并提供一个方便的链接以便在需要时恢复分支。这证实了在合并拉取请求后删除分支的最佳实践。

pull-request与request-pull的区别


关于"reposotory"的e-notes(注:错别字)

<幽默>

那个(pull request)在GitHub上甚至都没有得到准确的定义!

幸运的是,一个真正的商业新闻机构应该知道,在这里有一份e-note以取代“pull request”

https://pbs.twimg.com/media/BT_5S-TCcAA-EF2.jpg:large

如果您的代码库需要电子笔记,请向Fox Business询问。他们知道这方面的事情。 </humour>

2
@VonC 谢谢您的回复。您能否提供一些代码来指出您所说的与我所说的有何不同?在选择 branch vs. master 时似乎是一个关键问题,这将使我的/Github的答案从理论解决方案变为实际可用的东西。 - tim peterson
1
@timpeterson这里关键的一点是,你可以完全更改该分支的历史记录,并且它会自动更新拉取请求:因为拉取请求必须在上游项目的最新版本上完成。如果那个上游仓库有新的提交,您必须将分支重新基于其之上(更改该分支的历史记录),然后将其推回到您的 fork 中:这将自动更新您的拉取请求(基于相同的分支)。 - VonC
4
我不太理解重新设置基础的部分。那有什么作用?这个页面让它听起来像是火箭科学,但我相信它其实并不是。你会在那个时候发出什么命令来“重新设置基础”呢? - Camilo Martin
1
@CamiloMartin 如果你在你的PR分支上,那么 git pull --rebase upstream/master 是可以的。 - VonC
1
@vikramvi 主分支是与您派生的原始存储库共有的一个分支。该分支应始终反映原始存储库。您可以在PR分支中隔离修复。您仅使用主分支来了解原始存储库中的内容(并在其上重新设置您的修复分支,以确保轻松合并拉取请求)。 - VonC
显示剩余12条评论

209

为了学习如何发起 pull request,我只需按照 Github 上的两个帮助页面(以下以项目符号链接)分别操作即可。下面列出的命令行命令适用于第一部分。实际发起 pull request 的第二部分则完全在 Github 网站上完成。

$ git clone https://github.com/tim-peterson/dwolla-php.git
$ cd dwolla-php
$ git remote add upstream https://github.com/Dwolla/dwolla-php.git
$ git fetch upstream
// make your changes to this newly cloned, local repo 
$ git add .
$ git commit -m '1st commit to dwolla'
$ git push origin master

4
-@alexgray,我保留了 Bash 提示符,例如 Tims-MacBook-Pro:third_party TimPeterson$,因为这是一份面向初学者的教程,这些提示可以帮助用户定位。 Translated:
  • @alexgray, 我保留了 Bash 提示符,例如 Tims-MacBook-Pro:third_party TimPeterson$,因为这是一个针对初学者的教程,这些提示有助于帮助用户方向感。
- tim peterson
1
是的。谢谢。我可以跟随的一个工作示例。为什么你没有那个 GitHub 呢? - Robert Johnstone
在执行了 git fetch upstream 之后,难道不需要使用 git checkout master 然后 git merge upstream/master 将上游的更改与本地副本合并吗? - Sparhawk
我该如何从终端正确地执行它?有没有办法在不打开浏览器的情况下使用整个git? - Himanshu Shekhar
1
@HimanshuShekhar 是的,但你需要使用Github桌面应用程序或他们的API。对我来说,浏览器更容易些。 - tim peterson
显示剩余3条评论

70
为了进行拉取请求,你需要执行以下步骤:
  1. 分叉存储库(您要提出拉取请求的存储库)。只需单击存储库页面上的分叉按钮,即可拥有一个以您的Github用户名为前缀的独立Github存储库。
  2. 克隆存储库到本地计算机。您在本地计算机上安装的Github软件可以为您完成此操作。点击存储库名称旁边的克隆按钮。
  3. 对文件进行本地更改/提交
  4. 同步更改
  5. 转到您的Github分叉存储库,单击分支按钮旁边的“比较和查看”绿色按钮。(该按钮具有图标-没有文本)
  6. 一个新页面将打开,显示您的更改,然后单击拉取请求链接,将请求发送给您分叉的存储库的原始所有者。
我花了一段时间才理解这个过程,希望这能帮助到别人。

3
在我看来不太清楚,您需要在发起 pull request 之前 fork 一个仓库。我原本以为提交的代码会进入某种公共可写分支的挂起状态,然后从那里合并过来。谢谢! - Chris Arena

17

我开始了一个帮助人们进行第一次GitHub Pull Request的项目。您可以通过在此处完成入门教程来进行实践。

操作流程如下:

  • 在GitHub上Fork该仓库
  • 单击Clone仓库按钮以获取克隆URL
  • 打开终端并运行git clone <您之前复制的克隆URL>
  • 为您要进行的更改创建一个分支git checkout -b 分支名称
  • 进行必要的更改
  • 提交您的更改git commit
  • 将您的更改推送到GitHub上的Fork仓库git push origin 分支名称
  • 转到您在GitHub上的Fork仓库,然后单击Compare and pull request按钮
  • 填写必要的详细信息,并单击提交Pull Request

17

对于我们这些拥有github.com帐户,但在命令行中键入“git”时只收到错误消息的人,以下是如何在浏览器中完成所有操作的方法 :)

  1. 按照 Tim 和 Farhan 的做法:先 fork 你自己的项目副本: 步骤1:Fork
  2. 几秒钟后,你会被重定向到你自己 fork 的项目副本: 步骤2
  3. 导航到需要更改的文件,并在工具栏中单击“编辑此文件”: 步骤3:编辑文件
  4. 编辑后,写下几个描述更改的词语,然后像往常一样提交更改到主分支(因为这只是你自己的副本,而不是“主”项目)。 步骤4:提交更改
  5. 对于所有需要编辑的文件,重复步骤3和4,然后返回到你的项目副本的根目录。在那里,单击绿色的“比较、审查...”按钮: 步骤5:开始提交
  6. 最后,单击“创建拉取请求”...然后在你检查了请求的标题和描述后再次单击“创建拉取请求”: 输入图像描述

让人们学习命令行,最终会更加高效 :) - Henrique de Sousa

4

我按照Tim Peterson的指示进行操作,但是我为我的更改创建了一个本地分支。然而,在推送后,我在GitHub上看不到新的分支。解决方法是在推送命令中添加“-u”:

git push -u origin <branch>

你有注意到上面URL中的两个用户名吗?第一个是tim-peterson,第二个是Dwolla - tim peterson
3
这更适合作为对我的答案的评论。你可能会收到一些负评。 - tim peterson

2
我编写了一个Bash程序,可以为您设置PR分支的所有工作。如果需要,它会执行fork操作,与上游同步,设置上游远程等操作,您只需要提交修改、推送并提交PR即可。
以下是运行该程序的方法:
github-make-pr-branch ssh your-github-username orig_repo_user orig_repo_name new-feature

你会在这里找到该程序,其代码库还包括一份逐步指南,以便您了解它的工作原理,以及有关如何使您的特性分支保持与上游主分支同步以及其他有用信息的额外说明。

0

最简单的GitHub Pull Request是通过Web界面而不使用git。

  1. 注册一个GitHub账户,登录后进入您想要更改的存储库页面。
  2. 点击铅笔图标,

    在位置附近搜索文本,进行任何编辑,然后预览以确认。给建议的更改添加一个长达50个字符的描述和可选的扩展描述,然后单击Propose file Change按钮。

  3. 如果您正在阅读此内容,则无法对存储库(项目文件夹)进行写入访问,因此GitHub将在您的帐户中创建存储库的副本(实际上是一个分支)。单击Create pull request按钮。

  4. 为Pull Request添加描述并添加任何评论,然后单击Create pull request按钮。

-1
2023年最好的方式显然是使用GitHub VS Code扩展,你不必再考虑这个问题了。
它会引导你完成从克隆你的分支到创建拉取请求的步骤。

只是一点小玩笑而已:当然,这也是有一定道理的,因为你不需要知道如何在命令行界面或其他地方做任何事情。 - undefined

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