Git:重新设置基准时出现“无法在没有先前提交的情况下’挤压’”错误

Git: “Cannot 'squash' without a previous commit” error while rebase

git rebase -i HEAD~2的待办事项文本中包含以下内容:

1
2
3
4
5
6
pick 56bcce7 Closes #2774
pick e43ceba Lint.py: Replace deprecated link

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

现在,当我尝试挤压第一个(56bcce7)并通过在第一个之前添加" s"来选择第二个时,出现以下错误:

1
Cannot 'squash' without a previous commit

有人可以解释我的意思吗,我该怎么做?

我要压扁第一个提交(56bcce7)并"选择并改写"第二个提交(e43ceba)提交


Interactive rebase按与使用git log时相反的顺序显示提交。 git rebase -i按照所保存的变基指令文件中列出的确切(自上而下)顺序重放选定的提交。压缩时,将选择用于压缩的提交与(已编辑)列表中在其之前的提交(即来自上一行的提交)组合在一起。您的情况-56bcce7没有先前的提交。您必须执行以下任一操作

  • git rebase -i HEAD~3(如果您想将56bcce7压入684f917)
  • 如果您打算将56bcce7e43ceba组合在一起,并且e43ceba不依赖于56bcce7,则只需对其重新排序:

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

    更新:古斯的答案在下面提出了一种更好的方法,而无需重新排列两个提交:

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

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


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

这是我要压缩的提交组:

1
2
3
4
5
6
7
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
2
3
4
5
6
7
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

保存后,交互式外壳程序要求我重新输入所选提交的内容。

在那之后,我的提交日志产生了一个提交,从而产生了更清晰的提交历史。


我遇到了这个问题,之所以发生在我的案例中,是因为您不能将较早的提交压缩为新的提交。这是一个示例,说您有3次提交:

1
2
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
2
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

这将导致错误:

error: cannot 'squash' without a previous commit
You can fix this with 'git rebase --edit-todo' and then run 'git rebase --continue'.
Or you can abort the rebase with 'git rebase --abort'.

解决方案:

压缩提交时,您应该将最近的提交压缩到旧的提交中,而不是相反,因此在示例中将是这样的:

1
2
3
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总是从底部到顶部压缩,并且应该在顶部保留一个" pick"条目以接收来自下方的南瓜。


我现在也已经遇到了这个问题,这很粗心。您可以解决下一个问题:当您尝试压缩第一个(56bcce7)并选择第二个时,应在第二行之前添加" s",但是不是第一个。您还可以参考下一个网站:http://backlogtool.com/git-guide/en/stepup/stepup7_5.html