【问题标题】:GitHub error - Updates were rejected because the remote contains work that you do not have locallyGitHub 错误 - 更新被拒绝,因为远程包含您在本地没有的工作
【发布时间】:2021-07-30 20:11:16
【问题描述】:

我正在使用 Visual Studio 2019,并且 github 更新是通过菜单而不是命令行完成的。上周我在尝试推送我的提交时遇到了一个错误:

rejected 更新被拒绝,因为远程包含您在本地没有的工作

为了修复,我去了 github.com重命名了项目。我能够推送 几次更新,但现在我再次收到错误

我是唯一一个使用这个项目的人,而且这个项目是私有的,这怎么可能?

【问题讨论】:

  • 这能回答你的问题吗? Github "Updates were rejected because the remote contains work that you do not have locally."。顺便说一句,当您输入问题的标题时,SO 会回复很多建议,从而节省您发帖的需要
  • 我刚刚尝试在 github 上重命名项目,但仍然出现错误。远程怎么能包含不存在的工作?
  • 这个错误不只是发生。您已经提到您一直在 GitHub 端执行操作,您确定您没有说通过 GitHub GUI 编辑 README 吗?这是一种常见的做法,会导致上述错误。上面的链接中解释了这一点以及更多内容。重命名项目有点extreme 并不能解决根本问题。我很好奇你为什么不只是出于好奇而执行git pull(即使你是唯一的作者)
  • 不,我从未接触过自述文件。我已经提交了数百个项目,这在以前从未发生过。
  • “我可以拉一下并告诉它保留我现有的所有代码吗?” - 可以! :) 如果pull 有问题,您可以undo itOr this。在 UI 中可能更容易。 VS 2019 Preview 可能会有一些不同。不要忘记您可以随时在您的 PC 上的不同文件夹中再次执行git clone,然后比较目录内容以测试 GitHub

标签: git visual-studio github push


【解决方案1】:

这可能是因为 repo 损坏和一些错误的提交/推送,而文件已直接在 GitHub 上在线修改(例如 README.md):这会导致“spaghetti”。

从项目的根文件夹,你需要FetchPull

现在你应该可以推送了。

如果出现问题,您可以再次尝试PullFetch

您也可以尝试备份没有.git的文件夹,还原全部,恢复保存的本地文件并再次提交/推送

如果仍然存在,你可以试试这个,它可以帮助我快速解决这个问题:

  • 制作整个目录树的副本(在出现问题时使用.git),
  • 删除.git文件夹,
  • 重新创建本地存储库,
  • 再次配置连接到GitHub(恢复.git/config并检查HEAD文件),
  • 在必要的分支上从原点获取和拉取(如果需要,在本地创建它),
  • 不要忘记 master/main 分支和所有需要的分支,
  • 在没有.git的情况下从备份文件夹中恢复本地文件,同时在相关分支上,
  • 提交并推送。

您可以查看TortoireGit,通过带有图标的文件资源管理器集成进行简单、快速和高级的管理。

您可以将它与 Visual Studio 的 TGit 插件结合使用。

还有 Total Commander x64 插件WDX GitCommander,例如可以在列中显示当前分支和上次提交。

【讨论】:

  • "you need to Fetch and Pull" - "...git pull is shorthand for git fetch followed by git merge ... 所以不需要执行显式的fetch (git-scm.com/docs/git-pull )
  • @MickyD 理论上......但在现实世界中,有时我需要获取和拉取,或者拉取和获取。我承认我是 git 新手,我很难理解 pull 和 fetch 之间的区别,尤其是我刚才所说的,特别是因为有时它让我再次 fetch/pull 和/或 pull/fetch 以获得正确的结果,我有时说。但它必须要么来自我的无知,TortoiseGit 或其他。用对我有用的方法回答 OP,我重新阅读了文档,它告诉 pull 是一个特殊的 fetch+merge,所以如果我理解,会有一点区别,但我还是不明白。
  • 如果您的意图是将最近的远程更改合并到您的本地分支中,那么只需执行git pullgit fetch 顾名思义只是下载,但就您的工作副本而言,似乎没有任何改变。但是,如果要刷新“远程分支”列表,显式 git fetch 很有用。例如如果您执行拉取请求并且您的更改合并并在服务器上删除了功能分支,则该分支在 Visual Studio 中仍显示为幽灵。使用prune 选项执行fetch 将使该分支消失。 VS 有一个 GUI 选项 :)
  • fetch-pullpull-fetch 或简单的pull 都没有坏处。唯一的区别是远程的额外微小流量,而且 Git 足够聪明,如果不需要的话,不会加倍下载。现代用户界面也让这一切变得更容易
【解决方案2】:

有多种方法可以解决这个问题。

选项 1:

通过git pull 更新您的本地存储库。这会将您的本地 repo 与远程 repo 合并,添加和删除远程上的任何新内容。这要求您的 git 历史记录相同。

选项 2:

git clone 远程仓库,创建一个包含所有新更改的新本地仓库。

注意,更改 github 中的某些内容会导致它创建新的提交,从而更改历史记录。

【讨论】:

  • 我不想这样做,因为我正在使用的本地版本是正确的版本。尝试将 github 上的任何内容与我已知的好项目合并或克隆对我来说毫无意义。
  • 据我所知github不使用项目名称来标识项目。必须有一个基础标识符。所以假设我的初始项目被命名为 Proj。我终于能够通过将 github 上的项目重命名为 Proj-2021-05-08 然后创建一个名为 Proj 的新项目并将我的代码复制到新项目中来解决这个问题。 Github 将此项目视为一个新项目。
  • @Madison320 实际上与 GitHub 无关,而是与 Git 无关。我不知道 repo 是否有 ID,但每次提交都会。任何 repo 中的提交都将具有唯一的 ID (SHA-1 hash of your commit)。如果您尝试push 到您前面的遥控器,您将需要pull。但是,如果您的第一个本地提交的 ID 与远程的第一个提交的 ID 不同,这是一个好兆头,您没有首先 git clone 并且任何拉/合并都会失败。你现在拥有的是一个孤立的回购
  • @Madison320 显然它不是正确的版本,因为 git 是这样说的。更改 github 上的某些内容(例如 README)将创建并推送新的 git 提交,从而更改历史记录。
  • @MickyD 不,实际上它确实与 GitHub 有很大关系。假设他们是唯一一个在 GitHub 存储库上工作的人,那么解释为什么他们的本地存储库没有与远程同步的唯一原因就是在 GitHub 上更改了一些内容。
猜你喜欢
  • 2013-08-22
  • 2022-01-08
  • 2020-08-07
  • 2018-03-29
  • 2020-01-09
  • 2018-08-16
相关资源
最近更新 更多