2015-07-21 147 views
4

有没有什么办法可以自动重定位合并提交的数量?另一个问题Rebasing a Git merge commit的答案建议使用--preserve-merges,但这也会使非合并提交变得更加复杂。Rebase/Replay仅合并提交

当将功能分支合并到主或集成分支中,然后发现别人刚推送更改时,不需要此行为。此外,能够将开发分支重新绑定到新的主提交上,或者从开发中删除不打算使用的修补程序是很有用的。

例如,假设以下情况:

* 7909b1a (origin/master) Merge bug/456 
|\ 
| * f9d43b6 (origin/bug/456) 456 - Change color 
|/ 
| * 32666f3 (HEAD, master) Merge branch 'bug/123' 
| |\ 
|//
| * 0939652 (origin/bug/123, bug/123) 123 - Fix Spelling 
|/ 
o 96c9aa9 (tag: v1.1.1) 

如果我运行git rebase --preserve-merges origin/master时,将导致以下情况:

* (HEAD, master) Merge branch 'bug/123' 
|\ 
| * 8e6ccbe 123 - Fix Spelling 
|/ 
* 7909b1a (origin/master) Merge bug/456 
|\ 
| * f9d43b6 (origin/bug/456) 456 - Change color 
|/ 
| * 32666f3 (ORIG_HEAD) Merge branch 'bug/123' 
| |\ 
|//
| * 0939652 (origin/bug/123, bug/123) 123 - Fix Spelling 
|/ 
o 96c9aa9 (tag: v1.1.1) 

这是不可取的,因为犯0939652正在重做,但它已经被推到公共仓库,所以它不应该被重播。我想要的结果如下:

* 710c5d7 (HEAD, master) Merge branch 'bug/123' 
|\ 
| * 0939652 (origin/bug/123, bug/123) 123 - Fix Spelling 
* | 7909b1a (origin/master) Merge bug/456 
|\ \ 
| |/ 
|/| 
| * f9d43b6 (origin/bug/456) 456 - Change color 
|/ 
o 96c9aa9 (tag: v1.1.1) 

我可以手动reset --hard原产/主,然后重新合并,我已经做了(使用--rerere-autoupdate选项,树枝,这样我就不必reresolve冲突),但是如果有15个合并而不是1,可能会变得非常复杂。

是否有任何内置的Git解决方案或脚本可以实现我想要的功能?

顺便说一句,做git rebase -ip master,然后不挑选非合并提交不起作用。我得到

error: Commit 00... is a merge but no -m option was given. 
fatal: cherry-pick failed 
Could not pick 00... 

回答

-1

是的,你可以通过用正确的父母重做未推送的合并来得到这个结果。

git checkout -B master origin/master 
git merge bug/123 

并以与32666合并相同的方式处理任何冲突。由于改组没有产生任何显着的冲突数量,合并也不会。

+0

我已经提到过这种可能性,“我可以手动重置 - 难以产生/主,然后重新合并那些我已经做过的分支(使用--rerere-autoupdate选项,这样我就不必重新解决冲突),但是当有15个合并而不是1个时,这会变得相当复杂。“ –

+0

请绘制一张准确的提交图表反映你想要的。你现在所期望的结果是你所画的提交图,就是你说你不想要的合并,并且不希望重新解决已经在现有合并中解决的冲突,这只是说你想要的另一种方式重新**使用**重新**有线**重新**结果。 – jthill

+0

该图准确。我只想要一个适用于大量合并的解决方案。引用最初的问题,“当有15个合并而不是1个时,这可能会变得非常复杂”。我会尽量让这个更清楚。 –