Git: 当 rebase 时出现“ Can not‘ squash’without a before commit”错误

git rebase -i HEAD~2的待办文本中,我有以下内容:

pick 56bcce7 Closes #2774
pick e43ceba Lint.py: Replace deprecated link


# Rebase 684f917..e43ceba onto 684f917 (2 command(s))
#
...

现在,当我试图压缩第一个(56bcce7)并在第一个前面加上“ s”来选择第二个时,我会得到以下错误:

Cannot 'squash' without a previous commit

谁能给我解释一下这是什么意思,我该怎么做?

我想压缩第一个提交(56bcce7)和“选择和重写”第二个(e43ceba)提交

137964 次浏览

交互式 rebase 提交的顺序与使用 git log时所习惯的顺序相反。git rebase -i按照保存的 rebase 指令文件中列出的确切(自上而下)顺序重播选定的提交。在压缩时,选择用于压缩的提交与(已编辑)列表中提交之前的提交(即前一行的提交)结合在一起。在您的情况下-没有以前的提交为 56bcce7。您必须执行下列操作之一

  • git rebase -i HEAD~3(如果你想把 56bcce7挤压成 684f917)
  • 如果你想把 56bcce7e43ceba结合起来,而 e43ceba又不依赖于 56bcce7,那么只需要重新排序它们:

    r e43ceba Lint.py: Replace deprecated link
    s 56bcce7 Closes #2774
    

    更新 : 下面的 Gus 的回答建议了一种更好的方法来做同样的事情,而不需要重新排序两个提交:

    r 56bcce7 Closes #2774
    s e43ceba Lint.py: Replace deprecated link
    

    这将压缩/合并两个提交到一个。当交互式 rebase 请求为 56bcce7重写提交消息时,提供描述 56bcce7e43ceba联合的提交消息。

我有一个类似的问题,我解决如下:

这就是我想打败的承诺小组:

1 s 01cc5a08 Removes open div
2 s a2b6eecf Restores old fonts
3 s 603479ff Cleans left out div
4 pick 5afdbc33 Update: show logo on landing page
5 s 04c1cb13 change version of dev and prod from 1 to 2
6 s bbe6a8f8 Update: show logo on landing page if they have one
7 s c0d6008a Adds check for C users

正如你所看到的,我想要4号,但是1,2和3之前没有提交到 挤进。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。因此出现了 如果没有先前的提交,则不能“压缩”错误。

我的解决方案是对 # r, reword = use commit, but edit the commit message使用 r选项

我的提交列表是这样的:

1 r 01cc5a08 Removes open div
2 s a2b6eecf Restores old fonts
3 s 603479ff Cleans left out div
4 s 5afdbc33 Update: show logo on landing page
5 s 04c1cb13 change version of dev and prod from 1 to 2
6 s bbe6a8f8 Update: show logo on landing page if they have one
7 s c0d6008a Adds check for C users

保存之后,交互式 shell 要求我对所选的提交进行重新措辞。

在此之后,我的提交日志导致一个单一的提交,从而导致一个更干净的提交历史记录。

我刚才也遇到过这个问题,那是粗心大意。你可以像下一步那样解决这个问题: 当你试图压缩第一行(56bcce7)并选择第二行时,你应该在第二行前面加上“ s”,而不是第一行。你也可以参考下一个网站: http://backlogtool.com/git-guide/en/stepup/stepup7_5.html

我有这个问题,在我的例子中发生这种情况的原因是,您不能压缩旧的提交到新的提交。下面是一个例子,假设你有3次提交:

1 pick 01mn9h78 The lastest commit
2 pick a2b6pcfr A commit before the latest
3 pick 093479uf An old commit i made a while back

现在如果你说 git rebase -i HEAD~3然后你做一些像

1 pick 01mn9h78 The lastest commit
2 s a2b6pcfr A commit before the latest
3 s 093479uf An old commit i made a while back

这将导致错误:

如果没有先前的提交,则不能“压缩” 您可以使用‘ git rebase —— edit-todo’修复这个问题,然后运行‘ git rebase —— keep’。 或者可以使用“ git rebase —— abort”中止 rebase。

解决方案:

当压缩提交时,你应该压缩最近提交的旧提交,而不是反过来,因此在例子中,它会是这样的:

1 s 01mn9h78 The lastest commit
2 s a2b6pcfr A commit before the latest
3 pick 093479uf An old commit i made a while back

这将工作良好,如果你想要所有的提交消息,我建议 装修而不是 南瓜

最好是在包含提交的交互式编辑器中说,git 总是从底部到顶部的南瓜,人们应该在顶部留下一个“选择”条目,从下面接收南瓜。

我只是尝试了这种方法。

Git log-n3

这将显示最后3次提交,它将给我最新的提交和之前提交的提交的概念。现在说重新定位,

Git rebase-i HEAD ~ 3

选择我们需要压缩其他两个提交的最后一个提交。选择作为基提交的提交 id 类似于,

选择 commit _ id

对于其他两个提交 id,将它们更改为,

Squash commit _ id

或者简单地说,

S commit _ id

使用反向逻辑 进行压缩,您将能够在后面的步骤中选择所需的提交消息。

  • 第一个提交 你不想要的的提交消息。
  • squashfixup您想要合并的提交,直到有您实际想要的提交消息的提交。
pick 56bcce7 Closes #2774
squash e43ceba Lint.py: Replace deprecated link
  • 确认变更(:x)
  • 删除您不想要的提交消息,只留下提交 你想要的东西中的消息(在本例中为 Lint.py: Replace deprecated link)。
  • 确认选择(:x)

希望有人能明白