【问题标题】:Git refusing to merge unrelated histories on rebaseGit拒绝在变基上合并不相关的历史
【发布时间】:2016-10-22 14:55:26
【问题描述】:

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

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

我的 Git 版本是 2.9.0。它曾经在以前的版本中运行良好。

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

【问题讨论】:

  • @Shishya 恕我直言,投票最多的答案并没有直接解决这个问题。问题询问git-rebase 情况,而答案给出git-merge 的标志
  • @AsifMohammed 这不是accepted answer 的用途。由于默认按票数排序,人们将自动找到票数最多的答案。
  • 万一其他人犯了同样的错误,我在不小心使用git pull [repo URL]而不是git clone [repo URL]后得到了这个错误
  • 由于 title 没有指定这是在变基的上下文中,所以这里已经造成了混乱,所以你的问题是吸引那些正在在不同的情况下遇到此错误并支持实际上不适用于您提出的问题的答案。它现在不容易清理,因此不连贯的问答对将永远保留在网站上,并永远在 Google 搜索结果中居高不下。这个故事的寓意是问题标题很重要!

标签: git rebase


【解决方案1】:

自 Git 2.9 以来默认行为发生了变化:

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

请参阅Git release changelog 了解更多信息。

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

【讨论】:

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

在我的例子中,每次尝试的错误只是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 存储库,然后第一次将其拉到本地存储库,我总是会看到此错误。太烦人了。
  • 对于新的 repos,首先拉取,通常最好以 git clone 开头。
  • 这让我停了好几个小时,直到我意识到如果默认文件发生这种合并文件,必须有一个明显的解决方案 - 我很高兴我不是唯一一个至少有这个问题!
  • 就我而言,这是因为我在 github 添加了许可证文件。上面提到的命令(和下面,它们是相同的)起作用了。
【解决方案3】:

试试下面的命令:

git pull origin master --allow-unrelated-histories

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

【讨论】:

【解决方案4】:

我首先设置本地存储库时收到此错误。然后我去了 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 存储库,并且正在执行添加存储库的那些命令。
  • 这是一个非常好的答案。关键是你必须强制拉然后合并本地和远程仓库。
【解决方案5】:

为此,输入命令:

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
【解决方案6】:
git pull origin <branch> --allow-unrelated-histories

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

  • 插入提交信息
  • 然后按 Esc(退出“插入”模式), 然后是 :(冒号),然后是 x(小“x”) 最后按 Enter 退出 Vim
  • git push --set-upstream origin &lt;branch&gt;

【讨论】:

  • Ctrl+X 不会让你离开 Vim
  • 但是:x&lt;Enter&gt;
  • 感谢您指定如何退出;我完全迷失了,所有其他答案似乎都认为这是显而易见的!
【解决方案7】:

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

git pull origin branchName --allow-unrelated-histories

查看此page 了解更多信息。

【讨论】:

  • git merge origin/main localBranchName --allow-unrelated-histories 为我工作。
【解决方案8】:

我遇到了同样的问题。试试这个:

git pull origin master --allow-unrelated-histories 

git push origin master

【讨论】:

【解决方案9】:

1。解决问题

在执行git pull origin master时得到这个错误?:

fatal: refusing to merge unrelated histories

根据场景运行以下命令之一(之前是主命令,现在是主命令)

 git pull origin master --allow-unrelated-histories

 git pull origin main --allow-unrelated-histories
 

2。意义

  • 错误

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

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


参考文献


有关 StackOverflow 的更多信息

