git:删除一系列错误提交引起的更改

git:删除一系列错误提交引起的更改,git,git-rebase,Git,Git Rebase,假设我有一个git回购,有这样的提交历史:a-B-C-D-E 现在,我突然意识到,提交B和C是完全有缺陷和不必要的。 另外,假设我有重写项目历史的完全自由(也许我独自一人在做这个项目) 我有另一个分支指向提交B和C,所以丢失它们不是问题。如果我真的需要这些更改,我可以签出该分支并查看它们 但是对于主分支,我想强制历史记录为A-D'-E',其中D和E不仅具有修改的父列表,而且不包含提交B和C引入的更改 这可能吗?如果是这样,怎么做?我假设有5个提交 在这种情况下,您将执行以下操作: git reb

假设我有一个git回购,有这样的提交历史:a-B-C-D-E

现在,我突然意识到,提交B和C是完全有缺陷和不必要的。 另外,假设我有重写项目历史的完全自由(也许我独自一人在做这个项目)

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

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


这可能吗?如果是这样,怎么做?

我假设有5个提交

在这种情况下,您将执行以下操作:

git rebase -i HEAD~5
git rebase --continue
然后删除与提交B和C相关的两行

最后,您将执行以下操作:

git rebase -i HEAD~5
git rebase --continue

git-rebase-i头~5

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

git rebase --onto $commit_A $commit_C $commit_E

这更方便,因为您将看到
头指向
主控
,而
主控
又指向重新编写的E。

重新基址——只有在重新基址必须停止以供用户输入时,才需要继续
,在这种情况下,除非在删除
B
C
后应用
D
时出现冲突,否则不会发生冲突。很好!我以前从未使用过rebase,但它似乎使仅仅是凡人(比如我自己)的rebase成为可能。我认为这个问题也许可以通过rebase来解决,这就是为什么我用“git rebase”来标记它,但是rebase有点难以理解(至少对我来说)。更不用说,你可以很容易地把你的回购历史搞砸。但是,我看起来真的很容易。