"git fetch <url>" 和 "git add remote upstream <url>" 后跟 "git fetch upstream" 有什么区别?

What's the difference between "git fetch <url>" and "git add remote upstream <url>" followed by "git fetch upstream"?

我试图将更改从上游拉到我的分支中。我试过git fetch https://github.com/someuser/someproject,但它固执地拒绝做任何事情。它只是说了一些完全神秘的话,什么也没做,即:

From https://github.com/someuser/someproject
 * branch            HEAD       -> FETCH_HEAD

但是当我将 URL 添加为命名遥控器时,情况发生了变化:

> git remote add upstream https://github.com/someuser/someproject.git
> git fetch upstream
remote: Counting objects: 340, done.
remote: Compressing objects: 100% (268/268), done.
remote: Total 340 (delta 145), reused 18 (delta 16), pack-reused 44
... etc ...

那有什么区别呢?为什么当我指定一个遥控器而不先添加它时它什么都不做?当我试图从 URL?

中获取时,它究竟告诉我什么

我不是这方面的专家,所以我使用 Google 和 the man pages 来帮助拼凑出正在发生的事情。

This question 应该揭开事物的 FETCH_HEAD 方面的神秘面纱。我真的不可能通过阅读你的问题来判断你的回购协议的状态,但大概你的 FETCH_HEAD 指向远程回购协议中 HEAD 中的最新提交,无论发生什么是。您可能已经在您的系统上进行了这些提交,因此 git 所做的只是更新 FETCH_HEAD。您可能想提供一个分支。

添加远程分支后,您将获得额外的功能,例如默认分支和远程跟踪分支。我相信您的第二个命令的行为有所不同,因为 git 正在采用一些隐式逻辑来执行通常需要的操作。直接从 URL 中获取更像是一种高级操作,因此您得到的假设更少。

这个故事的寓意是,如果您想让事情顺利进行,请添加一个遥控器。否则,请准备好应对更多底层细节。

当您使用 URL 获取时,您还必须指定要获取的 <refspec>,即分支或标签,否则它只会获取默认的 HEAD将远程 URL 设置为 FETCH_HEAD,这可能不是您想要的。

语法是可选的 + 后跟 <src>:<dst>。如果省略 <dst>,将使用 FETCH_HEAD

例如:

git fetch https://github.com/someuser/someproject refs/heads/master:upstream/master

这将在本地创建 upstream/master 远程分支。

More advanced options are available.