首页 > 解决方案 > 分叉后历史记录中的重复提交

问题描述

我最初从 github 分叉了一个存储库并对其进行了许多更改。与此同时,原始存储库发生了变化,我想将这些更改合并到我当前的 fork 中。

我将原始 repo 添加为上游分支,并执行了 fetch。当我查看 git 日志时,似乎所有提交到我的 fork(我希望它是共同的祖先)都是重复的(同名但不同的提交 id)。

什么可能导致这种情况?我该如何合并?

标签: gitgithub

解决方案


最可能的原因是:在原始存储库中,有人运行了历史重写命令(例如git rebase -i ...or git filter-branch ...),该命令创建了具有相同消息但不同提交 ID 的提交。

恕我直言,解决此问题的最简单方法是:在新提交之上重新设置您自己的提交。

然而,有了这个建议,您将重写您的分支的历史记录,因此您需要在push --force之后将您的分支转到您的 fork。
我猜你的情况没问题,但如果这是一个阻止程序,请添加评论。


这是一个命名提交的图表:

*--*--*--*--A--B--C--X <- fork/master   # the original commit from upstream,
          \           \                 # on which you started your branch
           \           *--*--*--*--Y <- yourbranch
            \
             A'--B'--C'--X'--*--*--Z <- upstream/master

通过检查你的提交和upstream' 提交的历史,你应该很容易地找出哪些提交是XX'上图中的。

当您发现此提交时,您可以:

  1. 直接将您的分支重新设置在Z
  2. 首先将您的分支重新设置在 之上X',然后在之上Z

使用第二种方式:第一个 rebase 应该有更少的冲突,并且你将拥有这个中间状态,yourbranchupstream.


要在另一点之上重新设置一系列提交:使用git rebase --onto

# to rebase X..yourbranch on top of X' :
git rebase --onto X' X yourbranch

# to rebase X'..yourbranch on top of Z :
git rebase --onto Z X' yourbranch

# obviously, if you want to go with 1. :
git rebase --onto Z X yourbranch

推荐阅读