Rebase / Replay Merge仅提交

时间:2015-07-21 16:16:30

标签: git git-merge git-rebase

有没有办法自动修改大量数量的合并提交?另一个问题的答案Rebasing a Git merge commit建议使用--preserve-merges,但这也会修改非合并提交。

将功能分支合并到主分支或集成分支,然后发现其他人刚推送更改时,不需要此行为。此外,能够将开发分支重新定义到新的主提交,或者从开发中删除不会被使用的修订是很有用的。

例如,鉴于以下情况:

* 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到origin / master,然后重新合并我已经做过的分支(使用--rerere-autoupdate选项,这样我就不必重新解决冲突了),但是当有15个合并而不是1时,会变得相当复杂。

是否有内置的Git解决方案,或者可以完成我想要的脚本?

BTW,执行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 个答案:

答案 0 :(得分:-1)

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

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

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