如何从派生仓库更新拉取请求?

672

所以我首先fork了一个仓库,然后对该forked 仓库进行了提交。随后我打开了一个pull request,该请求列出了我想要进行的所有更改。

在审查我的pull request之后,仓库所有者希望我在接受之前进行一些修改。我已经在我的fork中进行了这些更改,现在我该如何使用这些更改更新pull request(或者这不是我应该处理它的方式)?


7
可能是在代码审核后更新拉取请求的首选Github工作流程的重复问题。 - Paul Draper
11
@PaulDraper我不同意,该用户已经知道并呈现了各种更新拉取请求的方法,并询问哪种方法最好。相反,我不知道任何方法,正在询问它们的存在。正如这个问题的受欢迎程度所显示的那样,这也是许多其他用户的情况。 - stevebot
6
我认为其受欢迎的原因是因为(1)这是一个非常好的常见问题,(2)一些用户误打误撞地到了这里。如果一开始就被识别为重复问题,他们就会找到其他相同的问题并回答他们的问题。 - Paul Draper
5个回答

659

你做得很正确。拉取请求将自动更新。步骤如下:

  1. 打开拉取请求
  2. 根据本地仓库中的反馈提交更改
  3. 推送到您的派生分支的相关分支

拉取请求将自动将新提交添加到PR的“提交”选项卡中。


81
好的!我到处都找了一遍,但是没有找到实际的拉取请求。这简直像魔法一样神奇,我不会质疑它。 - stevebot
61
在分支上工作是一个很好的理由。比如,如果你总是向主分支推送代码,可能会无意中向之前的拉取请求中添加代码。 - Brian Pan
4
尽管过去曾经是这样,但现在似乎不是了。这里有一个我提交的拉取请求的例子(https://github.com/toopay/bootstrap-markdown/pull/167),与分支本身(https://github.com/mhuggins/bootstrap-markdown/commits/support-all-markdown-libraries)进行比较。由于流程似乎已经改变了,所以不再确定如何做到这一点。 - Matt Huggins
1
GitHub实际上告诉你:“通过将提交推送到ChangeTheWorldProject的SolveWorldHunger分支来添加更多提交。” - flow2k
1
确实看起来像是一个 bug,而且只偶尔发生。我尝试推送一个空提交以强制 GH 更新我的 PR,但什么也没发生。我已向 GitHub 工作人员报告了此问题。 - krassowski
显示剩余5条评论

83

在GitHub上更新拉取请求就像将所需更改提交到使用拉取请求的现有分支一样简单,但通常也希望将更改压缩为一个提交:

更新 GitHub 拉取请求很容易:只需将所需更改提交到已用于拉取请求的现有分支即可。但是通常还需要把这些更改压缩成单个提交:

git checkout yourbranch
git rebase -i origin/master

# Edit command names accordingly
  pick   1fc6c95 My pull request
  squash 6b2481b Hack hack - will be discarded
  squash dd1475d Also discarded

git push -f origin yourbranch

...现在拉取请求只包含一个提交。


关于变基的相关链接:


2
点赞提到rebase。它有助于削减修订历史中的噪音。 - stevebot
+11(是的,我故意打了那么多个“r”)。使用git rebase/pick/squash非常好用。 - WestCoastProjects
13
这种方法的缺点是你要移除之前的提交记录。这意味着如果在拉取请求中留下了评论,它们将会消失,连同原来的提交记录一起丢失。 - blowekamp
在Bitbucket中,您可以在拉取请求的文件的“以前版本”上看到评论。虽然如果能像Gerrit一样看到补丁提交并可以查看带有注释的整个历史记录会很好。当您可以回溯并查看任何提交周围的完整讨论时,它可以为一个整洁的git历史和可追溯性做出贡献。 - Love

39
只需推送到拉取请求所引用的分支。只要拉取请求仍然处于打开状态,它就应该会自动更新任何添加的提交。

16

我是按照以下步骤完成的:

  1. git reset --hard <拉取请求的提交关键字>
  2. 进行了我想要做的代码更改
  3. git add
  4. git commit --amend
  5. git push -f origin <拉取请求的远程分支名称>

1
非常好,我更喜欢这种方法!GitHub甚至会隐藏(但保留)过时的代码部分和相关注释。需要记住的是,如果拉取请求包含多个提交,并且需要修复的提交不在分支的末尾,“git reset --hard”将放弃指定ID之后提交的所有更改。我有一个手动应用的备份。如果有多个额外的提交,这样做并不是很方便... - Nagev

3
如果在Windows上使用GitHub:
  1. 本地进行更改。
  2. 打开GitHub,切换到本地存储库,双击存储库。
  3. 将分支(窗口顶部附近)切换到您创建拉取请求的分支(即比较中您的分支所在的fork端的分支)
  4. 右侧应该看到输入提交注释并将更改提交到本地repo的选项。
  5. 点击顶部的同步按钮,其中包括将您的提交从本地推送到GitHub上的远程fork等操作。
  6. 拉取请求将自动更新为具有额外提交。这是因为拉取请求表示与您的fork分支的差异。如果转到拉取请求页面(您和其他人可以在其中对您的拉取请求发表评论的页面),则Commits选项卡应该有您的其他提交。
这就是为什么在开始自己的更改之前,您应该为计划放入拉取请求的每组更改创建一个分支的原因。这样,一旦您发出拉取请求,就可以创建另一个分支,并继续处理其他任务/功能/错误修复,而不会影响以前的拉取请求。

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