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

时间:2017-08-09 20:47:15

标签: git testing git-bisect

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

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

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

2 个答案:

答案 0 :(得分:4)

是:

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

这些<specifier>可以是原始哈希ID,分支名称或带有~number的分支名称,可以重新计算 number first-commit,等等上。诀窍是创建一个以最后一个良好提交结束的新分支,然后挑选其余的可能良好的提交,不包括已知的错误提交。

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

答案 1 :(得分:2)

您可以以交互方式重新绑定并删除该提交。

首先创建测试分支:

git checkout -b test

接下来,启动rebase:

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