如何在不删除中间提交引入的更改的情况下删除中间提交

  • 本文关键字:中间 删除 提交 情况下 git
  • 更新时间 :
  • 英文 :


我有一个看起来像这样的提交历史记录:

A - B - C

现在我希望文件保持原样,但我发现提交B是不必要的。

所以我希望历史变成:

A - C

保留B引入的更改。

这可能吗?

交互式变基和修正/壁球

一个简单的方法是做一个交互式变基,并将两个提交压缩在一起:

$ git rebase -i A

这将显示一个带有如下屏幕的编辑器:

pick A commit message
pick B commit message
pick C commit message
# Rebase A..C onto A

只需阅读可用选项,在编辑器中修改文件,例如:

B 合并为 A

pick A commit message
squash B commit message
pick C commit message

将 C 合并为 B

pick A commit message
pick B commit message
squash C commit message

使用 squash 允许您根据自己的喜好修改提交消息(例如,将 C 的提交消息与生成的提交一起使用),如果提交消息不重要,您可以改用 fixup .

你可以压制提交B和C.运行git rebase -i sha1_of_A。它将打开一个带有提交列表的文本编辑器。将fixup放在 C 提交、保存和退出的行上。

将会发生什么:

一开始你有:

A -B - C
       L HEAD

合并提交后,您将拥有:

A - B - C
   C'
    L HEAD

其中 C 和 C' 将具有相同的文件。

这意味着:

  • 您将拥有所需的提交
  • 您的提交BC实际上并没有丢失,因此如果您有一些重新提交,可以返回它
  • 当您使用交互式变基时,很容易添加一个安全网:标记从您开始的地方提交,这样如果事情变得复杂,您就可以轻松返回它

最新更新