`git rebase` 整个分支树
`git rebase` entire branch-tree
我的 git 存储库中有两个不相关的 "parts",其中一个包含合并:
X---Y
A---B---C
/ \
D---E---F---G---H
现在 Y
和 D
包含完全相同的 filesm(将这两个部分视为一个独立的历史记录)
我想将整个第二部分 (D..H
) 重新定位到第一部分,所以我得到类似
的内容
A---B---C
/ \
X---Y---D---E---F---G---H
不幸的是,做一个简单的 git rebase
只适用于单个分支,并且会使历史变平并丢失 branching/merging 部分。
如何重新设置整个 "branch-tree" 的基线?
背景
代码最初是使用 subversion 开发的。
在某些时候,我切换到 git 来实现实验性功能,但只是从 svn-repository 的最后状态开始(而不是进行适当的 svn2git 转换)。
git 历史包括分支、合并等等。
我现在想完全切换到 git
,但也想将两个历史合并为一个(包括所有合并)。
似乎 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
我的 git 存储库中有两个不相关的 "parts",其中一个包含合并:
X---Y
A---B---C
/ \
D---E---F---G---H
现在 Y
和 D
包含完全相同的 filesm(将这两个部分视为一个独立的历史记录)
我想将整个第二部分 (D..H
) 重新定位到第一部分,所以我得到类似
A---B---C
/ \
X---Y---D---E---F---G---H
不幸的是,做一个简单的 git rebase
只适用于单个分支,并且会使历史变平并丢失 branching/merging 部分。
如何重新设置整个 "branch-tree" 的基线?
背景
代码最初是使用 subversion 开发的。 在某些时候,我切换到 git 来实现实验性功能,但只是从 svn-repository 的最后状态开始(而不是进行适当的 svn2git 转换)。 git 历史包括分支、合并等等。
我现在想完全切换到 git
,但也想将两个历史合并为一个(包括所有合并)。
似乎 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