Git:“不能'压扁'没有先前的提交”错误,而rebase

时间:2016-09-20 13:09:47

标签: git rebase

我在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

7 个答案:

答案 0 :(得分:56)

交互式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's answer下面提出了一种更好的方法,无需重新排序这两个提交:

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

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

答案 1 :(得分:44)

我遇到了类似的问题,我解决了以下问题:

这是我想要压缩的提交组:

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

# r, reword = use commit, but edit the commit message选项

所以我的提交列表看起来像这样:

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会询问我所选提交的重写。

之后,我的提交日志导致了一次提交,从而产生了更清晰的提交历史记录。

答案 2 :(得分:4)

我遇到了这个问题,而在我的情况下发生的原因是,您不能将较早的提交压缩为新的提交。举例来说,您有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 --continue”。       或者,您也可以使用'git rebase --abort'中止重新设置。

解决方案:

在压缩提交时,您应该将最近提交压缩到旧提交中,反之亦然,因此在示例中将是这样:

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

如果您想要所有提交消息,这将很好用,我建议使用修正而不是壁挂

答案 3 :(得分:4)

以相反的逻辑压倒。您将可以在后续步骤中选择所需的提交消息。

  • pick不需要的第一次提交
  • squashfixup您要合并的提交,直到具有您实际想要的提交消息的提交为止。
pick 56bcce7 Closes #2774
squash e43ceba Lint.py: Replace deprecated link
  • 确认更改(:x
  • 删除您不想要的提交消息,仅保留您想要的提交 中的消息(在这种情况下为Lint.py: Replace deprecated link)。
  • 确认选择(:x

希望对某人更清楚

答案 4 :(得分:2)

我只是尝试了这种方法。

git log -n3

这将显示最近的3次提交,这使我知道什么是最新的提交以及先前进行过的提交。现在说重新定级,

git rebase -i HEAD〜3

选择最后一个提交,然后压缩另外两个。选择为基本提交的提交ID就像

选择commit_id

对于其他两个提交ID,将其更改为

南瓜commit_id

或者简单地

s commit_id

答案 5 :(得分:1)

最好只在包含提交的交互式编辑器中说,git总是从下往上挤压,并且应该在顶部保留一个“ pick”条目以接收来自下面的南瓜。

答案 6 :(得分:0)

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