【问题标题】:Git fetch upstream doesn't see recent updatesGit fetch upstream 没有看到最近的更新
【发布时间】:2021-03-25 12:30:40
【问题描述】:

我尝试使用的工作流程:
upstream/main_branch -> myfork/main_branch。
最初通过 git clone 然后使用 git reset --hard upstream/main_branch
myfork/main_branch -> myfork/feature_branch。
最初通过git checkout -b "feature_branch 然后git rebase main_branch
myfork/feature_branch -> upstream/main_branch。
通过 GitHub 拉取请求

我的问题是:我确信这个过程在过去可以正常工作,但是当我现在尝试从 upstream/main_branch 更新我的 myfork/feature_branch 时(为了那时update myfork/feature_branch) 获取更新失败。

    git checkout myfork/main_branch
    git fetch upstream

退出非常快并且没有我知道的最新提交在上游分支 当我跑步时

    git branch -avv

远程分支已列出,但仍显示旧提交。

之前运行git fetch upstream refs/heads/main_branch:refs/remotes/upstream/main_branch 已解决此问题。但我想知道为什么会发生这种情况以及为什么会进入这种状态? (我主要使用 IntelliJ Idea Git 工具)

提前致谢。

【问题讨论】:

  • 您能否提供重现您的设置的确切步骤?目前还不清楚您做了什么以及为什么必须在您的分支上使用 git reset --hard。
  • 我这样做只是为了获取上游 main_branch 的本地副本,而无需重新设置...
  • 是的,但是:如果你的本地分支和远程是绑定的,我认为你只需要获取/拉取。它仍然取决于细节,因此我要求minimal reproducible example。
  • git pull 表示运行git fetch,然后运行第二个 Git 命令。第二个命令默认为git merge,除非你告诉Git让它默认为git rebase,但可以在你运行git pull时指定。我几乎从不使用git pull,因为要知道我想要哪个第二个命令,我必须先获取并查看我得到了什么,然后获取没有意义,所以我应该自己运行第二个命令一旦我弄清楚什么是的。
  • 在任何情况下:检查是否有东西将upstream 设置为单分支远程,而不是完整的远程。使用git config --get remote.upstream.fetch。对于成熟的遥控器,输出是+refs/heads/*:refs/remotes/upstream/*,但对于单分支的输出是别的。

标签: git github intellij-idea


【解决方案1】:

TL;DR 总结

要修复这个特定的单分支远程,运行:

git remote set-branches upstream "*"

如果这不起作用,请参阅下面较长的部分:

这里的双引号用于 Unix 风格的 shell,我相信在 CMD.EXE 中应该是无害的(虽然我不使用 Windows)。

详细说明

我不确定你做了什么创建这个状态,但基于comments,upstream 似乎被创建为单分支远程.1 要检查这一点,请运行:

git config --get-all remote.upstream.fetch

(注意这里的remote.upstream.fetch;对于名为r 的遥控器,它只是remote.r.fetch;对于origin,它是remote.origin.fetch;等等)。这列出了默认 git fetch 操作将获取的内容。正常的(每个分支)设置将显示为:

+refs/heads/*:refs/remotes/upstream/*

(再次注意,upstream 这个词嵌入在文本中:这会根据遥控器的名称而变化)。分支X 的单分支设置为:

+refs/heads/X:refs/remotes/upstream/X

(注意upstream 仍然出现一次,但X 出现两次)。 “两个分支”获取将读取:

+refs/heads/X:refs/remotes/upstream/X
+refs/heads/Y:refs/remotes/upstream/Y

等等。 git remote 命令可用于更改这些设置:

git remote set-branches upstream "*"

不过,在进行一些试验时,我在git remote set-branches 中发现了一个错误。如果运行为:

git remote set-branches upstream

它删除所有获取设置,之后git remote 无法添加新设置!在这种情况下,您可能希望直接使用git config。

使用git config时可以写:

git config remote.upstream.fetch "+refs/heads/*:refs/remotes/upstream/*"

这将创建remote.upstream.fetch 设置(如果不存在),或者替换single 设置(如果存在单个设置)。但是,因为 fetch 设置是允许多值的,所以会报错:

$ git config remote.upstream.fetch "+refs/heads/*:refs/remotes/upstream/*"
warning: remote.upstream.fetch has multiple values
error: cannot overwrite multiple values with a single value
       Use a regexp, --add or --replace-all to change remote.upstream.fetch.

在这种情况下,添加--replace-all 有效:

git config --replace-all remote.upstream.fetch "+refs/heads/*:refs/remotes/upstream/*"

作为另一种选择(无论如何我通常将其用作第一选择),您可以运行 git config --edit 或 vim .git/config 并使用合理的编辑器编辑文件。不过一定要使用 sensible 编辑器;太多的编辑坚持将文件转换为带有 XML 或其他标记的富文本,或者将文件转换为 UTF-16 混乱,或其他。


1在普通的命令行 Git 中,如果你运行,你会得到这个:

git remote add -t <branch> upstream <url>

使用给定的 url 和 branch 作为其单个分支创建名为 upstream 的远程。

【讨论】:

  • 感谢您的详细回复。不知道我是如何做到这一点的,但也许这是默认设置,然后你使用分支的 github 克隆,因为我所在的分支是我多年前第一次克隆时所在的分支..
猜你喜欢
  • 2015-07-20
  • 2018-09-21
  • 2018-12-09
  • 2017-06-19
  • 2017-01-15
  • 2013-03-14
  • 1970-01-01
  • 2012-07-13
  • 2018-12-15
相关资源
最近更新 更多