您可以将--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。