重写git历史记录以解压缩压缩的提交

时间:2017-03-03 14:48:23

标签: git github version-control

我目前有一个分支develop,其中包含来自另一个分支develop-2的约30个提交的压缩合并提交。这个压扁的提交不在HEAD,可能在HEAD之前提交20-30左右。我仍然拥有develop-2分支,包含它所构成的所有单独提交。

如何在这个存储库中执行Git手术以解压缩"解压缩"压缩提交并将其替换为Git历史记录中的develop-2分支的个别提交?

3 个答案:

答案 0 :(得分:3)

我会在压缩提交之前签出提交,创建一个分支并合并你的未压缩提交。

然后git cherry-pick来自旧历史的提交范围在此新分支之上。

如下所示。

B' = squashed b2
        A     B'    C    D
dev - - * - - * - - * -- *
dev2    \ - - * - - * - - *
               b1    b2    b3

Step 1 & 2: `git checkout <sha-A> && git checkout -b d3  && git merge dev2`
        A     B'    C    D
dev - - * - - * - - * -- *
d3  - - * - - b1 - - b2 - - b3

Step 3: `git cherry-pick <sha B'>..dev`
d3  - - A - - b1 - - b2 - - b3 - - C - - D

上述步骤对您当前的分支机构没有破坏性。

答案 1 :(得分:0)

使用&#39; git rebase --onto&#39;不应该太难。

答案 2 :(得分:0)

假设你的分支结构如下图(C'是来自\chapter{Introduction} 的压缩合并):

develop-2

您可以在A---C0---B---C’---D---...---X develop      \               C1---C2---...---C30  develop-2 分支上使用这些步骤解压缩C’

<强> 1。develop

git rebase --onto <commit id for B> <commit id for C0> <commit id for C30>

<强> 2。 C1’---C2’---...---C30’ HEAD / A---C0---B---C’---D---...---X develop      \               C1---C2---...---C30  develop-2

git rebase --onto <commit id now HEAD is> <commit id for C’> develop