如何解决“拒绝合并无关的历史记录”?我已经尝试过“ git pull origin master --allow-unrelated-histories”

时间:2019-08-09 20:57:40

标签: git github git-branch

我试图将所有东西从我的dev分支拉到master,但是我正在“已经更新”。因此,当我尝试将它们合并在一起时,我会遇到“致命的问题:拒绝合并无关的历史记录”。有人可以帮我吗。

我尝试了git reset --hard

iwithman〜/ Programming / ibusiness-card-web $:git merge wip269来源/主控

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

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

  • 主控

    wip269

iwithman〜/编程/ ibusiness-card-web $:git merge wip269

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

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

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

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

2 个答案:

答案 0 :(得分:1)

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

git merge的工作方式是将合并基础提交与您选择的两个其他特定提交进行比较。您可以通过检出来选择要使用的两个提交之一:

git checkout master

,另一个带有git merge的参数:

git merge wip269

例如。

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

如果与历史记录相关,这是

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

可能是绘制提交图的好方法。从该图上,您可以看到master中的历史记录在提交H处开始(或结束),并向后退回到A,然后再提交*,再往后退;并且wip269中的历史记录在提交W处开始(或结束),然后回溯到P并回溯到*,然后回溯。

提交*将成为合并基础。合并基础定义为最佳通用提交。最好的选择显然是*-承诺也要先行一步,但最好还是坚持最接近您起点的两个分支端的选择。 git merge的工作方式是将合并基础中的文件与当前提交(此处为H)中的文件进行比较,以查看进行了哪些更改,然后比较这些相同的文件以相同的合并基础与提交(W)中的文件进行比较,以查看它们发生了什么变化。找到了你们都更改的内容之后,Git可以合并更改。

这里的问题是您的历史记录看起来并不像这样。它可能看起来像这样:

A--B--...--H   <-- master (HEAD)

P--Q--...--W   <-- wip269

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

使用--allow-unrelated-histories告诉git merge好吧,如果没有共同的提交,则玩一个假装的游戏:假装有一个共同的提交根本不包含任何文件,并且以此为合并基础。

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

如果发明的文件具有不同的名称,则Git将采用新文件。如果它们具有相同的名称,Git会声明一个add/add conflict并让您找出该名称在文件中应该包含的内容。

如果并且当您解决所有此类冲突并提交(或不存在冲突)时,Git将做出一个新的合并提交,其父母均为HW

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

,现在PW的提交都在两个分支上。 AHXmaster的提交(仅)。如果您移动名称wip269使其也指向新的提交X,则所有17个提交都将在两个分支上;否则,这两个分支将同时位于两个分支上。或者您可以立即删除名称wip269(如果已删除),之后所有提交仅在master上进行。

git pull上的旁注

所有git pull的操作都运行git fetch,然后立即运行第二个Git命令。第二个命令通常是git pull,在您的情况下也是这样。因此,您可以使用git pull(可以将--allow-unrelated-histories传递到其git merge)进行此操作,但是您也可以使用git merge至此,您可能已经完成了所有必要的fetch

答案 1 :(得分:0)

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

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