【问题标题】:How to fix "refusing to merge unrelated histories"? I have tried "git pull origin master --allow-unrelated-histories"如何解决“拒绝合并不相关的历史”?我试过“git pull origin master --allow-unrelated-histories”
【发布时间】:2019-12-17 14:34:31
【问题描述】:

我正在尝试将所有内容从我的开发分支拉到主分支,但我得到“已经是最新的”。因此,当我尝试将它们合并在一起时,我得到了“致命的:拒绝合并不相关的历史”。谁能帮帮我。

我试过 git reset --hard

iwithman~/Programming/ibusiness-card-web$:git merge wip269 origin/master

致命:拒绝合并无关的历史

iwithman~/Programming/ibusiness-card-web$:git 分支

  • 主人

    wip269

iwithman~/Programming/ibusiness-card-web$:git merge wip269

致命:拒绝合并无关的历史

iwithman~/Programming/ibusiness-card-web$:git pull wip269

致命:'wip269' 似乎不是 git 存储库

致命:无法从远程存储库读取。

【问题讨论】:

    标签: git github git-branch


    【解决方案1】:

    dev 和 master 分支具有“不相关的历史”,这意味着默认情况下它们没有共同的基础。
    git merge 不允许合并两个历史不相关的分支以防止并行历史。

    您可以使用--allow-unrelated-histories 强制合并。

    【讨论】:

    • iwithman~/Programming/ibusiness-card-web$:git --allow-unrelated-histories master 未知选项:--allow-unrelated-histories 用法:git [--version] [--帮助] [-C ] [-c =] [--exec-path[=]] [--html-path] [--man-path] [--信息路径] [-p | --分页 | -P | --no-pager] [--no-replace-objects] [--bare] [--git-dir=] [--work-tree=] [--namespace= ] []
    • 就是这样。
    【解决方案2】:

    您可以将--allow-unrelated-histories 用作morty answered。但请注意:这可能无法满足您的要求。这取决于您想要什么,以及您将选择这种方式的两个提交中的内容。

    git merge 通过将 merge base 提交与您选择的两个特定的其他提交进行比较来工作。您通过签出选择要使用的两个提交之一:

    git checkout master
    

    另一个带有git merge的参数:

    git merge wip269
    

    例如。

    然而,合并基础是由历史决定的,而在 Git 中,历史由存储库中的提交组成,由这些提交本身链接。这是命令失败的地方,因为历史彼此不相关:没有合并基础提交。

    如果历史是相关的,那么:

              A--B--...--H   <-- master
             /
    ...--o--*
             \
              P--Q--...--W   <-- wip269
    

    可能是绘制提交图的好方法。从这张图中,您可以看到master 中的历史记录从提交H 开始(或结束)并向后工作到A,然后提交* 并进一步向后提交; wip269 中的历史记录从提交 W 开始(或结束),然后返回到 P 并继续到 * 并进一步返回。

    Commit * 将成为合并基础。合并基础被定义为最佳公共提交。最好的一个显然是*——在它也可以工作之前提交,但最好还是坚持最接近你开始的两个分支端的那个。 git merge 的工作方式是将合并库中的文件与您当前提交中的文件(此处为 H)进行比较,以查看 您 更改了什么,然后比较同一合并中的相同文件以 他们的 提交 (W) 中的文件为基础,以查看 他们 更改了什么。找到你们都更改的内容后,Git 可以合并更改。

    这里的问题是你的历史看起来不像这样。它可能看起来像这样:

    A--B--...--H   <-- master (HEAD)
    
    P--Q--...--W   <-- wip269
    

    也就是说,从 H 开始并向后工作,Git 最终到达提交 A,这是一个 根提交: 它没有以前的历史记录。同时,从W 开始并向后工作,Git 最终到达提交P,这也是一个根提交。 两个分支上没有共享提交。

    使用--allow-unrelated-histories 告诉git merge:好吧,如果没有共同提交,玩一个假装游戏:假装有一个根本不包含文件的共同提交,并将其用作合并基地。

    这意味着您所做的更改是:您从头开始发明了每个文件。同时,他们改变的是,他们也从头开始发明了每个文件。

    如果发明的文件有不同的名称,Git 将采用新文件。在它们具有相同名称的地方,Git 将声明一个add/add conflict 并让您弄清楚该名称的文件中应该包含什么。

    如果并且当您解决所有此类冲突并提交时——或者如果没有冲突——Git 将创建一个新的合并提交,其父级都是 H 和 W:

    A--B--...--H
                \
                 X   <-- master (HEAD)
                /
    P--Q--...--W   <-- wip269
    

    现在P 到W 的提交都在两个 分支上。提交A 到H,加上X,(仅)在master 上。如果您移动名称 wip269 使其也指向新提交 X,则所有 17 个提交都将在两个分支上;或者你现在可以删除名称wip269,如果你已经完成了它,那么所有提交都只在master上。

    关于git pull的旁注

    git pull 所做的只是运行git fetch,然后立即运行第二个 Git 命令。第二个命令通常是——在你的情况下——git pull。所以您可以使用git pull(可以将--allow-unrelated-histories 传递给它的git merge)来执行此操作,但此时您最好使用git merge 来执行此操作——您可能已经完成任何必要的fetch。

    【讨论】:

      猜你喜欢
      • 2017-02-23
      • 2017-09-02
      • 2017-12-29
      • 1970-01-01
      • 2016-10-22
      • 2018-11-06
      • 2011-02-22
      • 2017-01-09
      相关资源
      最近更新 更多