Git拒绝合并关于rebase的无关历史

时间:2016-06-21 07:23:00

标签: git rebase

git rebase origin/development期间,git:

显示以下错误消息
fatal: refusing to merge unrelated histories
Error redoing merge 1234deadbeef1234deadbeef

我的git版本是2.9.0。用于在以前的版本中正常工作。

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

26 个答案:

答案 0 :(得分:2062)

自git 2.9以来,默认行为已发生变化:

  

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

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

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

答案 1 :(得分:873)

就我而言,在远程添加git repo之后,每个特别是第一次拉取请求的错误只是fatal: refusing to merge unrelated histories

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

git pull origin branchname --allow-unrelated-histories

答案 2 :(得分:499)

尝试以下命令

git pull origin master --allow-unrelated-histories

这可以解决你的问题。

答案 3 :(得分:203)

首先设置本地存储库时出现此错误。然后去了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

答案 4 :(得分:132)

为此,请输入命令:

git pull origin branchname --allow-unrelated-histories

例如:

git pull origin master --allow-unrelated-histories

参考:

Github unrelated histories issue

答案 5 :(得分:91)

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

git pull origin master --allow-unrelated-histories 

git push origin master

答案 6 :(得分:54)

我运行了此命令,问题得到解决。1

git pull origin branchName --allow-unrelated-histories

答案 7 :(得分:49)

对于Android Studio和IntelliJ:

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

然后从IDE的下面打开终端,然后输入:

git pull origin master --allow-unrelated-histories

现在您可以推动了。

答案 8 :(得分:42)

发生这种情况的两种可能性-

  1. 您已经克隆了一个项目,并且.git目录被删除或损坏。这会导致Git不了解您的本地历史记录,因此,当您尝试推入或拉出远程存储库时,它将导致该错误引发此错误。

  2. 您已经创建了一个新的存储库,向其中添加了一些提交,现在您正尝试从已经具有自己的提交的远程存储库中提取信息。在这种情况下,Git也会抛出错误,因为它不知道两个项目之间的关系。

解决方案

git pull origin master --allow-unrelated-histories

Ref-https://www.educative.io/edpresso/the-fatal-refusing-to-merge-unrelated-histories-git-error

答案 9 :(得分:40)

尝试git pull --rebase development

答案 10 :(得分:33)

git pull origin <branch> --allow-unrelated-histories

您将被引导至Vim Edit

  • 插入提交消息
  • 然后按Ctrl + X退出VIM
  • git push --set-upstream origin <branch>

答案 11 :(得分:29)

由于所有其他答案均未真正回答问题,因此这是受this answer启发而解决的一个相关问题的解决方案。

所以在执行git rebase时会出错:

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

此错误实际上并未取消变基,但您现在处于中间位置:

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

答案 12 :(得分:26)

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

git pull origin branchname --allow-unrelated-histories

**在我的情况下,分支名称是master。

完成pull命令后,就会发生冲突。您应该解决冲突。我使用Android Studio解决冲突。 enter image description here

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

现在您可以放心了。

答案 13 :(得分:23)

通常在您第一次提交到远程存储库时发生。 由于错误明确指出“拒绝合并无关的历史记录”,因此我们需要使用--allow-unrelated-histories标志。

git pull origin master  --allow-unrelated-histories

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

答案 14 :(得分:21)

我有同样的问题。问题很遥远,有东西阻止了这个。 我首先创建了一个本地仓库。我在本地添加了LICENSE和README.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

答案 15 :(得分:12)

我也很努力,但设法找到了解决方法。

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

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

答案 16 :(得分:12)

我尝试git pull --allow-unrelated-histories无效,但是为我解决了这个问题的是:

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

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

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

答案 17 :(得分:12)

在进行git pull时,我收到了此消息fatal: refusing to merge unrelated histories 一个回购模块,其中我有一段时间没有更新本地副本了。

我运行此命令只是为了从原点刷新本地。我只是想从远程获取最新信息,而无需进行任何本地更改。

git reset --hard origin/master

这对我来说是固定的。

答案 18 :(得分:6)

对于Google员工:

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

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

然后:

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

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

答案 19 :(得分:6)

这对我有用:

git push origin master --force

答案 20 :(得分:6)

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

git pull origin master --allow-unrelated-histories

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

答案 21 :(得分:5)

就我而言,我想将不相关的历史分支合并到当前分支:

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

答案 22 :(得分:1)

因为你既不能push也不能pull-and-push也不能merge-pull-and-push:-

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

这对我有用。

答案 23 :(得分:0)

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

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

  1. 确保您的工作树干净(没有未提交的更改)
  2. 检出要作为基准的分支(例如,假设它是master;作为单行命令):git checkout master && git pull origin master && git checkout development
  3. 执行基本的底薪:git rebase master
  4. 如果已完成并且一切正常,请将其推送到您的遥控器。为此,您需要强制执行此操作,因为远程主机已经具有另一种顺序的历史记录,因此远程将不作任何响应。因此,我们需要说“我的历史记录的本地版本正确,请使用我的历史记录的本地版本覆盖该远程分支上的所有内容”:git push -f origin development

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

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

答案 24 :(得分:0)

我看到投票最多的答案不能解决这个问题,这是在重新定级的情况下。

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

因此,在运行git rebase之前,请始终问自己:“是否还有其他人在看这个分支?”如果答案是肯定的,请从键盘上放开手,然后开始考虑进行无损更改的方法(例如,git revert命令)。否则,您可以安全地随意重写历史记录。

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

答案 25 :(得分:0)

进行[Import(typeof(IProductService))] public static IProductService ProductService { get; set; } [Import(typeof(IProductRepository))] public static IProductRepository ProductRepository { get; set; } var catalog = new DirectoryCatalog(GlobalVariables.ApplicationAssemblyPath, "*.dll"); container = new CompositionContainer(catalog); ProductRepository = container.GetExportedValue<IProductRepository>(); ProductService = container.GetExportedValue<IProductService>(); 时出现

错误

git pull origin master

解决了此命令

fatal: refusing to merge unrelated histories