如何删除特定的旧提交而不删除代码中的更改(即基本上更改git故事)

问题描述 投票:2回答:3

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

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

我想删除提交C和D.

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

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

我怎样才能做到这一点?没有触及我的代码,只需要git历史记录。

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

github git-commit git-history-graph git-history
3个回答
0
投票

你可以做一个interactive rebase

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

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


0
投票

你可以做一个交互式的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。


0
投票

正如其他人所说,互动式底板应该可以帮助你做到这一点。

这是程序。

  1. 打开命令行/ git bash
  2. 你想删除CD,所以在C之前去提交,即B。你可以做git 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. rebase应该继续并删除提交CD。确保您解决过程中可能出现的任何合并冲突,然后执行git rebase --continue(仅在存在冲突时)
  2. 完成后,运行git log以检查rebase是否有效
© www.soinside.com 2019 - 2024. All rights reserved.