摘要
错误讯息
没有先前的提交就无法“压扁”
表示您可能试图“向下挤压”。在交互式rebase待办事项列表中,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
# Rebase df23917..a931ac7 onto df23917
#
# Commands:
# p, pick = use commit
# r, reword = use commit, but edit the commit message
# e, edit = use commit, but stop for amending
# s, squash = use commit, but meld into previous commit
# f, fixup = like "squash", but discard this commit's log message
#
# If you remove a line here THAT COMMIT WILL BE LOST.
# However, if you remove everything, the rebase will be aborted.
#
(请注意,此待办事项列表与的输出相反git log
)。
将b更改pick
为squash
将导致您看到的错误,但是如果改为将c压缩为b(较新的内容提交到较旧的或“向上挤压”),则将待办事项列表更改为
pick b76d157 b
squash a931ac7 c
并保存退出您的编辑器,您将获得另一个编辑器,其内容为
# This is a combination of 2 commits.
# The first commit's message is:
b
# This is the 2nd commit message:
c
保存并退出后,已编辑文件的内容将成为新组合提交的提交消息:
$ git log --pretty=oneline
18fd73d3ce748f2a58d1b566c03dd9dafe0b6b4f b and c
df239176e1a2ffac927d8b496ea00d5488481db5 a
关于重写历史记录的注意事项
交互式重新基准重写历史记录。尝试推送到包含旧历史记录的遥控器将失败,因为它不是快速转发。
如果您依据的分支是您自己在其中工作的主题或功能分支,那没什么大不了的。推送到另一个存储库将需要该--force
选项,或者替代地,您可以根据远程存储库的权限,先删除旧分支,然后再推送重新建立基础的版本。这些可能破坏工作的命令示例不在此答案的范围内。
在一个分支中,你与其他人一起工作而无需重写已经发布的历史非常充分的理由,如泄露密码或其他敏感信息的力量工作到你的合作者,是反社会的,并会惹恼其他开发商。文档中的“从上游基础恢复中”部分进行了git rebase
说明,并重点强调。
对其他人基于其工作的分支重新建立基础(或进行任何其他形式的重写)是一个坏主意:该分支下游的任何人都必须手动修复其历史记录。本节从下游的角度说明如何进行修复。但是,真正的解决方法是首先避免对上游进行重新调整。…