ChatGPT解决这个技术问题 Extra ChatGPT

Git拒绝在变基上合并不相关的历史

git rebase origin/development 期间,Git 显示以下错误消息:

fatal: refusing to merge unrelated histories
Error redoing merge 1234deadbeef1234deadbeef

我的 Git 版本是 2.9.0。它曾经在以前的版本中工作正常。

如何使用新版本中引入的强制标志继续此变基以允许不相关的历史记录?

@Shishya恕我直言,投票最多的答案并没有直接解决这个问题。问题询问 git-rebase 的情况,而答案给出了 git-merge 的标志
万一其他人犯了同样的错误,我在不小心使用 git pull [repo URL] 而不是 git clone [repo URL] 后得到了这个错误
由于标题没有指定这是在变基的上下文中,所以这里变得一团糟,所以你的问题是吸引谷歌员工,他们在不同的上下文中遇到这个错误,并支持一个实际上并没有的答案适用于您提出的问题。它现在不容易清理,因此不连贯的问答对将永远保留在网站上,并永远在 Google 搜索结果中居高不下。这个故事的寓意是问题标题很重要!
这个问题的最佳答案实际上可以在 this SO question 中找到。这里的最佳答案更安全、更准确、更好地解释。

m
mit

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

这背后的原因是自 Git 2.9 以来默认行为发生了变化:

“git merge”用于允许合并两个默认情况下没有共同基础的分支,这导致创建现有项目的全新历史,然后被毫无戒心的维护者拉取,这允许将不必要的并行历史合并到现有项目中.该命令已被教导默认情况下不允许这样做,并在罕见事件中使用逃生舱口 --allow-unrelated-histories 选项,该事件合并了两个独立开始其生活的项目的历史。

有关详细信息,请参阅 Git release changelog


知道合并更改,但此选项不适用于 rebase
是否有任何选项可以永久开启 --allow-unrelated-histories
@jmarceli “因为这种“两个项目合并”是罕见的事件,所以没有添加始终允许这种合并的配置选项。”。所以不行。
我试图以这种方式为不同的 repo 合并一个分支,但它在我当前的分支上创建了一个新的提交,并且没有保留来自其他 repo 的历史记录。然后我从另一个 repo 中检查了一个本地分支,然后才合并它,突然出现了一个正常的合并提交。诡异的。
非常好,也适用于 git pull。在那次“罕见的事件中,合并了两个独立开始生活的项目的历史”。 git --work-tree="." pull --allow-unrelated-histories
A
Adil

在我的情况下,每次尝试的错误只是 fatal: refusing to merge unrelated histories,尤其是远程添加 Git 存储库后的第一个拉取请求。

使用 --allow-unrelated-histories 标志以这种方式处理拉取请求:

git pull origin branchname --allow-unrelated-histories

根据 2.9.0 release notes - git pull 已被教导将 --allow-unrelated-histories 选项传递给底层 git merge


如果我使用 README.md 创建新的 Github 存储库,然后第一次将其拉到本地存储库,我总是会看到此错误。很烦人。
对于新的存储库,首先拉取,通常最好以 git clone 开头。
这让我停了好几个小时,然后我才意识到,如果默认文件发生这种情况,就必须有一个明显的解决方案来合并这样的文件——我很高兴至少我不是唯一一个遇到这个问题的人!
就我而言,这是因为我在 github 上添加了许可证文件。上面提到的命令(和下面,它们是相同的)有效。
P
Peter Mortensen

尝试以下命令:

git pull origin master --allow-unrelated-histories

这应该可以解决您的问题。


这怎么比第一个答案好?! stackoverflow.com/a/37938036/274502 应该是对其进行评论或编辑,以避免冗余和错误信息。
因为它解决了tl:dr
@okandas 祝你好运。浏览某些东西需要比大多数人愿意承认的更多的运气。
这是正确的解决方案
n
new QOpenGLWidget

当我首先设置本地存储库时出现此错误。然后我去了 GitHub 并创建了一个新的存储库。然后我跑了

git remote add origin <repository url>

当我尝试推动或拉动时,每次都会遇到相同的 fatal: unrelated_histories 错误。

这是我修复它的方法:

