将非线性提交合并为一个提交(香肠制作)

时间:2014-03-06 01:23:59

标签: git rebase squash git-interactive-rebase git-squash

考虑以下git历史记录:

* 21f05f9 - Fifth commit
* 0534049 - Fourth commit
* 738ae0a - Third commit
* 288ffd2 - Second commit
* 2535dca - First commit

如何将21f05f9 738ae0a2535dca合并到一个提交中?

我已尝试git rebase -i 2535dcapick 2535dcasquash 21f05f9738ae0a,但我收到了以下错误消息:

error: could not apply 21f05f9 ... Fifth commit

我不确定是否有办法在rebase的交互模式中跳过提交0534049288ffd2

有没有更好的方法来做我正在做的事情?有没有陷阱?

编辑:

我开始理解的是,我不应该把自己放在需要非线性提交的地方,特别是如果那些提交都与一个文件有关。我可以看到提交可能破坏代码或发生冲突的实例。

3 个答案:

答案 0 :(得分:2)

如果提交影响相同的文件,这可能不那么简单。你可以尝试:

从提到的第一个提交ID中签出一个新分支:

git checkout -b new_branch 2535dca

然后只是樱桃添加要添加的提交:

git cherry-pick 738ae0a

git cherry-pick 21f05f9

答案 1 :(得分:1)

无法保证您可以随意重新排序提交。由于无法应用21f05f9,因此它显然假定在早期提交中引入的代码可能缺少2535dca。在这种情况下,您只需将其视为冲突并手动编辑该文件以使其同意。

慢慢开始。首先,尝试简单地重新排序提交,甚至像交换第四次和第五次提交一样慢。这允许您修改历史记录,同时在每个步骤中尽可能少地进行更改。一旦五个提交处于正确的顺序,将三个所需的提交合并为一个将是一件简单的事情,因为它们将在新历史中连续。

答案 2 :(得分:1)

你在使用git rebase -i的叙述中是正确的。 (并且您也可能已经运行git rebase -i 2535dca^,否则该提交将不会出现在rebase列表中。)

你可以做的一件事是分别重新排序和压缩以简化流程 - 运行两个rebase,但从根本上说,除了遵循说明并且每次rebase失败时解决所有合并失败,你都无能为力运行一个或两个rebase。

除了改变所有内容之外,您可能会发现以下流程更加明确,因此对您的具体情况更为直观。 (它几乎与rebase在幕后所做的一样。)你可以在临时分支上工作,你可以明确地选择所需顺序的变化并根据需要进行压制:

$ git checkout -b tmp-topic 2535dca
$ git cherry-pick 738ae0a 21f05f9 
    ... will most likely have to resolve conflicts for each cherry-picked change
$ git rebase -i 2535dca
     … squash the two commits you just cherry-picked
$ git cherry-pick 288ffd2 0534049
    ... will most likely have to resolve conflicts for each cherry-picked change

现在您拥有原始分支主题和新的 tmp-topic 分支,其中订单恰到好处,但主题是一个应该指向你刚刚完成的提交的新图表:

$ git update-ref refs/heads/topic tmp-topic