【问题标题】:FETCH_HEAD reference not updating correctly after "git fetch"FETCH_HEAD 引用在“git fetch”之后没有正确更新
【发布时间】:2012-07-13 18:44:14
【问题描述】:

我有一个从远程仓库拉取的本地仓库。运行 git pull 和 git fetch; git merge FETCH_HEAD 用于执行完全相同的操作,正如 description of git pull 所预期的那样:

描述

将来自远程存储库的更改合并到当前分支中。在其默认模式下,git pull 是 git fetch 后跟 git merge FETCH_HEAD 的简写。

目前,意外地,运行 git fetch 停止正确更新 FETCH_HEAD 引用。 FETCH_HEAD 现在被困在一个旧的提交上。运行 git fetch 会将所有更改下载到远程跟踪的分支,但 FETCH_HEAD 保持不变,无论它在哪个分支中运行。

# currently in branchone
> git fetch

# branchone is up to date since...
> git rev-parse branchone
593539e8a98ba5980d4b645db3b0f506bb9b6a2c

# ...its in the same commit as the remote branch
> git rev-parse origin/branchone
593539e8a98ba5980d4b645db3b0f506bb9b6a2c

# however FETCH_HEAD shows something different
> git rev-parse FETCH_HEAD
37301df96597ac037f8e7e846fea6fc7df77bea5

git pull 仍然执行正确的任务。但是运行git fetch; git merge FETCH_HEAD 会做一些不同的事情,因为FETCH_HEAD 指向一个不正确的提交。

是否有任何设置或问题可能会影响git fetch 的行为?

【问题讨论】:

    标签: git fetch


    【解决方案1】:

    试着强迫你的头指向已经完成的最新提交/推送。

    在您的 GIT 存储库中使用它:

    git reset --hard HEAD@{1}
    

    希望这可以解决您的问题,使其达到以前完美运行的地步。

    【讨论】:

    • 遗憾的是没有。即使将存储库重置为非常旧的版本也不会改变 git fetch 和 FETCH_HEAD 的行为。
    • 您可以尝试的另一件事是,删除整个本地存储库,然后再次克隆它。如果没有,我会进一步帮助你。我正在尝试评估您的本地存储库出了什么问题..
    • 在新存储库上,行为是相同的。 FETCH_HEAD 指向的提交是出现在.git/FETCH_HEAD 文件中的第一个提交。阅读它似乎是预期的行为,但我仍然怀疑为什么以前做 git fetch; git merge FETCH_HEAD 在任何分支上都能完美运行。
    • pull = fetch + merge,所以它总是有效的。 fetch 只会将最新的代码带到你的本地仓库。所以如果有来自其他地方的提交,你的 fetch_head 将指向最新的,因此指向不同的地方。如果没有提交,它应该可以工作,在你获取之后,然后 git merge FETCH_HEAD 就会工作。我假设你是唯一一个致力于你的 github 帐户的人。理想情况下,你不应该单独使用它们,使用 git pull 即 fetch + merge
    【解决方案2】:

    在没有任何选项的情况下运行git fetch 将获取远程中的所有引用并将它们写入.git/FETCH_HEAD 文件。该文件的内容通常如下所示:

    37301df96597ac037f8e7e846fea6fc7df77bea5 branch 'master' of github.com:user/repo
    593539e8a98ba5980d4b645db3b0f506bb9b6a2c not-for-merge branch 'branchOne' of github.com:user/repo
    

    当您在 .git 目录下有这样的文件时,您可以将其用作参考,只要该文件中的第一件事是 40 个字符的十六进制数字,或者实际匹配的较短的十六进制数字一个现有的提交。

    # This file can be used as a reference
    > cat .git/MAGIC_HEAD
    deadbeefdeadbeefdeadbeefdeadbeefdeadbeef lorem ipsum
    the rest does not really matter
    refrigerator
    
    # And thus it will be interpreted by many git commands like this
    > git rev-parse MAGIC_HEAD
    deadbeefdeadbeefdeadbeefdeadbeefdeadbeef
    

    知道这一点后,我们可以看到在运行 git fetch 之后,引用 FETCH_HEAD 将解析为第一行中发生的任何事情

    # Assuming the already mentioned contents of .git/FETCH_HEAD
    > git rev-parse FETCH_HEAD
    37301df96597ac037f8e7e846fea6fc7df77bea5
    

    似乎.git/FETCH_HEAD 的内容顺序不能保证首先包含当前分支的引用。

    通过在不同的存储库中尝试它,似乎在某些情况下第一行始终是当前分支,因此git fetch; git merge FETCH_HEAD 按预期工作。然而,在其他存储库中,.git/FETCH_HEAD 的内容会以不同的顺序排列,并且第一行通常是对不同分支的远程提交的引用,从而使 FETCH_HEAD 引用不正确。

    为什么它的行为不同对我来说是个谜。

    作为一种解决方案,如果使用git fetch remote_name branch_name,则仅获取此特定分支,并且仅该单行将出现在.git/FETCH_HEAD 的内容中,从而使FETCH_HEAD 引用始终正确。

    # Will only fetch branchone
    > git fetch origin branchone
    
    # FETCH_HEAD will contain only a single line
    > cat .git/FETCH_HEAD
    593539e8a98ba5980d4b645db3b0f506bb9b6a2c branch 'branchOne' of github.com:user/repo
    

    【讨论】:

      【解决方案3】:

      在你运行git fetch(不带参数)之后,FETCH_HEAD 将只包含一个对合并有效的引用(即未标记为不合并)如果当前本地分支(即HEAD)是一个跟踪分支。

      解决方案是将当前分支设为跟踪分支(参见How do you make an existing Git branch track a remote branch?)或指定要获取的远程和分支(即git fetch origin branch

      【讨论】:

      • 我正在处理的所有分支都已经在跟踪远程分支的分支。在您再次引起我注意这个问题后,我重新回答了我的答案,以更好地解释为什么 FETCH_HEAD 参考无法正确更新。也许它确实与您提到的有关,并且.git/FETCH_HEAD 中的第一行仅在我不知道的其他情况下才得到保证。
      猜你喜欢
      • 2013-02-08
      • 2020-08-24
      • 2017-01-15
      • 2017-06-19
      • 1970-01-01
      • 1970-01-01
      • 2014-01-04
      • 2023-03-10
      • 2019-05-05
      相关资源
      最近更新 更多