假设我有一个 git repo,有这样的提交历史:ABCDE
现在,我突然意识到,提交 B 和 C 是完全有缺陷和不必要的。另外,假设我有重写项目历史的完全自由(也许我正在单独从事该项目)。
我有另一个分支指向提交 B 和 C,所以丢失它们不是问题。如果我真的需要这些更改,我可以签出该分支并查看它们。
但是对于 master 分支,我想强制历史为 AD'-E',其中 D 和 E 不仅有修改的父列表,而且不包含提交 B 和 C 引入的更改。
这可能吗?如果是这样,怎么办?
假设我有一个 git repo,有这样的提交历史:ABCDE
现在,我突然意识到,提交 B 和 C 是完全有缺陷和不必要的。另外,假设我有重写项目历史的完全自由(也许我正在单独从事该项目)。
我有另一个分支指向提交 B 和 C,所以丢失它们不是问题。如果我真的需要这些更改,我可以签出该分支并查看它们。
但是对于 master 分支,我想强制历史为 AD'-E',其中 D 和 E 不仅有修改的父列表,而且不包含提交 B 和 C 引入的更改。
这可能吗?如果是这样,怎么办?
git rebase -i HEAD~5
然后,从提交列表中删除不需要的提交
我假设有 5 个提交。
在这种情况下,您将执行以下操作:
git rebase -i HEAD~5
然后,您将删除与提交 B 和 C 有关的 2 行。
最后,您将执行以下操作:
git rebase --continue
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。