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

Daw*_*y33 67 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))
#
...
Run Code Online (Sandbox Code Playgroud)

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

Cannot 'squash' without a previous commit
Run Code Online (Sandbox Code Playgroud)

有人可以解释一下它的含义,我该怎么做?

我想压缩第一个commit(56bcce7)和"select and reword"第二个(e43ceba)提交

Leo*_*eon 62

交互式rebase以与您习惯使用时相反的顺序呈现提交git log.git rebase -i以保存的rebase指令文件中列出的完全(自上而下)顺序重放所选提交.当压缩时,选择用于压缩的提交与(编辑的)列表中的提交相结合,即来自前一行的提交.在你的情况下 - 没有以前的提交 56bcce7.您必须执行以下操作之一

  • git rebase -i HEAD~3(如果你想挤进56bcce7684f917)
  • 如果您想要56bcce7与之结合e43ceba,而e43ceba不是依赖于56bcce7它们,那么只需重新排序:

    r e43ceba Lint.py: Replace deprecated link
    s 56bcce7 Closes #2774
    
    Run Code Online (Sandbox Code Playgroud)

    更新:Gus的回答提示了一种更好的方法,无需重新排序两个提交:

    r 56bcce7 Closes #2774
    s e43ceba Lint.py: Replace deprecated link
    
    Run Code Online (Sandbox Code Playgroud)

    这将把两个提交压缩/合并为一个.当交互式rebase请求重写的提交消息时56bcce7,提供描述56bcce7和的并集的提交消息e43ceba.


Gus*_*Gus 58

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

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

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
Run Code Online (Sandbox Code Playgroud)

如你所见,我不想.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
Run Code Online (Sandbox Code Playgroud)

保存后,交互式shell会询问我所选提交的重写.

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

  • 像我一样,如果你因为没有选择任何改写或选择并提到错误(问题)而出错,你将需要做`git rebase --edit-todo`并修复引用这个答案,然后做` git rebase --continue` (4认同)

Dvi*_*act 8

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

现在,如果你说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
Run Code Online (Sandbox Code Playgroud)

这将导致错误:

错误:没有先前的提交就无法“压扁”您可以使用“ 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
Run Code Online (Sandbox Code Playgroud)

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

  • 谢谢-我不经常压缩提交,选择最旧提交的建议是帮助我克服无用的git错误的原因。 (3认同)

Kam*_*her 7

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

  • pick您不想要提交消息的第一个提交。
  • squashfixup您想要合并的提交,直到具有您真正想要的提交消息的提交。
pick 56bcce7 Closes #2774
squash e43ceba Lint.py: Replace deprecated link
Run Code Online (Sandbox Code Playgroud)
  • 确认更改 ( :x)
  • 删除您不想要的提交消息,只留下您想要的提交消息(在这种情况下:)Lint.py: Replace deprecated link
  • 确认选择 ( :x)

希望对某人更清楚?


eky*_*u88 5

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