2

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

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

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

4

2 回答 2

4

是的:

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

这些<specifier>s 可以是原始哈希 ID,或分支名称,或用于计算首次提交的分支名称,等等。诀窍是创建一个新分支,该分支在最后一个好的提交处结束,然后在除已知的坏提交之外的其余可能好的提交中挑选。~numbernumber

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

于 2017-08-09T20:52:50.680 回答
2

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

首先创建测试分支:

git checkout -b test

接下来,启动变基:

git rebase -i C^ # the parent of C

当您在交互式 rebase 屏幕中时,删除包含 commit 的行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
于 2017-08-09T20:53:11.420 回答