如何在同一个repo上提交两个pull请求而不重做所有提交?

时间:2014-11-08 19:16:26

标签: git github

我为智能列表做了this pull request。它被接受了,我继续我的发展。现在我正在尝试提交新的更改,我的第一个拉取请求中的所有更改都会再次出现在新的请求中,您可以看到here

我试图拉动原始回购,获取它或者改变它并没有帮助。我遵循this question中给出的建议。

它标志着“这个分支在Sology:master之前提交了27个提交”。但自从我的第一次更改被接受后,我只做了4次提交。

我该怎么办?

1 个答案:

答案 0 :(得分:2)

这是因为上游repo的维护者将你的第一个pull请求压缩成一个新的提交,而你继续在“unsquashed branch”上进行开发。打开您的回购历史记录(例如使用gitk)并继续阅读。

最初的情况是这样的:

* 970f363 (your repo) Add spec for #smart_listing   <-- last commit in your first pull request
* 098fcfe Add specs for #smart_listing_create
(more of your commits)
* 721817f Ignore some files
* 89e24b6 (upstream repo) Add missing update_list event   <-- tip of origin/master back then 
* a084fb9 Fix handling unlimited per page
(...)

ljachymczyk将所有提交压缩为一个新提交,然后将其添加到上游存储库中:

* 61cad2d (upstream repo) Feature spec    <-- your work squashed into single commit
| * 970f363 (your repo) Add spec for #smart_listing    <-- last commit in your first pull request
| * 098fcfe Add specs for #smart_listing_create
| (...)
| * 721817f Ignore some files
|/  
* 89e24b6 Add missing update_list event
* a084fb9 Fix handling unlimited per page
(...)

现在,你必须明白Git没有看到单个新提交(61cad2d)和整个分支(721817f..970f363)之间的任何连接。即使单个提交引入了与之前20次提交相同的更改,对于Git,这些也是无关的更改。 (并且有充分的理由。)

然后你继续在你的仓库中工作,向那个旧分支添加新的提交:

* 61cad2d (upstream repo) Feature spec
| * 0b14747 (your repo) Refactor #smart_listing_create   <-- your new stuff
| * e49c522 Use the controller name by default
| * a1c1a92 Remove the spec directory in dummy app
| * 4128104 Remove gems from Gemfile and add it in gemspec
| * 970f363 Add spec for #smart_listing               <-- your old stuff
| * 098fcfe Add specs for #smart_listing_create
| (...)
| * 721817f Ignore some files
|/  
* 89e24b6 Add missing update_list event
* a084fb9 Fix handling unlimited per page
(...)

正如您所看到的,所有这些旧提交在上游回购中仍然不存在 - 这就是它们出现在pull请求中的原因。合并,也不“正常”的改变都不会改变这一点。

您的新提交应该是在61cad2d(压扁提交)之上创建的,而不是在旧分支之上。因此,现在你需要将它们移植到那里。假设单个压缩提交(61cad2d)与您的旧分支完全等效(即git diff 970f363 61cad2d未显示任何更改),这很容易。在这种情况下,只需做

git branch newstuff 0b14747
git rebase --onto 61cad2d 970f363 newstuff

你应该得到一个newstuff分支,其中有四个基于压缩提交的新提交。

请注意,如果970f36361cad2d不相等,则可能必须解决合并冲突。这将说明重新定位和压缩已发布的提交是如何导致问题的。