3

假设我有一个 git repo,有这样的提交历史:ABCDE

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

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

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

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

4

3 回答 3

5

git rebase -i HEAD~5

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

于 2010-12-06T11:38:15.417 回答
2

我假设有 5 个提交。

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

git rebase -i HEAD~5

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

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

git rebase --continue
于 2010-12-06T11:37:14.787 回答
1
git rebase --onto $commit_A $commit_C $commit_E

这表示“将 C 之后的所有提交,直到并包括 E,并在 A 之上重放它们”。

当然,您可以对您所指的提交使用任何符号。例如。如果master在 E 并且你有一个指向 C 的分支,比如backup,你也可以这样说:

git rebase --onto $commit_A backup master

这更加方便,因为您将被HEAD指向master,然后master又指向重写的 E。

于 2010-12-06T11:50:19.240 回答