有什么方法可以自动 rebase 大量 merge 提交?另一个问题的答案,Rebasing a Git merge commit 建议使用 --preserve-merges
,但这也会对非 merge 提交进行 rebase。
当将功能分支 merge 到主分支或集成分支,然后发现其他人刚刚推送更改时,这种行为是不希望的。此外,能够将开发分支 rebase 到新的主提交,或从开发中删除不会被使用的修复程序,这很有用。
例如,给定以下情况:
* 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 正在重做,但它已经推送到公共(public)仓库,因此不需要重播。我想要的结果如下:
* 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,然后重新 merge 我已经做过的分支(使用 --rerere-autoupdate 选项,这样我就不必重新解决冲突),但是当有 15 个而不是 1 个 merge 时,这会变得相当复杂。
是否有任何内置的 Git 解决方案或脚本可以完成我想要的?
顺便说一句,执行 git rebase -ip master
,然后不选择非 merge 提交是行不通的。我明白了
error: Commit 00... is a merge but no -m option was given.
fatal: cherry-pick failed
Could not pick 00...
最佳答案
是的,您可以通过与正确的父级重做未推送的 merge 来获得此结果。
git checkout -B master origin/master
git merge bug/123
并以与 32666 merge 相同的方式处理任何冲突。由于 rebase 没有产生任何显着数量的冲突,因此 merge 也不会。
关于git - 仅 rebase /重放 merge 提交,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31544404/