仅变基/重播合并提交

Jos*_*uss 5 git git-merge git-rebase

有没有办法自动对大量合并提交进行变基?另一个问题Rebase a Git merge commit 的答案建议使用--preserve-merges,但这也会对非合并提交进行 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)
Run Code Online (Sandbox Code Playgroud)

如果我运行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)
Run Code Online (Sandbox Code Playgroud)

这是不可取的,因为提交 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)
Run Code Online (Sandbox Code Playgroud)

我可以手动reset --hard到 origin/master,然后重新合并我已经完成的分支(使用--rerere-autoupdate选项,这样我就不必重新解决冲突),但是当有 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...
Run Code Online (Sandbox Code Playgroud)

jth*_*ill -1

是的,您可以通过与正确的父级重做未推送的合并来获得此结果。

git checkout -B master origin/master
git merge bug/123
Run Code Online (Sandbox Code Playgroud)

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