假设以下git
分支:A -> B -> C -> D -> E -> F -> G
我已经确定通过git bisect
提交 C 引入了一个错误,但是在分支顶部恢复 C 引入的更改并不能解决问题。这向我表明,该分支的后续提交中还有其他错误。
有没有办法合成以下分支: A -> B -> D1 -> E1 -> F1 -> G1 ,其中 1 表示提交 C 中引入的更改不存在?然后我也会git bisect
在该分支上运行以确定找到另一个错误。[希望这不需要重复多次]
假设以下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>
s 可以是原始哈希 ID,或分支名称,或用于计算首次提交的分支名称,等等。诀窍是创建一个新分支,该分支在最后一个好的提交处结束,然后在除已知的坏提交之外的其余可能好的提交中挑选。~number
number
一旦你有了这个新分支,你可以使用git rebase -i
或git rebase --onto <target> <exclude>
删除更多的提交,如果你愿意的话。
您可以交互地变基并删除该提交。
首先创建测试分支:
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