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


95

在以下待办事项中有以下内容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

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

我要压缩第一个commit(56bcce7),然后“选择并重新编写单词”第二个(e43ceba)commit


1
如果您真的想壁球,请将HEAD〜2更改为HEAD〜3。
ElpieKay

1
可能使用--root,如果HEAD〜2是您的第一次提交:stackoverflow.com/a/598788/2444812
Sybille Peters

Answers:


79

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

  • git rebase -i HEAD~3(如果你想压扁56bcce7684f917
  • 如果您想与结合56bcce7使用e43cebae43ceba而不依赖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,请提供描述56bcce7和的并集的提交消息e43ceba


1
我想挤进56bcce7 e43ceba。那么,如何在这里执行步骤1?
Dawny33 '16

82

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

这是我要压缩的提交组:

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

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

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


2
像我一样,如果您因为未选择改写单词或选择并提到所提到的错误(有问题)而遇到错误,则需要做git rebase --edit-todo并解决此问题,然后再做git rebase --continue
old-monk

这个答案很简明,
对这

16

我遇到了这个问题,而在我的案例中发生这种情况的原因是,您不能将较早的提交压缩为新的提交。这是一个示例,说您有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


5
谢谢-我不经常压缩提交,选择最旧提交的建议是帮助我克服无用的git错误的原因。
0x574F4F54

2

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

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

希望对别人来说更清楚clear


1

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


1

我只是尝试过这种方法。

git log -n3

这将显示最近的3次提交,这将使我了解最新的提交以及先前进行的提交。现在说重新定基,

git rebase -i HEAD〜3

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

选择commit_id

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

壁球commit_id

或者简单地说,

的commit_id


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.