假设我有一个git仓库,它的提交历史如下:A-B-C-D-E。
现在,突然间我意识到,提交B和C是完全错误和不必要的。此外,假设我完全可以自由地重写项目历史(也许我独自开发这个项目)。
我有另一个分支指向提交B和C,所以失去它们不是问题。如果我确实需要这些更改,我可以检出该分支并查看它们。
但是对于主分支,我想强制历史记录为A-D'-E',其中D和E不仅具有修改后的父列表,而且还不包含由提交B和C引入的更改。
这可能吗?如果可以,怎么做呢?
假设我有一个git仓库,它的提交历史如下:A-B-C-D-E。
现在,突然间我意识到,提交B和C是完全错误和不必要的。此外,假设我完全可以自由地重写项目历史(也许我独自开发这个项目)。
我有另一个分支指向提交B和C,所以失去它们不是问题。如果我确实需要这些更改,我可以检出该分支并查看它们。
但是对于主分支,我想强制历史记录为A-D'-E',其中D和E不仅具有修改后的父列表,而且还不包含由提交B和C引入的更改。
这可能吗?如果可以,怎么做呢?
git rebase -i HEAD~5
然后,从提交列表中删除不需要的提交。
git rebase -i HEAD~5
然后,您将删除与提交 B 和 C 相关的 2 行。
最后,您将执行:
git rebase --continue
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。