繁体   English   中英

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

[英]Rewriting git history to unpack a squashed commit

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

如何在这个存储库上执行Git手术以“解压缩”压缩的提交并在Git历史中将其替换为来自develop-2分支的单独提交?

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

然后git cherry-pick cherry-从这个新分支的顶部选择旧历史中的提交范围。

像下面这样的东西。

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

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

使用'git rebase --onto'应该不会太难

假设您的分支结构如下图(C'是来自develop-2的squash合并):

A---C0---B---C’---D---...---X  develop
     \         
      C1---C2---...---C30      develop-2

您可以在develop分支上使用以下步骤解压缩C'

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

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

2. git rebase --onto <commit id now HEAD is> <commit id for C'> develop

A---C0---B---C1’---C2’---...---C30’---D---...---X  develop
     \         
      C1---C2---...---C30                          develop-2

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM