github:添加提交到现有的拉取请求
我使用Fork&Edit这个文件文件button,在github上打开了一个pull请求到rails repo。
现在,在获得我的公关反馈后,我想添加更多的提交。 所以这里是我最后做的
$ 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
这工作得很好,但似乎相当复杂的工作stream程。 也许我在这里错了什么错?
我的问题是:我正确的做法吗? 如果没有,那么这样做的正确方法是什么?
由于您使用的是GitHub的工具,只需更改一个文件,您也可以浏览 GitHub上的文件 ,从左上angular的“tree:”下拉列表中select正确的分支(在您的案例中为patch-3
),现在select“编辑这个文件”。 现在你的改变将会被提交给这个分支,并且会在你的请求中显示出来
我刚刚在这个话题上发表了博文 :
我们如何保持这个function分支是最新的? 合并最新的上游提交是很容易的,但是你想避免创build一个合并提交,因为当推到上游时,你不会理解:然后你有效地重新提交上游改变,那些上游提交将得到一个新的哈希因为他们得到一个新的父母)。 这一点尤其重要,因为当你将这些更新推送到你的个人githubfunction分支时(即使你在发出pull请求之后这样做),那些合并的提交将反映在你的Github请求中。
这就是为什么我们需要重新组合而不是合并:
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回购分支中原有的哈希不同。
现在,将这些更新推送到您的个人Githubfunction分支将会失败,因为两个分支都不同:由于这些不同的提交散列,本地分支树和远程分支树“不同步”。 Git会告诉你先把git拉–rebase,然后再推,但这不会是一个简单的快进推,因为你的历史被重写了。 不要这样做!
这里的问题是,你将再次获取你的第一个改变的提交,因为他们最初,那些将被合并到本地分支之上。 由于不同步状态,这个拉不适用。 你会得到一个b0rken历史,你的提交出现两次。 当你把所有这些都推送到你的githubfunction分支时,这些更改将会反映到原来的pull请求上,这会变得非常非常难看。
AFAIK,实际上没有完全清洁的解决scheme。 我发现最好的解决scheme是强制推送你的本地分支到你的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
这实际上将覆盖您的远程分支,与本地分支的一切。 在远程stream中(并导致失败)的提交将保持在那里,但将是悬而未决的提交,最终将被git-gc(1)删除。 没什么大不了。
正如我所说,这是AFAICS最干净的解决scheme。 这样做的缺点是,你的公关将被更新为最新的提交,这将获得更晚的date,并可能在公关的评论历史中出现不同步。 没有什么大问题,但可能会造成混乱。
你也可以创build一个绑定到master
的新的pull请求,而不是一个特定的abc1234
版本。
这样,任何新的提交/推送到您的存储库将被添加到拉请求。