我试图合并2个提交为1,所以我遵循“压缩提交与rebase”从git就绪。

我跑

git rebase --interactive HEAD~2

在结果编辑器中,我将pick更改为squash,然后save-quit,但由于出现错误,重基操作失败

没有之前的提交就不能“squash”

现在我的工作树已经达到了这个状态,我很难恢复。

命令git rebase——interactive HEAD~2失败:

交互式改基已经开始

git rebase -continue失败

没有之前的提交就不能“squash”


当前回答

$git变基--堕胎

如果你想要撤销git rebase,可以在任何时候运行这段代码

我们赢了

重新应用最近两次提交。上面的命令将打开一个代码编辑器

[最近一次提交将在底部]。改变最后一个 致力于壁球运动。因为squash将与之前的提交融合。 然后按esc键并输入:wq保存退出

输入:wq后,您将进入active rebase模式

注意:如果没有警告/错误消息,您将获得另一个编辑器,如果有错误或警告另一个编辑器将不显示,您可以通过运行中止 $ git rebase -中止如果你看到一个错误或警告,否则继续运行$ git rebase -继续

您将看到2 commit消息。选择一个或自己写提交信息,保存并退出[:wq]

注意2:如果运行rebase命令,可能需要强制将更改推送到远程回购

$ git push -f

$ git push -f origin master

其他回答

因为我对几乎所有的东西都使用git,所以对我来说,即使在这里这样做也是很自然的。

假设我签出了branchX,在它的顶端有两个提交,其中我想创建一个合并它们内容的提交,我这样做:

git checkout HEAD^ // Checkout the privious commit
git cherry-pick --no-commit branchX // Cherry pick the content of the second commit
git commit --amend // Create a new commit with their combined content

如果我想更新branchX以及(我认为这是这个方法的缺点),我也必须:

git checkout branchX
git reset --hard <the_new_commit>

如果您想合并两个最近的提交,而只使用旧的提交的消息,您可以使用expect自动化该过程。

我认为:

您使用vi作为编辑器 每次提交只有一行

我用git版本2.14.3 (Apple git -98)进行了测试。


#!/usr/bin/env expect
spawn git rebase -i HEAD~2

# change the second "pick" to "squash"
# down, delete word, insert 's' (for squash), Escape, save and quit
send "jdwis \033:wq\r"

expect "# This is a"

# skip past first commit message (assumed to be one line), delete rest of file
# down 4, delete remaining lines, save and quit
send "4jdG\r:wq\r"

interact

添加到@greg的答案后,你完成了所有的事情,即压缩提交,如果你做git push(原始提交将保留在分支),而如果你做git push -f origin提交将被删除。 例如,你合并了提交B和提交C,如果你使用git push,你将有提交B,提交C和提交BC,但如果你使用git push -f origin,你将只有提交BC

$git变基--堕胎

如果你想要撤销git rebase,可以在任何时候运行这段代码

我们赢了

重新应用最近两次提交。上面的命令将打开一个代码编辑器

[最近一次提交将在底部]。改变最后一个 致力于壁球运动。因为squash将与之前的提交融合。 然后按esc键并输入:wq保存退出

输入:wq后,您将进入active rebase模式

注意:如果没有警告/错误消息,您将获得另一个编辑器,如果有错误或警告另一个编辑器将不显示,您可以通过运行中止 $ git rebase -中止如果你看到一个错误或警告,否则继续运行$ git rebase -继续

您将看到2 commit消息。选择一个或自己写提交信息,保存并退出[:wq]

注意2:如果运行rebase命令,可能需要强制将更改推送到远程回购

$ git push -f

$ git push -f origin master

Rebase:你不需要它:

对于最常见的场景,这是一种更简单的方法。

在大多数情况下:

实际上,如果你想要的只是简单地将最近的几次提交合并成一个,而不需要删除,重写和其他rebase工作。

你可以简单地做:

git reset --soft "HEAD~n"

假设~n是软取消提交的提交数(即~1,~2,…)

然后,使用以下命令修改提交消息。

git commit --amend

这和长范围的壁球和单挑是差不多的。

它适用于n次提交,而不是像上面提示的那样只适用于两次提交。