github:向现有的pull请求添加提交

时间:2012-04-13 19:53:09

标签: git github pull-request

我使用 Fork&amp ;;在github上向rails repo打开了拉取请求。编辑此文件文件按钮。

现在, 在得到关于我的PR的反馈之后,我想添加一些更多的提交。所以这就是我做的结束

$ git clone git@github.com:gaurish/rails.git #my forked repo
$ git rebase -i 785a2e5 #commit hash of my commit using which PR was opened
$ git checkout patch-3 #branch name I had to send my commits under to be shown in that PR
$ git commit -am "Changes done as per feedback"
$ git push origin patch-3

这很好但是看起来非常复杂的工作流程。也许我错了,这里错了?

我的问题是: 我这样做是正确的吗?如果没有,那么这样做的正确方法是什么?

4 个答案:

答案 0 :(得分:53)

由于您正在使用GitHub的工具而只是更改一个文件,您也可以在GitHub上browse to the file,从“树:”下拉列表中的左上角选择正确的分支(patch-3 in你的情况),现在选择“编辑此文件”。现在,您的更改将提交到此分支,并将显示在您的请求中

答案 1 :(得分:8)

我刚刚blogged关于这个话题:

我们如何更新此功能分支?合并最新的上游提交很容易,但是您希望避免创建合并提交,因为在推送到上游时不会被理解:然后您有效地重新提交上游更改,并且那些上游提交将获得新的哈希(因为他们得到了新的父母)。这一点尤为重要,因为当您将这些更新推送到您的个人github功能分支时,这些合并提交将反映在您的Github pull请求中(即使您在发出拉取请求后执行此操作)。

这就是为什么我们需要改变而不是合并:

git co devel #devel is ansible's HEAD aka "master" branch
git pull --rebase upstream devel
git co user-non-unique
git rebase devel

对git的rebase选项和rebase命令都会保持树的清洁,并避免进行合并提交。 但请记住,这些是您的第一次提交(与您发出第一次拉取请求)正在被重新绑定,现在有一个新的提交哈希,这与仍在您的远程github repo分支中的原始哈希不同。

现在,将这些更新推送到您的个人Github功能分支将在这里失败,因为两个分支不同:本地分支树和远程分支树“不同步”,因为这些不同的提交哈希值。 Git会告诉你第一个git pull --rebase,然后再次推送,但这不会是一个简单的快进,因为你的历史被重写了。不要那样做!

这里的问题是你会再次获取你最初的更改提交,这些提交将在你的本地分支上合并。由于不同步状态,此拉力不适用。您将获得一个b0rken历史记录,其中您的提交出现两次。当您将所有这些推送到您的github功能分支时,这些更改将反映在原始的pull请求上,这将变得非常非常难看。

AFAIK,实际上没有完全清洁的解决方案。我找到的最佳解决方案是强制将您的本地分支推送到您的github分支(实际上强制进行非快速更新):

根据git-push(1):

Update the origin repository’s remote branch with local branch, allowing non-fast-forward updates. This can leave unreferenced commits dangling in the origin repository.

所以不要拉,只需像这样强行推动:

git push svg +user-non-unique

或:

git push svg user-non-unique --force

这实际上会明显覆盖您的远程分支,其中包含您本地分支中的所有内容。远程流中的提交(并导致失败)将保留在那里,但将是悬空提交,最终将被git-gc(1)删除。没什么大不了的。

正如我所说,这是AFAICS最干净的解决方案。这样做的缺点是,您的PR将使用最新的提交进行更新,这些提交将在以后的日期进行,并且可能在PR的评论历史中显示为不同步。没什么大问题,但可能会让人感到困惑。

答案 2 :(得分:4)

您还可以创建一个新的拉取请求,该请求绑定到master而不是特定的abc1234版本。

这样,任何对您的存储库的新提交/推送都将被添加到拉取请求中。

答案 3 :(得分:3)

是的-您要做的工作远远超出您的需要。只需再进行一次提交,然后强行推送即可。在浏览器中刷新github时,您将看到原始提交以及新提交的提交。

$ git commit -m "These changes are in response to PR comments"
$ git push -f origin HEAD