【问题标题】:How to rebase commits from another repository with a different history?如何从具有不同历史记录的另一个存储库重新提交提交?
【发布时间】:2016-06-07 08:06:09
【问题描述】:

我们有两个 Git 存储库。

存储库 1. 提交:A、B、C。此存储库是根据 SVN 历史创建的。

回购 2. 提交:D、E、F。这个存储库是在没有 SVN 历史记录的情况下创建的,只是使用成为提交 D 的工作副本(从提交 C 开始)。换句话说,提交的文件树C 和 D 是一样的。

现在,我们想要合并两个存储库,以便在一个存储库中拥有完整的历史记录。有没有办法将所有提交 E..F 到 C 上“复制/变基/其他东西”?

【问题讨论】:

    标签: git version-control merge rebase


    【解决方案1】:

    最简单的做法是将 Repo 2 添加为 Repo 1 中的 remote,使用其在磁盘上的 物理路径 和然后只需 cherry pickC 之上提交 EF

    所以,在 Repo 1 中你会这样做:

    git remote add repo2 C:\Path\To\Repo2
    git fetch repo2
    

    那么,假设EFRepo 2master 分支中的最新两次提交,而Cmaster 中的最新提交回购 1,像这样:

          master
         /
    A-B-C
          repo2/master
         /
    D-E-F
    

    你会这样做:

    git checkout master
    git cherry-pick repo2/master~2..repo2/master
    

    它将在C 之上应用来自EF 提交的补丁:

               master
              /
    A-B-C-E'-F'
          repo2/master
         /
    D-E-F
    

    请注意,我在这里挑选了一个提交范围,这是受支持的since Git 1.7.2

    【讨论】:

    • 使用它的路径添加一个本地远程很可爱 - 我不知道你能做到这一点
    【解决方案2】:

    这些是远程存储库吗?如果 C 和 F 都在同一个本地存储库上,那么您应该能够将指向 F 的分支重新定位到指向 C 的分支上。如果没有,请尝试以下操作:

    1. 在 Repo1 本地运行
      一种。 git remote add repo2 <Repo 2 URL>
      湾。 git push repo2 branchPointingToC
    2. 然后在 Repo2 本地运行
      一种。 git fetch
      湾。 git checkout branchPointingToF
      C。 git rebase -i remotes/origin/branchPointingToC

    (注意,如果您关注 Enrico's answer 但想要变基,您可以使用 git rebase -i repo2/master 代替他的 git cherry-pick。)

    【讨论】:

      猜你喜欢
      • 2012-12-14
      • 2016-04-12
      • 2012-12-06
      • 2015-01-12
      • 1970-01-01
      • 1970-01-01
      • 2011-11-14
      • 2019-08-27
      • 2018-11-04
      相关资源
      最近更新 更多