假设以下git
分支:A - > B - > C - > D - > E - > F - > ģ
我已经通过git bisect
确定提交C引入了一个错误,但是恢复C在分支顶部引入的更改并不能解决问题。这告诉我,在该分支的后期提交中还有其他错误。
有没有办法合成以下分支:A - > B - > D1 - > E1 - > F1 - > G1,其中1表示提交C中引入的更改不存在?然后我会在该分支上运行git bisect
以确定找到另一个错误。 [希望这不需要多次重复]
答案 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 -i
或git 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