我在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
)
答案 0 :(得分:56)
交互式rebase按照与使用git log
时相同的顺序显示提交。 git rebase -i
以保存的rebase指令文件中列出的完全(自上而下)顺序重放所选提交。当压缩时,选择用于压缩的提交与(编辑的)列表中的提交相结合,即来自前一行的提交。在您的情况下 - 56bcce7
之前没有提交。您必须执行以下操作之一
git rebase -i HEAD~3
(如果您想将56bcce7
压入684f917
)如果您要将56bcce7
与e43ceba
合并,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
的重写提交消息时,请提供描述56bcce7
和e43ceba
的联合的提交消息。
答案 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
不需要的第一次提交 。squash
或fixup
您要合并的提交,直到具有您实际想要的提交消息的提交为止。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