我有一个存储库,它只是我的,所以破坏任何东西都没有问题。而且只有一个分支,我认为这让事情变得更容易。假设我有这 7 个提交:
A -> B -> C -> D -> E -> F -> G
我想删除提交 C 和 D
A -> B -> E -> F -> G
作为 A 有史以来第一次提交,而 G 是最后一次提交。
我怎样才能做到这一点?无需接触我的代码,只需了解 git 历史。
我知道我唯一能做的就是重置头部,但这不起作用,因为我不想删除 E、F 和 G。
我有一个存储库,它只是我的,所以破坏任何东西都没有问题。而且只有一个分支,我认为这让事情变得更容易。假设我有这 7 个提交:
A -> B -> C -> D -> E -> F -> G
我想删除提交 C 和 D
A -> B -> E -> F -> G
作为 A 有史以来第一次提交,而 G 是最后一次提交。
我怎样才能做到这一点?无需接触我的代码,只需了解 git 历史。
我知道我唯一能做的就是重置头部,但这不起作用,因为我不想删除 E、F 和 G。
正如其他人提到的那样,交互式变基应该可以帮助您做到这一点。
这是程序。
打开命令行/git bash
你想删除C
,所以在ieD
之前去提交。你可以做或C
B
git rebase -i HEAD~6
git rebase -i <B's commit hash>
应该打开一个编辑器窗口(vim 或其他基于您的设置),应该如下所示
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
以检查变基是否有效
您可以进行交互式变基(参见git manual on rewriting history,特别是“重新排序提交”部分)。
例如,输入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。
撤消这可能会很痛苦,因此请考虑首先创建一个新分支来试验变基。
您可以进行交互式变基:
git checkout myBranch # with G being myBranch HEAD)
git rebase -i B
这将在 之后 重播所有提交B
,但您有机会放弃您不想要的提交。