我可以在 git 中合成一个跳过单个变更集的分支吗

Can I synthesize a branch in git that skips a single change set

假设以下 git 分支:A -> B -> C -> D -> E -> F -> G

我通过 git bisect 确定提交 C 引入了错误,但恢复 C 在分支顶部引入的更改并不能解决问题。这向我表明,在该分支的后续提交中还有其他错误。

有没有办法合成以下分支:A -> B -> D1 -> E1 -> F1 -> G1,其中 1 表示提交 C 中引入的更改不存在?然后我会在该分支上 运行 git bisect 以确定找到另一个错误。 [希望这不需要重复多次]

是:

git checkout -b newbranch <specifier-for-B>
git cherry-pick <specifier-for-C>..<specifier-for-G>

这些<specifier>可以是raw hash ID,也可以是分支名,也可以是分支名加上~<em>数</em>来统计返回 number 首次提交,依此类推。诀窍是创建一个新分支,以最后一次好的提交结束,然后在其余可能好的提交中挑选,不包括已知的错误提交。

有了这个新分支后,您可以使用 git rebase -igit rebase --onto <target> <exclude> 删除更多提交,如果您愿意的话。

您可以交互地变基并删除该提交。

首先创建测试分支:

git checkout -b test

接下来,开始变基:

git rebase -i C^ # the parent of C

当您处于交互式 rebase 屏幕时,删除包含提交 C.

的行

这将使 save 分支有效匹配 A -> B -> D1 -> E1 -> F1 -> G1,您可以继续测试。

如果您发现 C 是您需要删除的唯一提交,另一种选择是还原它,这样您就不需要推送任何修改已推送提交的历史记录:

git checkout master # get back to where you started
git revert C        # will create a revertion commit
git push            # will only push 1 new commit, the inverse of C