撤消一些 merges/commits,但保留一些

Undoing some merges/commits, but keeping some

我有一个糟糕的合并,然后是几个好的提交。我试图恢复错误的合并,但是我不想丢失这些更改(即我不想进一步提交,这会撤消更改),我只是不想让它们出现在我的分支中。

所以我的日志看起来像这样:

7975c057 | Reverts bad merge
40a01d2f | Good commit
3b2c3825 | Good commit
1f3f1858 | Bad merge - code shouldnt be in this branch
37f71a89 | Good commit
... (more good commits...)

如何从我的分支中删除 1f3f1858 | Bad merge7975c057 | Reverts bad merge

还原合并提交很棘手,因为合并有两个父项,并且只能遵循一个父项的路径。如果使用交互式变基,您通常必须完全重做合并。出于这个原因,我可能会建议以下策略:

git checkout -b good_branch 37f71a89    # create new branch from 37f71a89
git cherry-pick 3b2c3825                # cherry-pick first good commit
git cherry-pick 40a01d2f                # cherry-pick second good commit

这会给你留下你想要的分支结构,尽管两次 "good" 提交实际上会有新的 SHA-1 哈希值,因为 cherry-picking 总是创建一个 new 提交(尽管这些提交在功能上与其原始对应的提交相同)。