我目前有一個分支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