Git将两个类似的存储库合并为一个(两个都添加了冲突)

时间:2014-06-14 12:34:45

标签: git github git-merge

我的情况如下:

我有两个或多或少相同代码的存储库(比如repo A和B)。我想从回购A.回购B回购 在repo A上执行以下命令:

git remote add repoB path/to/repoB
git checkout -b branchB repoB/master
git merge branchB

问题:
我收到了大量both added个冲突,因为这两个存储库都包含许多相同的文件,这些文件在第一次提交时添加并保持不变。

如何在不花一整天时检查“两个已添加”文件是否有不同的内容或相同的情况下合并此回购?

我想自动合并相同的文件,只留下具有不同内容的文件进行手动合并。

3 个答案:

答案 0 :(得分:3)

也许有人可以提供更简单的方法来做到这一点,但我找到的唯一选择是:

  • 将repoB添加为repoA的新分支
    git remote add repoB path/to/repoB
    git checkout -b branchB repoB/master
  • 将repoA重新设置为初始提交(repo A和B具有类似的初始提交)
    git rebase -i --root
  • 在其初始提交时与branchB合并
    git merge -Xours SHA_OF_BRANCHB_INITIAL_COMMIT
  • 将repoA变为当前状态
    git rebase --continue
  • 正常合并回购
    git merge branchB

由于此解决方案,所有常见文件都在前两次提交中合并,因此我可以在此合并中安全地使用-Xours-Xtheirs

答案 1 :(得分:1)

您可以检查git merge策略是否允许您自动解决这些冲突:

git merge -Xours branchB

请注意,这将适用于所有带有冲突的所有文件,而不仅仅是“已添加”的文件。

答案 2 :(得分:1)

当合并必须使用不良基础时,它会得到不准确的变化 - 在这种情况下,历史记录显示根本没有共同的祖先,merge的autoreolve从每个显示为单个添加的更改块的文件开始。

你可以尝试的一件事是将根系嫁接在一起:

  

echo $(git rev-list --max-parents=0 other) \
  $(git rev-list --max-parents=0 HEAD) > .git/info/grafts
  git merge other

如果结果不好,只需中止合并并取出.git/info/grafts文件即可。

通用后备是

  

git merge --no-commit --strategy ours other
  git diff ..other | git apply
  git add --patch .