我有一个看起来像这样的提交历史记录:
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' 将具有相同的文件。
这意味着:
- 您将拥有所需的提交
- 您的提交
B
和C
实际上并没有丢失,因此如果您有一些重新提交,可以返回它 - 当您使用交互式变基时,很容易添加一个安全网:标记从您开始的地方提交,这样如果事情变得复杂,您就可以轻松返回它