我在
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
)提交
我有一个类似的问题,我解决如下:
这是我想要压制的提交组:
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 要求我重新措辞所选提交。
此后,我的提交日志产生了一次提交,从而产生了更清晰的提交历史记录。
交互式变基以与使用
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
并集的提交消息。我遇到了这个问题,在我的例子中发生这种情况的原因是,你不能将旧的提交压缩到新的提交上。这是一个例子,假设您有 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。
用相反的逻辑挤压。您将能够在后面的步骤中选择所需的提交消息。
pick
第一个提交你不想要的提交消息。squash
或 fixup
您要合并的提交,直到包含您真正想要的提交消息。pick 56bcce7 Closes #2774
squash e43ceba Lint.py: Replace deprecated link
:x
)Lint.py: Replace deprecated link
)。:x
)希望有人能更清楚✌🏽
最好在包含提交的交互式编辑器中说,git 总是从下到上挤压,并且应该在顶部留下一个“pick”条目以接收来自下面的挤压。
我刚刚尝试过这种方法。
git log -n3
这将显示最后 3 次提交,这将使我了解最新的提交是什么以及之前的提交。现在说变基,
git rebase -i HEAD~3
选择我们需要压缩其他两个的最新提交。选择作为基本提交的提交 ID 如下所示,
选择commit_id
对于另外两个commit id,将其更改为,
挤压commit_id
或者简单地说,
s commit_id
我刚才也遇到了这个问题,那只是粗心。你可以像下面这样解决问题:当你尝试挤压第一个(56bcce7)并选择第二个时,你应该在第二行之前添加“s”但不是第一个。您还可以参考下一个网站:http://backlogtool.com/git-guide/en/stepup/stepup7_5.html