我目前有一个分支develop
,其中包含来自另一分支develop-2
约30个提交的压缩合并提交。这个压扁的提交不在HEAD
,它可能是20-30左右在HEAD
之前提交。我仍然拥有develop-2
分支机构以及由它构成的所有单个提交。重写git历史记录以解压缩提交
如何在这个仓库上执行Git手术来“解压”压扁的提交并将其替换为Git历史记录,并将其从develop-2
分支中单独提交?
我目前有一个分支develop
,其中包含来自另一分支develop-2
约30个提交的压缩合并提交。这个压扁的提交不在HEAD
,它可能是20-30左右在HEAD
之前提交。我仍然拥有develop-2
分支机构以及由它构成的所有单个提交。重写git历史记录以解压缩提交
如何在这个仓库上执行Git手术来“解压”压扁的提交并将其替换为Git历史记录,并将其从develop-2
分支中单独提交?
我会在压扁的提交之前签出提交,创建一个分支并合并您的未提交的提交。
然后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
上述步骤对您当前的分支无损。
如果这可以按需要工作,请执行'git checkout dev && git reset --hard d3',将dev分支移至d3 HEAD。如果其代码已被推到某处,请当心这样做。你需要做一个'git push --force'来把它放在那里,这会给别人带来问题。 – g19fanatic
它不应该太难使用“git的变基--onto”
假设你的分支结构,如下图(C”是从南瓜合并develop-2
):
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
'混帐reflog'是你的朋友。 – shoover