【讨论】:

    【解决方案10】:

    对于 Android Studio 和 IntelliJ:

    首先,提交一切并解决所有冲突。

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

    git pull origin master --allow-unrelated-histories
    

    现在你可以推送了。

    【讨论】:

    • 它是一个 git 命令,与 Android studio 或 Inteliji 无关
    • @AlpitAnand 是的,因为这个问题和android studio或者IntelliJ没有直接关系,但是我在android studio中写了处理这个问题的方式
    【解决方案11】:

    试试git pull --rebase development

    【讨论】:

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

    由于所有其他答案实际上都没有回答这个问题,这里有一个受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
    

    找出两个merge parent中的哪一个是被合并到当前的一个(可能是第二个,用git log 222222222验证),然后手工进行merge,复制原始merge的commit message提交:

    $ 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.
    

    【讨论】:

    • 这是所提问题的唯一实际解决方案。
    【解决方案13】:

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

    这对我有用:

    git push origin master --force
    

    【讨论】:

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

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

    git pull origin branchname --allow-unrelated-histories
    

    ** 分支名称在我的例子中是 master。

    当 pull 命令完成后,就会发生冲突。你应该解决冲突。我使用 Android Studio 来解决冲突。

    当冲突解决后,合并完成!

    现在你可以安全推送了。

    【讨论】:

    • 我一直在 AS 中寻找Resolve Conflict 的按钮。有时右下弹出/气球消失,我无能为力。谢谢@oiyio
    • 节省了我很多时间。
    【解决方案15】:

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

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

    然后我想要一个远程存储库,所以我在 GitHub 上创建了一个。 这里我错误地勾选了“Initialize this repository with a 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 步的正确解决方案
    • 这不是解决方案。如果您是初学者,那么您可以这样做,但是如果您正在处理一些实际项目,则应该以正确的方式处理。
    【解决方案16】:

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

    git pull origin master  --allow-unrelated-histories
    

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

    【讨论】:

    • 正如问题中提到的,我正在尝试做一个 git-rebase 而不是 git-pull,git-rebase 没有--allow-unrelated-histories 标志。
    【解决方案17】:

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

    1. 我将桌面存储库中的所有文件复制到另一个文件夹,然后删除了该文件夹。

    2. 然后我再次克隆 repo,因为它是一个新项目。

    3. 当我再次复制我的文件并推送它时,它就像魅力一样。

    【讨论】:

      【解决方案18】:

      在执行git pull 时,我收到了此消息fatal: refusing to merge unrelated histories 对于我有一段时间没有更新本地副本的 repo 模块。

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

      git reset --hard origin/master
      

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

      【讨论】:

      • 警告:这删除了我所有的文件。如果您不知道自己在做什么,请小心!
      • 这将删除所有未决的更改!
      • 如果您想要的是拉下原点上的内容并且不需要保留任何更改,这非常有用。
      • 我同意这将删除您的所有文件,请小心,在使用此命令之前,请先备份您的应用程序。
      【解决方案19】:

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

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

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

      【讨论】:

      • 请在飞机上用英文好吗?
      • @AgentZebra 对于复平面中的任何圆盘,连续闭合路径积分为 0。
      【解决方案20】:

      对于 Google 员工:

      如果您在 GitHub 上创建了一个新的存储库,并且不小心使用 README.gitignore 文件对其进行了初始化。

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

      然后:

      • 创建一个新文件夹
      • git clone
      • 将所有文件粘贴到此文件夹中

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

      【讨论】:

        【解决方案21】:

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

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

        【讨论】:

          【解决方案22】:

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

          git pull origin master --allow-unrelated-histories
          

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

          【讨论】:

            【解决方案23】:

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

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

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

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

            【讨论】:

            • 只为“把你的手从键盘上拿开”这一行点赞
            【解决方案24】:

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

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

            1. 确保你有一个干净的工作树(没有取消提交的更改)
            2. 结帐到您想要变基的分支(例如,假设它是master;作为单行命令):git checkout master &amp;&amp; git pull origin master &amp;&amp; git checkout development
            3. 做实际的变基:git rebase master
            4. 如果已完成并且一切正常,请将其推送到您的遥控器。为此,您需要强制它,因为远程主机已经具有另一个顺序的历史记录,远程将回答没有推送。因此,我们需要说“我的本地历史版本是正确的,使用我的本地历史版本覆盖该远程分支上的所有内容”: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 等更老的问题中得到解答
            【解决方案25】:

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

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

            这对我有用。

            【讨论】:

              【解决方案26】:

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

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

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

              git reset --hard origin/master
              

              【讨论】:

                【解决方案27】:

                fatal: refusing to merge unrelated histories 也可能是由浅克隆 b.c 引起的。移植提交没有深入到看到共同基础

                【讨论】:

                  猜你喜欢
                  • 2017-02-23
                  • 2017-12-29
                  • 2017-01-09
                  • 2017-09-02
                  • 2020-08-28
                  • 2018-11-06
                  • 2018-10-11
                  • 2020-10-03
                  • 2017-08-17
                  相关资源
                  最近更新 更多