考虑以下git历史记录:
* 21f05f9 - Fifth commit
* 0534049 - Fourth commit
* 738ae0a - Third commit
* 288ffd2 - Second commit
* 2535dca - First commit
21f05f9
738ae0a
和2535dca
合并到一个提交中?我已尝试git rebase -i 2535dca
,pick
2535dca
和squash
21f05f9
和738ae0a
,但我收到了以下错误消息:
error: could not apply 21f05f9 ... Fifth commit
我不确定是否有办法在rebase的交互模式中跳过提交0534049
和288ffd2
。
有没有更好的方法来做我正在做的事情?有没有陷阱?
我开始理解的是,我不应该把自己放在需要非线性提交的地方,特别是如果那些提交都与一个文件有关。我可以看到提交可能破坏代码或发生冲突的实例。
答案 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