簡體   English   中英

將git提交重組到不同的分支

[英]Reorganising git commits into different branches

我正在嘗試重新組織我的git樹,使其結構更好一些。 基本上,目前我有一個主分支,並從中拆分出幾個小功能分支。 我想返回並重新排序,以便主分支中唯一的提交是對應於新版本號的提交,然后將所有提交之間的所有操作都放在一個單獨的develop分支中,功能分支也從該分支中​​分離出來。 基本上,我正在尋找一種工具,可以完全手動重組樹。 我以為交互式重定基准可能正是我想要的,但是嘗試在sourcetree中這樣做似乎使它看起來不是正確的工具。

誰能給我一些有關如何最好地進行操作的建議。 下面是我當前結構的示意圖:

featureA                       x-x-x   
                              /     \
master     A-x-x-x-x-B-x-x-x-C       D

所需結構:

feature                   x-x-x
                         /    |
develop     x-x-x-x-x-x-x    -
           /      |     |     |
master    A    -  B  -  C  -  D

具有線性歷史記錄(例如您當前的結構)是許多人想要的東西。 如果您真的想嘗試這個新的工作流程,那么從現在開始采用它而不改變過去呢? 這將為您省去一些麻煩。

但是,如果您確實要更改它,則可以執行以下操作:

#Start to put tags on 'main' commits, to ease manipulations
git checkout B
git tag tagB
git checkout B
git tag tagB
git checkout D
git tag tagD

#Start to rewrite from the oldest
#Not much to do: we just need to add a merge commit
git checkout A
git merge --no-ff B
git branch -f master

#Continue with C
#Same thing, but we need to cherry-pick the intermediate commits
git checkout tagB
git cherry-pick C~3
git cherry-pick C~2
git cherry-pick C~1
git cherry-pick C
git merge --no-ff master
git branch -f master

#Continue with D
...

為了簡化這些操作並確保您知道發生了什么,您應該在后台打開一個gitk --all HEAD ,並定期按F5刷新它。

如果您認為自己搞砸了,並且想要檢索初始狀態,則只需執行以下操作

git checkout tagD
git branch -f master

最后一句話:如果您已經共享了這些提交(例如,如果您已經推送了),則應該警告可能擁有它們的所有人,這將改變歷史的結構。 否則可能導致真正的混亂。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM