我有一个存储库,它只是我的,所以在破坏任何东西方面都没有问题。还有一个分支,我认为这会让事情变得更容易。假设我有这7个提交:
A - > B - > C - > D - > E - > F - > G.
我想删除提交C和D.
A - > B - > E - > F - > G.
作为有史以来第一次提交,G是最后一次提交。
我怎样才能做到这一点?没有触及我的代码,只需要git历史记录。
我知道我唯一可以做的就是重置头部,但这不起作用,因为我不想删除E,F和G.
你可以做一个interactive rebase:
git checkout myBranch # with G being myBranch HEAD)
git rebase -i B
这将重播B
之后的所有提交,但有机会丢弃你不想要的提交。
你可以做一个交互式的rebase(参见git manual on rewriting history,特别是关于“Reordering Commits”的部分)。
例如,输入git rebase -i HEAD~5
将打开默认文件编辑器,其中包含最近5次提交的列表,从最旧到最新:
pick f7f3f6d commit C
pick 310154e commit D
pick a5f4a0d commit E
pick aaaaaaa commit F
pick bbbbbbb commit G
您可以删除提交C和D的行。与上面链接中的示例类似,当您保存并退出编辑器时,Git将您的分支倒回到这些提交的父级(即提交B),应用提交E然后F然后G,然后停止。您有效地完全删除了提交C和D.
这可能是一个很难撤消,所以考虑首先创建一个新的分支来试验rebase。
正如其他人所说,互动式底板应该可以帮助你做到这一点。
这是程序。
C
和D
,所以在C
之前去提交,即B
。你可以做git rebase -i HEAD~6
或git rebase -i <B's commit hash>
pick {A's commit message}
pick {B's commit message}
pick {C's commit message}
pick {D's commit message}
pick {E's commit message}
pick {F's commit message}
pick {G's commit message}
删除提交C
和D
的整行,然后保存并关闭编辑器。所以你的编辑器现在应该是这样的。
pick {A's commit message}
pick {B's commit message}
pick {E's commit message}
pick {F's commit message}
pick {G's commit message}
C
和D
。确保您解决过程中可能出现的任何合并冲突,然后执行git rebase --continue
(仅在存在冲突时)git log
以检查rebase是否有效