1

考虑以下 git 历史:

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

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

我尝试过git rebase -i 2535dca, picking2535dcasquashing 21f05f9and 738ae0a,但出现以下错误:

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

我不确定是否有办法在 rebase 的交互模式下0534049跳过提交。288ffd2

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

编辑:

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

4

3 回答 3

2

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

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

git checkout -b new_branch 2535dca

然后只需挑选您要添加的提交:

git cherry-pick 738ae0a

git cherry-pick 21f05f9
于 2014-03-06T02:22:15.647 回答
1

你在雇佣的叙述中是正确的git rebase -i。(而且您也可能已经运行git rebase -i 2535dca^,否则该提交不会在变基列表中。)

您可以做的一件事是分别重新排序和压缩以简化流程 - 运行两个变基,但基本上除了遵循说明并在每次变基失败时解决所有合并失败之外,您无能为力,无论是运行一个还是两个变基。

除了重新调整所有内容之外,您可能会发现以下流程更加明确,因此对于您的特定情况更直观。(这与 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
于 2014-03-06T08:57:39.537 回答
1

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

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

于 2014-03-06T02:20:53.593 回答