3

我有一个存储库,它只是我的,所以破坏任何东西都没有问题。而且只有一个分支,我认为这让事情变得更容易。假设我有这 7 个提交:

A -> B -> C -> D -> E -> F -> G

我想删除提交 C 和 D

A -> B -> E -> F -> G

作为 A 有史以来第一次提交,而 G 是最后一次提交。

我怎样才能做到这一点?无需接触我的代码,只需了解 git 历史。

我知道我唯一能做的就是重置头部,但这不起作用,因为我不想删除 E、F 和 G。

4

3 回答 3

2

正如其他人提到的那样,交互式变基应该可以帮助您做到这一点。

这是程序。

  1. 打开命令行/git bash

  2. 你想删除C,所以在ieD之前去提交。你可以做或CBgit rebase -i HEAD~6git rebase -i <B's commit hash>

  3. 应该打开一个编辑器窗口(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}
    

删除提交的整行CD然后保存并关闭编辑器。所以你的编辑器现在应该是这样的。

    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}
  1. 变基应该继续并删除提交CD. 确保解决过程中可能出现的任何合并冲突,然后执行git rebase --continue(仅在存在冲突时)

  2. 完成后,运行git log以检查变基是否有效

于 2019-04-03T04:49:11.753 回答
1

您可以进行交互式变基(参见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。

撤消这可能会很痛苦,因此请考虑首先创建一个新分支来试验变基。

于 2019-04-03T04:45:54.687 回答
0

您可以进行交互式变基

git checkout myBranch   # with G being myBranch HEAD)
git rebase -i B

这将在 之后 重播所有提交B,但您有机会放弃您不想要的提交。

于 2019-04-03T04:39:55.237 回答