Git:删除由一系列错误提交引入的更改

3

假设我有一个git仓库,它的提交历史如下:A-B-C-D-E。

现在,突然间我意识到,提交B和C是完全错误和不必要的。此外,假设我完全可以自由地重写项目历史(也许我独自开发这个项目)。

我有另一个分支指向提交B和C,所以失去它们不是问题。如果我确实需要这些更改,我可以检出该分支并查看它们。

但是对于主分支,我想强制历史记录为A-D'-E',其中D和E不仅具有修改后的父列表,而且还不包含由提交B和C引入的更改。

这可能吗?如果可以,怎么做呢?

3个回答

5

git rebase -i HEAD~5

然后,从提交列表中删除不需要的提交。


不错!我以前从未使用过rebase -i,但它似乎使得像我这样的凡人也能够进行变基。我认为可以通过rebase来解决这个问题,所以我用“git-rebase”标记了它,但是变基对我来说有点难以理解。更不用说你很容易搞砸你的仓库历史记录。但是-i看起来真的很简单。 - Kipras

2
我假设有5个提交。
在这种情况下,您需要执行以下操作:
git rebase -i HEAD~5

然后,您将删除与提交 B 和 C 相关的 2 行。

最后,您将执行:

git rebase --continue

只有在重新定位需要停止等待用户输入时,才需要使用“rebase --continue”。这种情况不会发生,除非在删除“B”和“C”之后应用“D”存在冲突。 - Cascabel

1
git rebase --onto $commit_A $commit_C $commit_E

这句话的意思是“取出从C开始到E(包括E)之后的所有提交,并在A的基础上重放它们。”

当然,您可以使用任何表示提交的符号。例如,如果master指向E,而您有一个指向C的分支,称为backup,您也可以这样说:

git rebase --onto $commit_A backup master

这更加方便,因为您将留下HEAD指向master,而master又指向重写的E。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接