首页 > 解决方案 > 使用 URL 时 Git fetch 不提取更改

问题描述

我正在尝试设置一个服务,该服务将在检测到远程分支上的更改时自动更新我的存储库。在任何人提到它之前,我知道在 URL 中嵌入密码是不好的做法。我目前正在使用:

git fetch https://<user>:<pass>@github.com/<org>/<repo>

这给出了以下输出:

From https://github.com/<org>/<repo>
 * branch            development -> FETCH_HEAD

当我git status在获取后运行时,它不会检测到最新的更改。

如果我在没有 URL 的情况下运行正常git fetch并手动提供用户名和密码,我会得到不同的输出:

From https://github.com/<org>/<repo>
   96353f7..e88782c  development -> origin/development

然后git status按预期运行并检测到远程分支上有更改。

我对 Git 不是很有经验,我觉得我错过了一些非常明显的东西。我的错误在哪里?

编辑

所以看起来缺少的部分是我在 URL 之后指定本地和远程分支:

git fetch https://<user>:<pass>@github.com/<org>/<repo> development:origin/development

正如公认的答案指出的那样:如果您不指定远程名称,git 会将远程更改放在默认的 FETCH_HEAD 中。这可以通过明确指定本地和远程分支来解决。

我仍然有点困惑为什么git fetch知道默认情况下从源远程获取,但是指定 URL 会改变这个默认值。但无论如何它现在都在工作

标签: gitgit-fetchgit-statusremote-repository

解决方案


Git 遥控器是与 URL 关联的名称。默认名称是origin,并且 URL 通常是您从中克隆的任何内容。

Git 将远程存储库的快照存储在“远程跟踪分支”中。这些是形式<remote-name>/<branch>。当你git fetch originGit 从关联的 URL 中获取更改origin并将它们放入远程分支时。development -> origin/development告诉你它把远程的开发分支放到你的origin/development远程分支中。

当你运行git fetch https://<user>:<pass>@github.com/<org>/<repo>并只给它 URL,没有远程名称时,Git 没有远程跟踪分支的名称。所以它只是把它们粘在一个短暂的地方FETCH_HEAD,记录你的最后一个git fetch。这development -> FETCH_HEAD就是告诉你的。


无论如何,git status都不会显示任何变化。git fetch永远不要更改您的本地分支机构、索引或结帐。它只会更新您的远程跟踪分支。这样可以安全地习惯性地运行git fetch以更新远程存储库的快照。

您正在寻找更新远程分支的本地副本的内容是git pull.


最后,为了避免每次都输入您的用户名和密码,或者更糟糕的是,将它们硬编码到 URL 中,设置一个 Git 凭证助手来安全地存储您的用户名和密码


推荐阅读