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

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

fatal: refusing to merge unrelated historiesError redoing merge 1234deadbeef1234deadbeef

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

我怎么能继续这个rebase允许与新版本中引入的强制标志无关的历史?

2447240 次浏览

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

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

“git合并”用于允许合并两个没有公共分支的分支默认情况下的基础,这导致了现有的一个全新的历史项目创建,然后被一个毫无戒心的维护者拉走,这允许不必要的并行历史合并到命令已经被教导不要允许这样做默认,带有转义舱口--allow-unrelated-histories选项在一个罕见的事件中使用,融合了两个项目的历史独立生活的人

有关更多信息,请参阅git发布变更日志

更多信息可以在这个答案中找到。

我也在努力解决这个问题,但我设法找到了一个解决办法。

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

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

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

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

git pull origin branchname --allow-unrelated-histories

根据2.9.0发行说明-git pull已被教导将--allow-unrelated-histories选项传递给底层git merge

尝试git pull --rebase development

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

git remote add origin <repository url>

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

这是我如何修复它:

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

尝试以下命令:

git pull origin master --allow-unrelated-histories

这应该能解决你的问题。

由于所有其他答案实际上并没有回答这个问题,这里有一个受相关问题这个答案启发的解决方案。

所以你得到了你的错误git rebase

$ git rebase origin/developmentfatal: refusing to merge unrelated historiesError redoing merge 1234deadbeef1234deadbeef

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

$ git statusinteractive rebase in progress; onto 4321beefdeadLast command done (1 command done):pick 1234deadbeef1234deadbeef test merge commit

所以你现在可以手动进行合并。找出原始合并提交的父提交:

$ git log -1 1234deadbeef1234deadbeefcommit 1234deadbeef1234deadbeefMerge: 111111111 222222222Author: Hans DampfDate:   Wed Jun 6 18:04:35 2018 +0200
test merge commit

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

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

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

git pull origin master --allow-unrelated-histories
git push origin master

为此,输入命令:

git pull origin branchname --allow-unrelated-histories

例如,

git pull origin master --allow-unrelated-histories

参考:

GitHub无关的历史问题

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

我首先创建了一个本地存储库。我将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 behindhint: 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/myTODsbranch            master     -> FETCH_HEADfatal: refusing to merge unrelated histories**

我试过:

git pull origin master --allow-unrelated-histories

结果:

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

解决方案:

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

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

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

这对我有效:

git push origin master --force

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

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

  1. 确保你有一个干净的工作树(没有未提交的更改)
  2. 签出到您要重新建立的分支(例如,假设它是master;作为单行命令):git checkout master && git pull origin master && git checkout development
  3. 执行实际的rebase:git rebase master
  4. 如果完成并且一切都按预期工作,将其推送到您的远程。为此,您需要强制执行,因为远程主机已经以另一个顺序拥有历史记录,远程主机将回答没有任何推送。所以,我们需要说“我的本地历史版本是正确的,使用我的本地历史版本覆盖远程分支上的所有内容”:git push -f origin development

正如我已经提到的,请记住,rebase会操纵git历史记录,这通常是一件坏事。然而,在没有其他人提交的分支上这样做是可能的。为了保持分支对其他开发人员的可拉取性,请使用另一种合并策略,如合并本身、壁球或樱桃选择。所以,换句话说:Rebase不应该是你在分布式开发上的工具。如果你是唯一一个在这个存储库上工作的人,它对你来说很好。

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

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

git pull origin master  --allow-unrelated-histories

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

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

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

git reset --hard origin/master

它固定在我的情况下。

对于Android Studio和IntelliJ:

首先,提交一切并解决任何冲突。

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

git pull origin master --allow-unrelated-histories

现在你可以推了。

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

git pull origin branchname --allow-unrelated-histories

**分支名称在我的情况下是大师。

当拉取命令完成时,冲突发生。您应该解决冲突。我使用androidStudio来解决冲突。

在此输入图片描述

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

现在你可以安全地推了。

我尝试了git pull --allow-unrelated-histories,但没有成功,但这为我解决了问题:

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

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

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

如果您在GitHub上创建了一个新的存储库,并意外地使用README.gitignore文件初始化了它。

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

然后:

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

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

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

git pull origin branchName --allow-unrelated-histories

查看此页面以获取更多信息。

Blue112的回答并不能解决这个问题,这是在rebase的背景下。

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

所以,在你运行git rebase之前,一定要问自己,“还有人在看这个分支吗?”如果答案是肯定的,那就把手从键盘上拿开,开始考虑一种非破坏性的方式来进行更改(例如,git revert命令)。否则,你可以随心所欲地重写历史。

参考:重写的黄金法则

1.解决问题

执行git pull origin master时出现错误:

fatal: refusing to merge unrelated histories

运行以下命令之一

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

如果它打开纳米编辑器,您可以保存并关闭Ctrl+X

现在将更改推送到本地

 git push

2.含义

  • 的错误

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

  • get-合并命令(来自GitHub留档):

    --允许-无关-历史

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

在此处输入图片描述


参考文献


更多关于Stack Overflow

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

  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. 然后你可以合并这两个分支。

这对我有用。

通过切换allow-unrelated-histories开关解决错误。在Git拉取或Git合并命令后,添加以下标签:

git pull origin master --allow-unrelated-histories

在那之后,也许你会遇到冲突。所以解决冲突,并承诺。这对我很有效。

对于我的案例,我想将一个不相关的历史分支合并到我的当前:

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

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

好吧,我只是没有想拉取(获取+合并),但只是为了将我的本地主服务器与远程原始主服务器对齐。移动到一个单独的文件夹并进行Git克隆是一种方法,但我相信这是更优雅的解决方案只是做一个硬重置。

所以我对这个错误的回答,在这个特殊的情况下,不是上述任何一个。

我只是想要这个:

git reset --hard origin/master

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

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

git pull gitlab master --allow-unrelated-histories

请注意,在您的情况下,gitlab可能是起源heroku

我遇到了同样的问题:

这就是我所做的:

git pull origin main --allow-unrelated-histories

我使用Visual Studio Code解决合并冲突,然后我做了:

git commit -m "commit message"
git push origin main

如果您有存储库的 Git克隆,也会发生这种情况。

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

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

解决方案

使用以下命令将浅存储库转换为非浅存储库:

git fetch --unshallow

我相信这是一种非常罕见的情况;您已删除遥控器(例如origin):

git remote rm origin

然后,一段时间后,出于某种原因,您尝试将其添加回来,但输入了错误的URL。

git remote add origin git@github.com:example/wrong.git

当然,解决方案是使用正确的URL:

git remote add origin git@github.com:example/correct.git