变基时出现“无法在没有先前提交的情况下‘挤压’”错误

问题描述 投票:0回答:7

我在

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
)提交

git rebase
7个回答
155
投票

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

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

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 之前没有提交 squash into。因此会出现 Cannot 'squash' without a previous commit 错误。

我的解决方案是使用

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 要求我重新措辞所选提交。

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


131
投票

交互式变基以与使用

git log
时习惯相反的顺序呈现提交。
git rebase -i
按照保存的变基指令文件中列出的确切(自上而下)顺序重放所选提交。压缩时,选择用于压缩的提交将与(编辑的)列表中位于其之前的提交(即上一行的提交)组合在一起。就您而言 - 之前没有
56bcce7
的提交。您必须执行以下操作之一

  • git rebase -i HEAD~3
    (如果您想将
    56bcce7
    压入
    684f917
  • 如果您打算将

    56bcce7
    e43ceba
    组合,并且
    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
    

    这会将两个提交压缩/合并为一个。当交互式变基要求重新编写

    56bcce7
    的提交消息时,请提供描述
    56bcce7
    e43ceba
    并集的提交消息。


44
投票

我遇到了这个问题,在我的例子中发生这种情况的原因是,你不能将旧的提交压缩到新的提交上。这是一个例子,假设您有 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

这会很好地工作,如果您想要所有提交消息,我建议使用 fixup 而不是 squash


9
投票

用相反的逻辑挤压。您将能够在后面的步骤中选择所需的提交消息。

  • pick
    第一个提交你不想要的提交消息。
  • squash
    fixup
    您要合并的提交,直到包含您真正想要的提交消息。
pick 56bcce7 Closes #2774
squash e43ceba Lint.py: Replace deprecated link
  • 确认更改(
    :x
    )
  • 删除您不想要的提交消息,仅保留您想要的提交消息(在本例中:
    Lint.py: Replace deprecated link
    )。
  • 确认选择(
    :x
    )

希望有人能更清楚✌🏽


7
投票

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


2
投票

我刚刚尝试过这种方法。

git log -n3

这将显示最后 3 次提交,这将使我了解最新的提交是什么以及之前的提交。现在说变基,

git rebase -i HEAD~3

选择我们需要压缩其他两个的最新提交。选择作为基本提交的提交 ID 如下所示,

选择commit_id

对于另外两个commit id,将其更改为,

挤压commit_id

或者简单地说,

s commit_id


0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.