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

我跑

git rebase --interactive HEAD~2

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

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

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

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

交互式改基已经开始

git rebase -continue失败

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


当前回答

Rebase:你不需要它:

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

在大多数情况下:

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

你可以简单地做:

git reset --soft "HEAD~n"

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

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

git commit --amend

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

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

其他回答

让我给你一个更简单的方法,

你可以做以下事情,而不是深入到GIT的深层概念中去,并为编辑的螃蟹而烦恼;

假设您从master创建了一个名为bug1的分支。向bug1提交2次。使用这些更改只修改了2个文件。

将这两个文件复制到文本编辑器中。结账的主人。粘贴文件。提交。

那么简单。

你可以用

git rebase --abort

当你再次运行交互式rebase命令时,'squash;Commit必须在列表中选择Commit的下面

我经常使用git reset -mixed在你想合并的多次提交之前恢复一个基本版本,然后我做一个新的提交,这样可以让你提交最新的版本,确保你推送到服务器后你的版本是HEAD。

commit ac72a4308ba70cc42aace47509a5e
Author: <me@me.com>
Date:   Tue Jun 11 10:23:07 2013 +0500

    Added algorithms for Cosine-similarity

commit 77df2a40e53136c7a2d58fd847372
Author: <me@me.com>
Date:   Tue Jun 11 13:02:14 2013 -0700

    Set stage for similar objects

commit 249cf9392da197573a17c8426c282
Author: Ralph <ralph@me.com>
Date:   Thu Jun 13 16:44:12 2013 -0700

    Fixed a bug in space world automation

如果我想合并头两个提交为一个,首先我使用:

git reset --mixed 249cf9392da197573a17c8426c282

“249cf9392da197573a17c8426c282”是第三个版本,也是你合并之前的基础版本,在那之后,我做了一个新的提交:

git add .
git commit -m 'some commit message'

希望对每个人来说都是另一种方式。

供参考,从git重置——帮助:

 --mixed
     Resets the index but not the working tree (i.e., the changed files are
     preserved but not marked for commit) and reports what has not been
     updated. This is the default action.

如果您想合并两个最近的提交,而只使用旧的提交的消息,您可以使用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

$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