重写Git历史记录以展开压缩的提交

4
我目前有一个分支develop,其中包含来自另一个分支develop-2的大约30个提交的压缩合并提交。这个压缩提交不在HEAD上,它可能比HEAD早20-30个提交。我仍然保留着develop-2分支以及它所包含的所有单独提交。
如何在Git存储库中执行Git手术,以“解开”压缩提交并用develop-2分支的单独提交替换它在Git历史记录中的位置?

git reflog 是你的好朋友。 - shoover
3个回答

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
如果这个操作按预期工作,请执行 git checkout dev && git reset --hard d3,以将dev分支移动到d3 HEAD。请注意,如果这是已经推送到其他地方的代码,则在执行此操作时要小心。您需要执行 git push --force 将其上传,这会给其他人带来问题。 - g19fanatic

0

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


0
假设您的分支结构如下图所示(C'是从develop-2进行压缩合并的):
A---C0---B---C’---D---...---X  develop
     \         
      C1---C2---...---C30      develop-2

以下是在 develop 分支上解压缩 C' 的步骤:

1. git rebase --onto <B 的提交 ID> <C0 的提交 ID> <C30 的提交 ID>

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

2. git rebase --onto <现在 HEAD 所指的提交 ID> <C' 的提交 ID> develop

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接