如何删除中间提交而不删除它引入的更改?

时间:2013-12-26 13:04:29

标签: git

我的提交历史记录如下:

A - B - C

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

所以我希望历史成为:

A - C

保持 B引入的更改。

这可能吗?

2 个答案:

答案 0 :(得分:2)

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

会发生什么:

一开始你有:

A -B - C
       L HEAD

合并提交后,您将拥有:

A - B - C
  \ C'
    L HEAD

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

这意味着:

  • 您将拥有自己想要的提交
  • 您的提交BC实际上并没有丢失,所以如果您有一些蠢货,您可以回复它
  • 当您使用交互式rebase时,可以轻松添加安全网:从您开始的位置标记提交,这样如果事情变得复杂,您将能够轻松恢复它

答案 1 :(得分:2)

交互式rebase和fixup / squash

这样做的一个简单方法是进行交互式rebase,并将两个提交压缩在一起:

$ 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。< / p>