【问题标题】:`git rebase` entire branch-tree`git rebase` 整个分支树
【发布时间】:2015-10-06 18:09:40
【问题描述】:

我的 git 存储库中有两个不相关的“部分”,其中一个包含合并:

  X---Y

        A---B---C
       /         \
  D---E---F---G---H

现在YD 包含完全相同的文件(将这两部分视为一个不相交的历史)

我想将整个第二部分 (D..H) 重新定位到第一部分,所以我得到类似

                A---B---C
               /         \
  X---Y---D---E---F---G---H

不幸的是,做一个简单的git rebase 只适用于单个分支,并且会展平历史并丢失分支/合并部分。

我怎样才能变基整个“分支树”?

背景

代码最初是使用 subversion 开发的。 在某些时候,我切换到 git 来实现实验性功能,但只是从 svn-repository 的最后一个状态开始(而不是进行适当的 svn2git 转换)。 git历史包括分支、合并和事物。

我现在想完全切换到git,但也想将两个历史记录合并为一个(包括所有合并)。

【问题讨论】:

  • 嗨@umläute,你试过这个吗:1. git checkout branch_D_to_H; 2. git pull --rebase origin branch_x_y?
  • @Phoebe 没有远程(例如origin),这都是一个具有不相交分支的本地存储库。

标签: git merge branching-and-merging


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-08-18
    • 2021-05-09
    • 2012-09-05
    • 2017-12-22
    • 1970-01-01
    • 2012-07-01
    • 2019-11-17
    • 2017-02-21
    相关资源
    最近更新 更多