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

Git 将非线性提交合并为一个提交(香肠制作),git,rebase,squash,git-interactive-rebase,git-squash,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 738ae0a和2535dca合并为一个提交? 我尝试过git rebase-I 2535dca,选择2535dca并挤压21f05f9和738ae0a,但出现以下错误: error: could

考虑以下git历史记录:

* 21f05f9 - Fifth commit
* 0534049 - Fourth commit
* 738ae0a - Third commit
* 288ffd2 - Second commit
* 2535dca - First commit
如何将21f05f9 738ae0a和2535dca合并为一个提交? 我尝试过git rebase-I 2535dca,选择2535dca并挤压21f05f9和738ae0a,但出现以下错误:

error: could not apply 21f05f9 ... Fifth commit
我不确定是否有办法在rebase的交互模式中跳过提交0534049和288ffd2

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

编辑:
我开始理解的是,我不应该把自己放在一个需要非线性提交的地方,特别是当这些提交都与一个文件相关时。我可以看到一个实例,在该实例中,提交可能会破坏代码或引起冲突。

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


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

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


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

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

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

git checkout -b new_branch 2535dca
然后只需选择要添加的提交:

git cherry-pick 738ae0a

git cherry-pick 21f05f9

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

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

git checkout -b new_branch 2535dca
然后只需选择要添加的提交:

git cherry-pick 738ae0a

git cherry-pick 21f05f9

您使用git-rebase-i的说法是正确的。您还可能已经运行了git-rebase-i 2535dca^,否则提交就不会出现在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主题分支,其中顺序正好,但主题应该指向您刚刚完成的新提交图:

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

您使用git-rebase-i的说法是正确的。您还可能已经运行了git-rebase-i 2535dca^,否则提交就不会出现在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主题分支,其中顺序正好,但主题应该指向您刚刚完成的新提交图:

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

当存在冲突时,通常会看到这种错误,但在这种情况下,您可以解决冲突并继续重定基址。您是否收到有冲突的消息?当存在冲突时,通常会看到该错误,但在这种情况下,您可以解决冲突并继续重定基址。你收到有冲突的信息了吗?