繁体   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