git pull origin master --allow-unrelated-histories
git merge origin origin/master
... add and commit here...
git push origin master

我想我们在同一条船上。添加一些东西:我的问题是远程仓库中已经有一些东西了。因此,在我的文件夹中,它删除了 .git 文件夹,运行 git init 并按照 Adithya 所说的操作,但合并部分除外。
如何在mac上按INSERT按钮?实际上,我必须输入提交消息并从命令行合并,但我不知道如何从命令行执行。
它打开vim吗?如果是这样,它只是 SHIFT + :
甚至我首先创建了 GitHub 存储库,并且正在执行添加存储库的那些命令。
这是一个非常好的答案。关键是你必须强制拉然后合并本地和远程仓库。
P
Peter Mortensen

为此,输入命令:

git pull origin branchname --allow-unrelated-histories

例如,

git pull origin master --allow-unrelated-histories

参考:

GitHub unrelated histories issue


感谢第一次为我拉它的作品“git pull origin master --allow-unrelated-histories”
应该对其进行评论或编辑,以避免冗余和错误信息。 stackoverflow.com/a/37938036/274502
w
webknjaz
git pull origin <branch> --allow-unrelated-histories

你将被引导到一个 Vim 编辑窗口:

插入提交消息

然后按 Esc(退出“插入”模式),然后按 :(冒号),然后按 x(小“x”),最后按 Enter 退出 Vim

git push --set-upstream origin <分支>


Ctrl+X 不会让你离开 Vim
:x<Enter>
感谢您指定如何出去;我完全迷失了,所有其他答案似乎都认为这很明显!
J
Junaid

我运行了这个命令,问题得到了解决。

git pull origin branchName --allow-unrelated-histories

查看此 page 了解更多信息。


git merge origin/main localBranchName --allow-unrelated-histories 为我工作。
F
Federico Baù

1.解决问题

执行 git pull origin master 时出现错误

fatal: refusing to merge unrelated histories

运行以下命令之一

 # It could be master
 git pull origin master --allow-unrelated-histories
 # Or main
 git pull origin main --allow-unrelated-histories
 # Or just try with origin 
 git pull origin main --allow-unrelated-histories

如果它打开一个 nano 编辑器,您可以保存并使用 CTRL + x 关闭

现在将更改推送到本地

 git push

2.意义

错误:

“致命:拒绝合并不相关的历史” Git 错误发生在两个不相关的项目合并时(即,不知道彼此存在且提交历史不匹配的项目)。

命令 GIT HUB DOCS --allow-unrelated-histories: --allow-unrelated-histories

默认情况下, git merge 命令拒绝合并不具有共同祖先的历史。当合并两个独立开始的项目的历史时,此选项可用于覆盖此安全性。由于这是一种非常罕见的情况,因此默认情况下不存在启用此功能的配置变量,也不会添加。

https://i.stack.imgur.com/7cpDZ.png

参考

推荐:“致命:拒绝合并不相关的历史”Git 错误

Git 2.9 发行说明

更多关于堆栈溢出

推荐使用--allow-unrelated-histories的很好的解释和警告:拒绝合并不相关的历史”失败,同时拉到恢复的存储库

如果 --allow-unrelated-histories 不起作用:致命:添加 git remote 后拒绝合并不相关的历史

Git 拒绝合并不相关的历史。什么是“无关历史”?

该用户使用 Github Desktop:如何解决上传项目到 github 时“拒绝合并无关历史”的问题?

Git 因致命错误而失败。拒绝将不相关的历史与 git push 合并?


P
Peter Mortensen

我有同样的问题。尝试这个:

git pull origin master --allow-unrelated-histories 

git push origin master

应该对其进行评论或编辑,以避免冗余和错误信息。 stackoverflow.com/a/37938036/274502
A
Amir Hossein Ghasemi

对于 Android Studio 和 IntelliJ:

首先,提交所有内容并解决任何冲突。

然后从IDE下方打开终端并输入:

git pull origin master --allow-unrelated-histories

现在可以推了。


它是一个 git 命令,与 Android Studio 或 Inteliji 无关
@AlpitAnand是的,因为这个问题和android studio或者IntelliJ没有直接关系,但是我在android studio中写了处理这个问题的方式
u
user247702

