将git提交重组到不同的分支

时间:2014-06-03 03:22:53

标签: git rebase

我正在尝试重新组织我的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

1 个答案:

答案 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

最后一句话:如果你已经分享了这些提交(例如:如果你已经推过),你应该警告每个可能拥有它们的人,你将改变历史的结构。否则它可能导致真正的混乱。