我在Git中理解以下命令背后的逻辑时遇到了问题:
git checkout -b hotfix_example_1 origin/master
如果我输入它,则会创建一个名为 修补程序 的本地分支,该分支从 主 分支分支出来我的远程存储库名为 origin 。当我稍后将其推送到我的远程存储库时,图形如下所示:
假设某位同事进行了更改并将其推送到 远程主控 分支,稍后我决定创建另一个名为<远程主控的分支。强> hotfix_example_2 即可。当我将新的 hotfix_example_2 分支推送到远程存储库时,我注意到我创建的新分支没有从 远程主服务器的最新提交中分支出来 (我的同事之前推过的那个),而是在之前分支提交。如果我做了
git pull origin master
在我的本地主分支上并重复该过程,我可以看到hotfix_example_2已从我的同事的提交中分支出来。我没有得到的是为什么我必须做一个git pull来获得我想要的图形,即使我在checkout -b命令中使用origin / master。我真的很抱歉,如果它没有多大意义,但英语不是我的母语。
答案 0 :(得分:2)
几乎只有pull
和fetch
检索新提交并更新远程远程引用。其他操作仅适用于本地副本。创建分支时,它是在指定的ref之外创建的,但该ref仅在本地存储库中查找。您可以在.git/refs/remotes/origin
下查看每个远程分支当前的ref。
我认为这个设计背后的目标是允许完全断开连接的操作。如果checkout -b
尝试将新分支基于远程存储库中的远程ref,则必须联系远程存储库。通过在本地存储ref,即使完全断开连接,仍然可以创建分支。
答案 1 :(得分:1)
你所解释的是有道理的,但我能说的就是这就是Git的方式!
更新您的遥控器&#39;在服务器上分支你需要至少与服务器通信一次。 (Git pull那样做。)
除非你做了一个git-pull,否则你的本地回购邮件不知道你朋友创建的分支。当你进行git-pull时,它也更新了你的本地主人(origin / master)。
希望这是有道理的!
答案 2 :(得分:1)
这是一个老问题,但我的许多学习 Git 的队友一直在问我同样的问题,所以它在 6 年后非常重要。也许另一种解释会对遇到这个问题的人有所帮助:
发生这种情况是因为当您引用 origin/some-branch-name
时,您没有联系服务器。在 Git 中有 3 个概念性的分支,你必须在头脑中记住:
每次运行命令 git fetch
时,您都在更新服务器上分支的副本(将 #1 复制到 #2)。在您获取之前,您的本地“来源”副本将不会更新。请注意,当您 git pull
时,Git 实际上在幕后执行 2 个命令:git fetch
和 git merge
。这就是为什么您还可以通过拉取来更新您的原始副本。
根据经验,我很少使用 git pull
,而是在我运行任何引用“origin”的命令之前使用 git fetch
,以确保我处理的是最新版本的代码在远程服务器上。
附带说明,您无需连接到任何网络即可在 Git 中工作,因为大多数命令都是在物理上位于您机器上的存储桶 #2 和 #3 之外执行的。当您希望git fetch
或git push
从/到远程服务器(#1存储桶)时,您只需要连接到网络/互联网。