【问题标题】:Why do i have refusing to merge unrelated histories message with git为什么我拒绝将不相关的历史消息与 git 合并
【发布时间】:2018-11-06 08:46:30
【问题描述】:

请注意我的问题不是“我应该怎么做?”,因为我已经阅读了有关堆栈溢出的其他问题。我知道我必须提供 --allow-unrelated-histories 参数。

我的问题是“为什么”。

这是我使用 git 版本 2.17.0.windows.1 完成的操作。 请注意,Linux 上的 git 版本 2.7.4 不会发生此错误:

我首先在 gitlab 上创建了一个空的仓库。 然后,我有 2 个用户,在 2 台不同的计算机上:

第一个用户:

git clone <repository_url>
cd myproject
touch file1.cpp
git add file1.cpp
git commit -m "file 1 creation"
git push origin master

第二个用户:

git clone <repository_url>
cd myproject
touch file2.cpp
git add file2.cpp
git commit -m "file 2 creation"
git pull

此时,我有这个错误信息:

致命:拒绝合并无关的历史

我不明白为什么我在 git windows 版本上而不是在 Linux 上出现此错误消息...

谢谢

【问题讨论】:

  • 第一个用户没有推也没有拉。这意味着他们与其他人隔离,所以他们是无关紧要的。那只剩下第二个用户了。如果其他人从根本上改变了存储库的历史,就可能发生这种情况。你能告诉我们第二个用户的git log --oneline --graph --decorate 吗?您正在寻找类似 @​​987654325@ 和 origin/master 彼此没有联系的东西。
  • 对不起,我犯了一个错误。第一个用户正在推送。我已经添加了缺失的行
  • 仍然不应该有那种效果。 git log --oneline --graph --decorate --all 会很有用。
  • 这可能会有所帮助。 stackoverflow.com/questions/37937984/… 请注意,您使用的是 2.17 和 2.7,在更改时正好跨过 2.9 行。

标签: git


【解决方案1】:

我先创建一个空的仓库

这就是问题所在。空存储库没有提交,因此当每个用户在拉取空存储库后执行git commit 时,他们正在创建唯一的根提交。因此,当一个推送而另一个尝试拉取时(已经在本地进行了 another 根提交),Git 会抱怨,因为上游与本地副本共享 no 提交。它们是完全不同的两个完全不相关的历史。

您可以通过确保在其他人拉取之前创建并推送初始提交来避免这种情况(因此每个人都有相同的根提交),或者使用--allow-unrelated-histories 绕过您提到的错误。就个人而言,我认为第一个选项更好。


至于为什么两个 Git 安装之间存在差异:正如@Schwern 评论的那样,this behavior was added in Git 2.9

【讨论】:

  • 伟大的观察!我会注意到比--allow-unrelated-histories 更好的解决方案是始终使用git pull --rebase=preserve。这会在遥控器上重放您的本地工作,就好像您一直在最新版本之上编写更改一样。这将无缝处理上述情况,或者上游分支已被重写的更常见情况。它还通过避免大量无意义的“更新”合并来保持历史整洁。你可以在你的配置git config --global pull.rebase preserve 中设置它。 (我在重现问题时遇到了麻烦,因为我设置了它。)
  • 是否可以在没有文件的情况下创建第一个提交?
  • @Bob5421是的,通过--allow-empty
猜你喜欢
  • 2017-12-29
  • 2017-02-23
  • 2016-10-22
  • 2020-10-03
  • 2017-01-09
  • 2017-09-02
  • 2020-08-28
  • 2018-10-11
  • 2019-12-17
相关资源
最近更新 更多