我正在尝试重新组织我的git树,以便它的结构更好一些。基本上目前我有一个主分支,有几个小功能分支从中分离出来。我想返回并重新排序,以便主分支中的唯一提交是对应于新版本号的提交,然后让提交之间的所有提交驻留在一个单独的开发分支中,功能分支也从该分支中分离出来。基本上我正在寻找一种工具,让我可以完全手动重新组织树。我想也许我正在寻找交互式变基,但是在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
答案 0 :(得分:0)
拥有线性历史 - 就像您当前的结构 - 是许多人想要的东西。如果你真的想尝试这个新的工作流程,那么从现在开始采用它,而不改变过去呢?这样可以省去一些麻烦。
但是,如果你真的想改变它,你可以这样做:
#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
最后一句话:如果你已经分享了这些提交(例如:如果你已经推过),你应该警告每个可能拥有它们的人,你将改变历史的结构。否则它可能导致真正的混乱。