如何执行GitHub拉取请求


283

如何创建拉取请求和/或将拉取请求发送到托管在GitHub上的另一个存储库?


2
GitHub帮助页面中的解释不够吗?
lanzz

27
@lanzz不,帮助页面没有包含一些有用的提示,我希望在执行我的第一个请求请求之前就知道这些提示(请参见下文)。
VonC

9
@ianzz当然Github的页面“足够”,但是有很多学习方法。我努力做到的是制作一个初学者级的教程。我发现在Github的解释中缺少的是:1)它没有包含在一个来源中(两个页面没有明确链接),2)不够简洁(这些页面很长,很长=压倒性),3)是在关键部分没有用人为解释。在教学中,经验丰富的老师总是很难知道初学者不知道的内容。我写这篇文章的目的是使自己陷入初学者的困境。
蒂姆·彼得森

12
长的可能意味着不堪重负,这可能意味着中止= 没有学习。人们可以通过许多途径“最终了解所涉及的过程”,而这些途径显然不是其中之一。结束火焰战争,无需回复,我知道您来自哪里。
蒂姆·彼得森

8
您从自己的叉子发出拉动请求。那绝对不是我最初的假设。
Derek Illchuk

Answers:


236

(除了官方的“ GitHub帮助'使用拉取请求'页面 ”外,
另请参阅“ GitHub的分支与分支 ”,“ GitHub的源和上游有什么区别 ”)

关于拉取请求的几个技巧:

假设您首先创建了一个仓库,这是您拥有的那个分支中应该做的事情:

  • 创建分支:将您的修改隔离在分支中。不要从中创建提取请求master,因为您可能会试图一次累积并混合多个修改。
  • 使该分支变基:即使您已经从该分支发出了拉取请求,也将其重新建立在origin/master(确保您的补丁仍在工作)会自动更新拉取请求(无需单击任何内容)
  • 更新该分支:如果您的拉取请求被拒绝,您只需添加新的提交,和/或完全重做您的历史记录:它将再次激活您现有的拉取请求。
  • “关注”该分支:即,使其主题“紧凑”,不要修改成千上万的类和全部应用程序,仅添加或修复定义良好的功能,使更改保持较小
  • 删除该分支:一旦被接受,您就可以安全地删除分支上的该分支(并且git remote prune origin)。GitHub GUI将建议您在拉取请求页面中删除分支。

注意:要编写 Pull-Request本身,请参阅“ 如何编写完美的Pull Request ”(2015年1月,GitHub)


2016年3月:新的PR合并按钮选项:请参阅“ Github squash在评论评论后通过Web界面在请求请求上提交? ”。

壁球

回购的维护者可以选择merge --squash那些PR提交。


拉取请求后

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

新合并按钮

合并后删除分支也得到了简化。
无需执行额外的步骤来确认删除,我们会在删除分支后立即删除该分支,并提供方便的链接来在您再次需要该分支时还原该分支

这证实了合并合并请求后删除分支的最佳实践。


拉请求与请求拉


“存储库”的电子注释(原文如此)

<humour>

GitHub甚至没有正确定义(拉取请求)!

幸运的是,一个真正的商业新闻机构会知道的,并且有一个电子注释,目的是用“电子注释”代替拉动替换

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

所以,如果你的回购Ø保守党需要一个电子笔记... 问问福克斯商业。他们知道。

</humour>


2
-@ VonC对此表示感谢。您介意提供一些代码来指出您所说的与我所说的有何不同吗?在branchmaster决定似乎是一个关键的一年抢了我的/ GitHub的答案从理论解决一些人会真正使用。
蒂姆·彼得森

1
@timpeterson您可以完全更改该分支内的历史记录,并且它将自动更新拉取请求的事实在这里很关键:因为拉取请求必须在最新的上游项目上完成。如果该上游仓库具有新的提交,则必须在其基础上重新建立分支(更改该分支的历史记录),然后将其推回分叉:这将自动更新您的拉取请求(基于同一分支)。
VonC

4
我不了解变基部分。那是做什么的?(此页面听起来像火箭科学,但我相信不是)。此时,您会发出什么命令来“变基”?
卡米洛·马丁

1
@CamiloMartin如果您在PR分支中,则git pull --rebase upstream/master确实可以。
VonC

1
@vikramvi master是与您分叉的原始存储库相同的分支。该分支应始终反映原始存储库。您将修复隔离在PR的一个分支中。您仅将master用作了解原始存储库中内容的方法(并在其基础上重新构建fix分支,以确保轻松进行请求合并)
VonC

202

为了学习如何发出拉取请求,我在Github上跟踪了两个单独的帮助页面(下面链接为要点)。以下命令行命令适用于第1部分第2部分(实际的拉取请求)完全在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
  • 第1部分:分叉某人的仓库:https : //help.github.com/articles/fork-a-repo

    1. 在您想要贡献的仓库中,单击“ fork”按钮,在这种情况下:Dwolla的PHP仓库仓库中仓库(Dwolla / dwolla-php)
    2. 在这种情况下,获取您新创建的fork的URL:https : //github.com/tim-peterson/dwolla-php.git(tim-peterson / dwolla-php)
    3. 键入git clone->cd dwolla-php->git remote->git fetch上面的序列以在您的计算机中的某个地方克隆您的fork(例如,将其“复制/粘贴”到):third_party TimPeterson$),并将其与主仓库同步(Dwolla / dwolla-php)
    4. 对本地仓库进行更改
    5. 输入git add->git commit->git push上面的序列将您的更改推送到远程存储库,即您在Github上的fork(tim-peterson / dwolla-php)
  • 第2部分:进行拉取请求:https : //help.github.com/articles/using-pull-requests

    1. 转到Github上的分叉网页(https://github.com/tim-peterson/dwolla-php
    2. 点击“拉取请求”按钮
    3. 为请求请求命名,填写所做更改的详细信息,然后单击提交按钮。
    4. 你完成了!!

4
-@ alexgray,我留下了bash提示,例如,Tims-MacBook-Pro:third_party TimPeterson$因为这是初学者的教程,并且这些提示有助于定向用户。
蒂姆·彼得森2013年

1
是。谢谢。我可以遵循的一个工作示例。您为什么没有那个git hub?
Sevenearths,2015年

之后git fetch upstream,您是否不需要使用git checkout masterthen 将上游更改与本地副本合并git merge upstream/master
Sparhawk

@Sparhawk不,您不需要将更改合并到驻留在fork中的master中。向另一个仓库的拉取请求可以完全基于分支。但是,对您而言,通常也最好在升级时也更新fork的主服务器,以使更改为“真实”存储库,并经常将其带回分叉存储库的循环中。
2016年

1
@HimanshuShekhar是的,但是您需要使用github桌面应用程序或它们的API。浏览器对我来说更容易。
蒂姆·彼得森

70

为了发出拉取请求,您需要执行以下步骤:

  1. 分叉一个存储库(您要向其发出拉取请求)。只需单击存储库页面上的fork按钮,您将拥有一个单独的github存储库,并带有您的github用户名。
  2. 将存储库克隆到本地计算机。您在本地计算机上安装的Github软件可以为您完成此任务。单击存储库名称旁边的克隆按钮。
  3. 对文件进行本地更改/提交
  4. 同步更改
  5. 转到您的github分叉存储库,然后单击分支按钮旁边的“比较并查看”绿色按钮。(该按钮带有图标-无文字)
  6. 将打开一个新页面,显示您的更改,然后单击“拉取请求”链接,该请求会将请求发送到您分叉的存储库的原始所有者。

我花了一段时间才弄清楚这一点,希望对您有所帮助。


3
对我来说还不清楚,您需要先发出回购协议,然后才能发出请求请求。我认为推送的提交只会进入具有公共写访问权的某种挂起分支,然后从那里合并。谢谢!
克里斯·

16

我已经启动了一个项目,以帮助人们提出他们的第一个GitHub拉取请求。您可以在这里进行动手教程,以进行首次公关

工作流程很简单

  • 在github中分叉仓库
  • 通过单击克隆回购按钮获取克隆URL
  • 转到终端并运行 git clone <clone url you copied earlier>
  • 为要进行的更改创建分支 git checkout -b branch-name
  • 进行必要的更改
  • 提交您的更改 git commit
  • 将更改推送到GitHub上的fork git push origin branch-name
  • 转到GitHub上的fork看到一个Compare and pull request按钮
  • 单击它并提供必要的详细信息

15

对于拥有github.com帐户但只在命令行中输入“ git”时收到讨厌的错误消息的我们来说,这是在浏览器中完成所有操作的方法:)

  1. 就像Tim和Farhan写道:分叉您自己的项目副本: 步骤1:叉
  2. 几秒钟后,您将被重定向到您自己的项目分叉副本: 第2步
  3. 导航到您需要更改的文件,然后在工具栏中单击“编辑此文件”: 步骤3:编辑档案
  4. 编辑后,先写几句话描述更改,然后再写“提交更改”,就像对master分支一样(因为这只是您自己的副本,而不是“ main”项目)。 步骤4:提交变更
  5. 对您需要编辑的所有文件重复步骤3和4,然后返回到项目副本的根目录。在此处,点击绿色的“比较,查看...”按钮: 步骤5:开始提交
  6. 最后,在仔细检查了请求的标题和描述之后,单击“创建请求请求” ..然后再次 “创建请求请求” : 在此处输入图片说明

3

我按照tim peterson的指示进行操作,但是我为更改创建了一个本地分支。但是,在推送之后,我没有在GitHub中看到新分支。解决的办法是在推命令中添加-u:

git push -u origin <branch>

您是否注意到上面网址中的2个用户名?首先是tim-peterson第二个是Dwolla
蒂姆·彼得森

3
另外,最好将其作为对我的回答的评论。您可能会得到一些赞成票。
蒂姆·彼得森2013年

1

我写了一个bash程序,它为您完成了建立PR分支的所有工作。它会在需要时执行派生,与上游同步,设置上游远程设备等,您只需要提交您的修改,推送并提交PR。

这是您的运行方式:

github-make-pr-branch ssh your-github-username orig_repo_user orig_repo_name new-feature

您可以在此处找到该程序,如果您想了解它的工作原理,它的存储库还包括一个逐步执行手动操作的分步指南,以及有关如何使功能分支保持最新状态的其他信息。与上游主人和其他有用的花絮约会。


0

最简单的GitHub拉请求从Web界面,而不使用Git。

  1. 注册GitHub帐户,登录,然后转到要更改的存储库中的页面。
  2. 点击铅笔图标,

    在位置附近搜索文字,进行所需的任何编辑,然后预览以确认。为建议的更改提供最多50个字符的描述以及可选的扩展描述,然后单击“ 提议文件更改”按钮。

  3. 如果您正在阅读本文,那么您将无权访问存储库(项目文件夹),因此GitHub将在您的帐户中创建存储库的副本(实际上是分支)。单击创建请求请求按钮。

  4. 提供请求请求的描述并添加任何注释,然后单击创建请求请求按钮。
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.