合并历史记录的Git分支

时间:2019-05-15 20:49:53

标签: git

简而言之,我有两个git存储库,一个存储库是另一个存储库,该存储库的历史是 改写。我需要将叉子合并回去,但这似乎很棘手。

作为示例,假设我有一个名为foo的存储库。提交历史记录如下所示:

Commit 3: Typo fixes
Commit 2: Some feature
Commit 1: Quick bug fixes
Commit 0: Initial commit
然后将

foo分叉为bar,然后使用一个过程来重写/删除历史记录,以便bar的历史记录 如下所示:

Commit C: Type fixes
Commit B: Some feature
Commit A: Quick bug fixes

这时,提交ID已更改,并且派生中不再存在Commit 0。其他都一样。

现在,时间已经过去了。这两个存储库都有很多人对它们进行过工作。因此,我们可能会有类似的内容:

foo                                   bar
----------------------------------|-------------------------------------
Commit 5: Fix the major bug fix   |
Commit 4: Major bug fix           |   Commit D: Project specific fixes
Commit 3: Typo fixes              |   Commit C: Type fixes
Commit 2: Some feature            |   Commit B: Some feature
Commit 1: Quick bug fixes         |   Commit A: Quick bug fixes
Commit 0: Initial commit          |

有什么方法可以将bar合并回foo?从技术上讲1 == A2 == B3 == C,但我是 不确定如何对帐。

2 个答案:

答案 0 :(得分:1)

有一个存储库,将这两个存储库作为远程存储库,同时取回两个存储库,然后检出一个分支,然后从另一个分支中挑选您需要的东西。然后,您可以将其推送到该分支所属的远程服务器。另一个仓库中的分支也可以做到这一点。

答案 1 :(得分:0)

我找到了一种使用其他方法到达那里的解决方案。这大致就是我所发现的。

  1. 将派生的仓库以upstream的形式添加到当前仓库中。
  2. 创建要使用的分支。
  3. 在两个存储库中找到可以使用的常见提交,从而为您提供良好的合并点。
  4. 从分叉的仓库中,也找到下一个提交。
  5. 使用git replace --graft

因此,从上面开始,常见的提交将是Commit 2 / Commit B,下一个提交将是CommitC。然后,您应该这样做:

git replace --graft C 2 B
git merge upstream/master