概述
错误信息为:
没有先前的提交,无法“压缩”
这意味着您可能尝试“向下压缩”。Git总是将较新的提交压缩到较旧的提交中或者根据交互式变基待办事项列表的视图“向上”压缩,即压缩到前一行上的提交。将待办事项列表的第一行命令更改为squash
,将始终产生此错误,因为第一个提交没有可以压缩的内容。
解决方法
首先回到您开始的位置。
$ git rebase --abort
假设你的历史记录是:
$ git log --pretty=oneline
a931ac7c808e2471b22b5bd20f0cad046b1c5d0d c
b76d157d507e819d7511132bdb5a80dd421d854f b
df239176e1a2ffac927d8b496ea00d5488481db5 a
也就是说,a 是第一次提交,然后是 b,最后是 c。在提交 c 后,我们决定将 b 和 c 合并:
(注意:运行 git log
会将其输出传输到分页程序中,在大多数平台上默认使用的是 less
。要退出分页程序并返回命令提示符,请按下 q
键。)
运行 git rebase --interactive HEAD~2
将会打开一个编辑器:
pick b76d157 b
pick a931ac7 c
请注意,此待办事项列表与git log
输出相比顺序相反。
将 b 的 pick
改为 squash
将导致你看到的错误,但是如果你将 c 合并到 b 中(较新的提交合并到较旧的提交或“向上压缩”),则需要更改待办事项列表。
pick b76d157 b
squash a931ac7 c
保存并退出您的编辑器后,您将获得另一个编辑器,其内容为
b
c
保存并退出时,编辑文件的内容将成为新合并提交的提交消息:
$ git log --pretty=oneline
18fd73d3ce748f2a58d1b566c03dd9dafe0b6b4f b and c
df239176e1a2ffac927d8b496ea00d5488481db5 a
关于重写历史的注意事项
交互式变基将重写历史。试图推送到包含旧历史记录的远程仓库会失败,因为它不是快进。
如果您变基的分支是自己工作的主题或特性分支,那就没什么大不了的。将其推送到另一个仓库需要使用--force
选项,或者根据远程仓库的权限,您可以首先删除旧分支,然后再推送经过变基的版本。这些可能会破坏工作的命令范例超出了本回答的范围。
在与他人共同合作的分支上重新编辑已发布的历史记录,除非有非常好的理由(例如泄露密码或其他敏感细节),否则会让您的合作者承担额外的工作,是不良社交行为并会使其他开发人员感到烦恼。Git变基文档中的“从上游变基恢复”部分进行了解释,并强调了这一点。
对于其他人已经依赖的分支进行变基(或任何其他形式的重写),是个坏主意:任何下游使用这些分支的人都必须手动修复他们的历史记录。这一节从下游的角度解释了如何进行修复。但是,真正的解决方案应该是避免在第一时间内对上游进行变基。 …
ESC
键并输入:wq!
来退出编辑器。 - Rafaël Moser