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

Posted

技术标签:

【中文标题】Git 因致命错误而失败。拒绝将不相关的历史与 git push 合并?【英文标题】:Git failed with a fatal error. refusing to merge unrelated histories with git push? 【发布时间】:2020-10-03 20:53:56 【问题描述】:

我在本地进行了一些更改,我正在尝试将其推送到 github。我读过我可以使用--allow-unrelated-histories,但只看到了演示如何为拉动执行此操作的示例,这不是我需要的。我需要让我的本地目录成为主目录。

我尝试了以下命令: git push origin master --allow-unrelated-histories

但它不起作用,我收到一条消息说这是一个未知选项。

我通常与 Visual Studio 合作。我在那里遇到了错误,当谈到 bash 时,我对 git 一点也不流利。我用 gitignore 文件等 git 猛击我的文件夹,并尝试进行更改。如果可能的话,我更愿意从 Visual Studio 执行此操作,但我也不知道如何从 Visual Studio 修改选项。

编辑:显然我想做的实际上并不可行。我发现 pull 命令做了我所期望的“有点”,但不是真的。我尝试更改所有提交的用户名,但没有白费,因为 github 仍然会保留错误的用户名。现在每个提交都只是用正确和不正确的用户名加倍。

【问题讨论】:

【参考方案1】:

基本技巧:从干净的源中提取,复制更改的文件..

在 gitlab 上,你必须 UNROTECT 你的主分支(在设置→存储库中)

另外,如果你的 git 太旧,--allow-unrelated-histories 可能无法实现,你可以push --force origin master,但请记住,它甚至可能不会弄乱你的 repo ,还有所有远程客户端可能不得不再次pull --forceclone

看这里(长时间讨论) Git refusing to merge unrelated histories on rebase

【讨论】:

【参考方案2】:

您是否非常关心保留您的提交历史记录?

如果没有,你可以

git reset --soft <commit before it all went to hell>

git status(检查您想要的一切是否已上演)

git commit -m “<commit message>“

git log(查看提交历史并确保它是你想要的)

git push -f

这将保留您对本地所做的更改,同时允许您使用刚刚修改的历史记录覆盖远程。

【讨论】:

【参考方案3】:

--allow-unrelated-histories 标志仅适用于合并。由于git push 不会合并(永远),它没有--allow-unrelated-histories 选项。 (将此与 git pull 命令进行对比,该命令确实有时——嗯,经常,真的——运行git merge。)

我尝试更改所有提交的用户名...

您不能更改任何现有提交的任何内容。所有提交都是 100% 只读的。

可以做的是进行一系列提交,其中包含一些您不喜欢的内容——例如作者和/或提交者的姓名和/或电子邮件地址——以及将它们复制到新的和改进的提交中,否则它们是相同的,但已更正了此问题。看来这一定是你所做的,因为:

... [在] pull 命令之后...每次提交都简单地用正确和不正确的用户名加倍。

当然,这种加倍正是您在进行更正提交时所做的。你告诉 你的 Git 放弃旧的(不正确的)提交,转而支持新的改进提交,它确实做到了。但是另一个 Git 存储库——GitHub 上的那个——仍然有,并且有,不正确的提交。然后,您告诉您的 Git 获取他们拥有的任何提交,而您没有 - 在这种情况下是您刚刚丢弃的提交 - 然后将它们与您拥有但他们没有的提交结合起来,在这个案例是您新的和改进的替代品。

您必须放弃加入合并,通常通过git reset。这会让你回到用新的和改进的副本替换旧的和不正确的提交的情况——即,回到你运行git pull 之前的位置。您现在又回到了原来的位置:您仍然需要说服 GitHub 上的 Git 放弃 旧的和不正确的提交,转而支持新的和改进的提交。

为此,您必须使用git push --forcegit push --force-with-lease。您还必须拥有执行此操作的权限,但如果 GitHub 存储库在您的控制之下,则情况已经如此,或者易于设置(您必须告诉 GitHub 禁止什么,所以如果您没有强制禁止自己-push 早一点,你现在不需要改变任何东西)。

请注意,丢弃任何给定的提交必然会丢弃所有后续提交。因此,如果您想保留其他提交,您必须首先将 那些 复制到新的和改进的提交中,其改进是它们附加到您现有的新的和改进的提交中。

【讨论】:

以上是关于Git 因致命错误而失败。拒绝将不相关的历史与 git push 合并?的主要内容,如果未能解决你的问题,请参考以下文章

Git 因致命错误而失败 - 无法读取用户名终端提示已禁用

致命:添加 git remote 后拒绝合并不相关的历史记录

将项目上传到github时如何解决“拒绝合并不相关的历史”?

Cython prange 因致命 Python 错误而失败:PyThreadState_Get:没有当前线程

text 致命的:拒绝合并不相关的历史

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