github: Adding commits to existing pull request

I opened a pull request to rails repo on github by using Fork & Edit this file file button.

Now, After getting feedback on my PR, I wanted to add some more commits. so here is what I ended by doing

$ 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

This worked fine but seems quite a complex workflow. Maybe I am wrong something wrong here?

my question is: Am I doing this the correct way? if not, then what is the proper way to do this?

98109 次浏览

您还可以创建一个绑定到 master的新的 pull 请求,而不是特定的 abc1234修订版。

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

因为你正在使用 GitHub 的工具并且只改变一个文件,你也可以在 GitHub 上选择 browse to the file,从左上角的“ tree:”下拉菜单中选择合适的分支(在你的例子中是 patch-3) ,然后选择“ Edit this file”。现在,您的更改将提交到这个分支,并显示在请求中

我最近在 博客上谈到了这个话题:

我们如何使这个特性分支保持最新?合并最新的上游提交是很容易的,但是你要避免创建合并提交,因为当被推到上游的时候不会被欣赏: 然后你有效地重新提交上游更改,那些上游提交将得到一个新的散列(当他们得到一个新的父)。这一点尤其重要,因为当您将这些更新推送到您的个人 GitHub 功能分支时,这些合并的提交将反映在您的 GitHub pull 请求中(即使您在发出 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

Rebase 选项和 rebase 命令都可以保持树的整洁,避免合并提交。 但是请记住,这些是第一次提交(您发出的第一个 pull 请求) ,它们正在重新定位,并且现在有一个新的提交散列,它不同于仍然存在于您的远程 github repo 分支中的原始散列。

Now, pushing those updates out to your personal GitHub feature branch will fail here, as both branches differ: the local branch tree and the remote branch tree are “out of sync”, because of those different commit hashes. Git will tell you to first git pull --rebase, then push again, but this won’t be a simple fast-forward push, as your history got rewritten. Don’t do that!

这里的问题是,您将再次获取第一次更改后的提交,并且这些提交将在本地分支上进行合并。由于处于不同步状态,这个提取不能完全应用。您将得到一个错误的历史记录,其中您的提交出现了两次。当您将所有这些都推送到您的 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

or:

git push svg user-non-unique --force

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

如我所说,这是 AFAICS 最干净的解决方案。这样做的缺点是,您的公关将更新与这些最新的提交,这将得到一个较晚的日期,并可能出现在评论的历史不同步的公关。没什么大问题,但可能会让人感到困惑。

是的,你做的工作比你需要做的多得多。只要做一个额外的提交,然后强制推送它。在浏览器中刷新 github 时,您将看到原始提交和新推出的提交。

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

I was able to add more commits to an existing pull request by following these steps:

  1. 将最新的提交推送到特性分支
  2. 在 GitHub 中,转到功能分支并单击“ New Pull Request”
  3. 您应该能够在下面的屏幕中看到以前打开的 pull 请求。现在点击“查看拉请求”: enter image description here
  4. 您的最新提交应该添加到您现有的拉请求。如果需要,请留下评论