试试git pull --rebase development


这解决了我的问题。这是问题的开始
这应该是:git pull --rebase=preserve --allow-unrelated-histories development
@RiccardoMurri 刚刚尝试过,我不会再这样做了。我的新仓库中有一些示例初始化文件,以及我的本地仓库几个月的提交。运行它(使用 newOrigin branch 而不是 development)将初始提交添加到本地分支的顶部,从而有效地从中删除了几乎所有内容。我希望新遥控器的初始提交位于底部。
P
Peter Mortensen

由于所有其他答案实际上并未回答该问题,因此这里有一个受 this answer 启发的解决方案,涉及相关问题。

因此,您在执行 git rebase 时遇到错误:

$ git rebase origin/development
fatal: refusing to merge unrelated histories
Error redoing merge 1234deadbeef1234deadbeef

这个错误实际上并没有取消 rebase,但你现在正处于它的中间:

$ git status
interactive rebase in progress; onto 4321beefdead
Last command done (1 command done):
   pick 1234deadbeef1234deadbeef test merge commit

因此,您现在可以手动进行合并。找出原始合并提交的父提交:

$ git log -1 1234deadbeef1234deadbeef
commit 1234deadbeef1234deadbeef
Merge: 111111111 222222222
Author: Hans Dampf
Date:   Wed Jun 6 18:04:35 2018 +0200

    test merge commit

找出两个合并父项中的哪一个是合并到当前的一个(可能是第二个,用 git log 222222222 验证),然后手动进行合并,复制原始合并提交的提交消息:

$ git merge --allow-unrelated 222222222 --no-commit
Automatic merge went well; stopped before committing as requested
$ git commit -C 1234deadbeef1234deadbeef
[detached HEAD 909af09ec] test merge commit
 Date: Wed Jun 6 18:04:35 2018 +0200
$ git rebase --continue
Successfully rebased and updated refs/heads/test-branch.

这是所提出问题的唯一实际解决方案。
C
Chris Stryczynski

警告这可能会覆盖远程存储库

这对我有用:

git push origin master --force

但是本地和远程文件实际上会发生什么?
据我所知和经验,本地文件是完整的。您要添加到特定文件夹中的远程文件将被添加。
不要这样做!这个overwrites all remote files
只需包含一个免责声明,即此命令会覆盖 master 分支中的所有文件。对我很好。谢谢。
它有效但相当苛刻,--allow-unrelad-histories 更具体和合适
o
oiyio

首先使用以下命令将远程更改拉到本地:

git pull origin branchname --allow-unrelated-histories

** 就我而言,分支名称是 master。

https://i.stack.imgur.com/1TYEo.jpg

冲突解决后,合并完成!

现在你可以安全地推动了。


我一直在寻找 AS 中的 Resolve Conflict 按钮。有时右下弹出/气球消失 &我什么都做不了。谢谢@oiyio
节省了我很多时间。
P
Peter Mortensen

我有同样的问题。问题是远程有一些东西阻止了这一点。

我首先创建了一个本地存储库。我将 LICENSEREADME.md 文件添加到本地并提交。

然后我想要一个远程存储库,所以我在 GitHub 上创建了一个。在这里,我错误地检查了“使用 README 初始化此存储库”,这也在远程创建了一个 README.md。

所以现在当我跑

git push --set-upstream origin master

我有:

