Cur*_*ind 81 git github pull-request
我通过使用Fork&Edit此文件文件按钮在github上向rails repo 打开了一个pull请求.
现在,在获得有关我的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
Run Code Online (Sandbox Code Playgroud)
这很好,但似乎是一个非常复杂的工作流程.也许我错了,这里错了?
我的问题是:我这样做是正确的吗?如果没有,那么这样做的正确方法是什么?
For*_*est 12
是的 - 你做的工作比你需要的多得多。只需进行额外的提交,然后强制推送它。当您在浏览器中刷新 github 时,您将看到原始提交以及新推送的提交。
$ git commit -m "These changes are in response to PR comments"
$ git push -f origin HEAD
Run Code Online (Sandbox Code Playgroud)
我刚刚在这个主题上写了博客:
我们如何保持此功能分支最新?合并最新的上游提交很容易,但是您希望避免创建合并提交,因为在推送到上游时不会被理解:然后您有效地重新提交上游更改,并且那些上游提交将获得新的哈希(因为他们得到了新的父母).这一点尤其重要,因为当您将这些更新推送到您的个人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
Run Code Online (Sandbox Code Playgroud)
对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.
Run Code Online (Sandbox Code Playgroud)
所以不要拉,只需像这样强制推动:
git push svg +user-non-unique
Run Code Online (Sandbox Code Playgroud)
要么:
git push svg user-non-unique --force
Run Code Online (Sandbox Code Playgroud)
这实际上会明确地覆盖您的远程分支,其中包含您本地分支中的所有内容.远程流中的提交(并导致失败)将保留在那里,但将是悬空提交,最终将被git-gc(1)删除.没什么大不了.
正如我所说,这是AFAICS最干净的解决方案.这样做的缺点是,您的PR将使用最新的提交进行更新,这些提交将在以后的日期进行,并且可能在PR的评论历史中显示为不同步.没什么大问题,但可能会让人感到困惑.
| 归档时间: |
|
| 查看次数: |
40617 次 |
| 最近记录: |