git - 仅 rebase /重放 merge 提交

标签 git git-merge git-rebase

有什么方法可以自动 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/

相关文章:

git - 503错误推送到远程

git - 由于未 merge 的文件,无法更改分支或提交。无法 merge 或 stash 文件,因为我在错误的分支中

Git:提交一个标签,然后将提交 merge 到 master

git - GIT rebase 要求重新提交更改

git - 交互式 rebase 时将更改移动到不同的提交

git - 我怎样才能看到我还剩下多少 rebase?

git - git 上的每个目录权限

git - 如何从别人的 repo 中 pull 出远程分支

windows - Git,切换分支时出现错误 : "Deletion of directory ' <dirname >' failed. Should I try again?" Started after I set custom folder icon

git - 是否可以在 Git 中只 pull 一个文件?