error: failed to push some refs to 'https://github.com/lokeshub/myTODs.git'
hint: Updates were rejected because the tip of your current branch is behind
hint: its remote counterpart. Integrate the remote changes
(e.g. hint: 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.

现在为了克服这个我做了

git pull origin master

这导致了以下错误:

From https://github.com/lokeshub/myTODs
branch            master     -> FETCH_HEAD
fatal: refusing to merge unrelated histories**

我试过了:

git pull origin master --allow-unrelated-histories

结果:

From https://github.com/lokeshub/myTODs
 * branch            master     -> FETCH_HEAD
Auto-merging README.md
CONFLICT (add/add): Merge conflict in README.md
Automatic merge failed;
fix conflicts and then commit the result.

解决方案:

我删除了远程存储库并创建了一个新存储库(我认为仅删除文件 README 可能有效),之后以下工作:

git remote rm origin
git remote add origin https://github.com/lokeshub/myTODOs.git
git push --set-upstream origin master

创建新存储库不是解决方案
git pull origin master --allow-unrelated-histories 为我工作.. 谢谢
在这种特殊情况下,git push --force ... 将是第 1 步的正确解决方案
这不是解决方案。如果您是初学者,那么您可以这样做,但是如果您正在处理一些实际项目,则应该以正确的方式处理。
S
Santosh Kadam

这通常发生在您第一次提交到远程存储库时。由于错误清楚地表明“拒绝合并不相关的历史”,我们需要使用 --allow-unrelated-histories 标志。

git pull origin master  --allow-unrelated-histories

现在会有一些我们必须手动解决的冲突。之后只需提交代码并推送它。


如问题中所述,我正在尝试执行 git-rebase 而不是 git-pull,git-rebase 没有 --allow-unrelated-histories 标志。
s
striker77

执行 git pull 时,我收到此消息 fatal: refusing to merge unrelated histories,因为我有一段时间没有更新本地副本。

我运行这个命令只是为了从原点刷新本地。我只想从远程获取最新信息,不需要任何本地更改。

git reset --hard origin/master

这在我的情况下解决了它。


警告:这删除了我所有的文件。如果您不知道自己在做什么,请小心!
这将删除所有待处理的更改!
如果您想要的是拉下原点上的内容并且不需要保留任何更改,那么这非常有用。
我同意这将删除您的所有文件,在使用此命令之前请小心删除您的应用程序的副本。
U
Ustas

我试过 git pull --allow-unrelated-histories 没有用,但为我解决这个问题的是:

我将桌面存储库中的所有文件复制到另一个文件夹,然后删除了该文件夹。然后我再次克隆 repo,因为它是一个新项目。当我再次复制我的文件并推送它时,它就像魅力一样。


P
Peter Mortensen

我也为此苦苦挣扎,但我设法找到了解决方法。

当您遇到上述错误时,只需选择合并提交,然后继续 rebase:

git cherry-pick -m 1 1234deadbeef1234deadbeef
git rebase --continue

请问飞机上英语好吗?
@AgentZebra 对于复平面中的任何圆盘,连续闭合路径积分为 0。
d
dz902

对于 Google 员工:

如果您在 GitHub 上创建了一个新存储库并意外使用 README.gitignore 文件对其进行了初始化。

如果您发现自己无法合并或变基,因为 .git 文件夹已损坏。

然后:

新建一个文件夹

git 克隆

将所有文件粘贴到此文件夹中

现在本地和远程将有“相关历史”,并将愉快地合并或变基。


C
Cyebukayire

我遇到了同样的问题:这就是我所做的:

git pull origin main --allow-unrelated-histories

我使用 VsCode 来解决合并冲突,然后我做了:

git commit -m "提交信息"

git push origin 主要


A
AmerllicA

对于我的情况,我想将不相关的历史分支合并到我的当前:

git merge <-unrelated-history-branch-name> --allow-unrelated-histories

S
Syscall

通过切换 allow-unrelated-histories 开关可以解决该错误。在 git pull 或 git merge 命令之后,添加以下标签:

git pull origin master --allow-unrelated-histories

之后可能会发生冲突。所以解决了冲突并提交它。这对我有用。


W
Wenfang Du

投票最多的答案并没有解决这个问题,这是在变基的背景下。

同步两个分叉分支的唯一方法是将它们重新合并在一起,从而产生一个额外的合并提交和两组包含相同更改的提交(原始的提交,以及来自您的重新定位分支的提交)。不用说,这是一个非常混乱的情况。

因此,在运行 git rebase 之前,请始终问自己:“还有其他人在看这个分支吗?”如果答案是肯定的,请将您的手从键盘上移开,开始考虑一种非破坏性的方式来进行更改(例如,git revert 命令)。否则,您可以随意重写历史记录。

参考:https://www.atlassian.com/git/tutorials/merging-vs-rebasing#the-golden-rule-of-rebasing


只为“把你的手从键盘上移开”行投票
A
Andhi Irawan

我使用 rebase 多年,从未遇到过这样的问题。但是,您的第一个问题是,您尝试直接在远程存储库(称为 origin)的远程分支 development 上执行此操作。这实际上是错误的,因为 rebase 是一个危险的命令,它会重构 git 历史。话虽如此,您应该首先尝试本地存储库并仅推送它,如果它按预期对您有用。

所以,我通常的 rebase 工作流程如下所示(但请记住,你不应该在分支上使用 rebase,你不是唯一的一个委员会。对于这样的分支,如果适用,只需使用合并和解决冲突):

确保你有一个干净的工作树(没有取消提交的更改)结帐到你想要变基的分支(例如,假设它是主分支;作为单行命令): git checkout master && git pull origin master && git checkout development 做实际的变基: git rebase master 如果它完成并且一切都按预期工作,将它推送到你的遥控器。为此,您需要强制它,因为远程主机已经具有另一个顺序的历史记录,远程将回答没有推送。因此,我们需要说“我的本地历史版本是正确的,使用我的本地历史版本覆盖该远程分支上的所有内容”: git push -f origin development

正如我已经提到的,请记住,rebase 会操纵 git 历史记录,这通常是一件坏事。但是,可以在没有其他人承诺的分支上执行此操作。为了保持分支对其他开发人员的可拉性,请使用另一种合并策略,例如合并本身、squash 或cherrypick。所以,换句话说:Rebase 不应该是你的分布式开发工具。如果您是唯一在此存储库上工作的人,它对您来说很好。

我们使用特征分支策略。在这种情况下,我通常使用 rebase 来从其他开发人员那里获取“更新”,这同时发生在 master 分支上。这样做,它会减少在拉取请求中可见的提交的大小。因此,它使代码审查者更容易看到我在此功能分支中所做的更改。


在这种情况下,我实际上想继续使用变基,而答案并没有解决这个问题。我知道变基的风险以及何时应该和不应该使用 git-rebase。这是 git 工作流程的一般(固执的)指南,并不直接回答问题。就多年来使用 rebase 而言,这个特殊的错误是在 git v2.9.0 中添加的,并且该流程在该版本之前可以正常工作。您在此答案中发布的内容已在 stackoverflow.com/a/11566503/2670370git-scm.com/book/en/v2/Git-Branching-Rebasing 等更老的问题中得到解答
J
Jose Manuel Gomez Alvarez

在管理员在服务器端强制推送到具有数百次提交的开发分支后,我遇到了这个错误。

好吧,我只是想要的不是拉(提取+合并),而是将我的本地主机与远程源主机对齐。移动到一个单独的文件夹并执行 git clone 是一种方法,但我相信只是进行硬重置是更优雅的解决方案。

因此,在这种特殊情况下,我对这个错误的回答不是以上任何一种。我只是想要这个:

git reset --hard origin/master

D
Dharman

因为你既不能推,也不能拉和推,也不能合并拉和推:-

您可以在 GitHub 存储库上创建一个新分支。然后: - git add 。 git commit -m 'commitName' 并在终端的当前目录中引用该分支。 git branch -m master branchName git push -f origin branchName 你的代码将被推送到一个新的分支。然后你可以合并这两个分支。

这对我有用。


s
solstice333

fatal: refusing to merge unrelated histories 也可能是由浅克隆引起的,因为移植提交没有深入到看到公共基础


B
Bercove

我有同样的错误,这个命令对我有用

git pull gitlab master --allow-unrelated-histories

请注意,在您的情况下,gitlab 可能是 origin 或 heroku。


Z
Zeus

如果您有存储库的 shallow git clone,也会发生这种情况。

我最近在我的 CI/CD 设置中遇到了这个问题,以上解决方案都不适合我。我正在构建 CI/CD 管道来分析针对 MR 源分支创建 MR 的代码,为此,我需要在主分支上运行一次分析,然后在与主分支合并的 MR 源分支上运行,尝试合并时出现此错误通过 git merge 命令进行分支。

在 CI/CD 设置中发生这种情况的原因:通常在 CI/CD 环境中,git 存储库是用于加快速度的 shallow clone,它不包括提交的完整历史记录,因此当合并 git 可能会认为我们正在尝试合并不相关的分支,这实际上是不正确的。

解决方案:使用以下命令将浅层存储库转换为非浅层存储库:

git fetch --unshallow