我有两个不相关的"部分"在我的git存储库中,其中一个包含合并:
X---Y
A---B---C
/ \
D---E---F---G---H
现在Y
和D
包含完全相同的filesm(将2个部分视为单个不相交的历史记录)
我想将整个第二部分(D..H
)重新定义到第一部分,所以我得到类似
A---B---C
/ \
X---Y---D---E---F---G---H
不幸的是,做一个简单的git rebase
只适用于单个分支,并且会使历史变平并丢失分支/合并部分。
我如何改变整个"分支树"?
代码最初是使用subversion开发的。 在某些时候,我转而使用git来实现实验性功能,但刚刚从svn-repository的最后一个状态开始(而不是进行正确的svn2git转换)。 git历史包括分支,合并和事物。
我现在想完全切换到git
,但也希望将两个历史记录合并为一个(包括所有合并)。
答案 0 :(得分:2)
似乎rebase
命令有一些保留分支的选项(最重要的--preserve-merges
:
git checkout d--h
git rebase --root --preserve-merges --onto x--y
这将完全符合我的要求。
(正如预期的那样)它不会迁移任何标签或迁移分支。
因此,要将以下基于D
的子树(请注意,这包含两个未合并的分支)改为Y
,...
X---Y
A---B---C
/
D---E---F---G---H
...,您需要多次调用git rebase
:
git checkout branch-to-h
git rebase --root --preserve-merges --onto x--y
git checkout branch-to-c
git rebase --root --preserve-merges --onto x--y
导致:
A---B---C
/
X---Y---D---E---F---G---H