从远程主站创建分支

时间:2014-10-17 12:40:37

标签: git branch master

我在Git中理解以下命令背后的逻辑时遇到了问题:

git checkout -b hotfix_example_1 origin/master

如果我输入它,则会创建一个名为 修补程序 的本地分支,该分支从 分支分支出来我的远程存储库名为 origin 。当我稍后将其推送到我的远程存储库时,图形如下所示:

enter image description here

假设某位同事进行了更改并将其推送到 远程主控 分支,稍后我决定创建另一个名为<远程主控的分支。强> hotfix_example_2 即可。当我将新的 hotfix_example_2 分支推送到远程存储库时,我注意到我创建的新分支没有从 远程主服务器的最新提交中分支出来 (我的同事之前推过的那个),而是在之前分支提交。如果我做了

git pull origin master

在我的本地主分支上并重复该过程,我可以看到hotfix_example_2已从我的同事的提交中分支出来。我没有得到的是为什么我必须做一个git pull来获得我想要的图形,即使我在checkout -b命令中使用origin / master。我真的很抱歉,如果它没有多大意义,但英语不是我的母语。

3 个答案:

答案 0 :(得分:2)

几乎只有pullfetch检索新提交并更新远程远程引用。其他操作仅适用于本地副本。创建分支时,它是在指定的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 个概念性的分支,你必须在头脑中记住:

  1. 远程服务器上的分支。
  2. 您在远程服务器上的分支副本(通常称为“源”)。
  3. 您当地的分支机构。

每次运行命令 git fetch 时,您都在更新服务器上分支的副本(将 #1 复制到 #2)。在您获取之前,您的本地“来源”副本将不会更新。请注意,当您 git pull 时,Git 实际上在幕后执行 2 个命令:git fetchgit merge。这就是为什么您还可以通过拉取来更新您的原始副本。

根据经验,我很少使用 git pull,而是在我运行任何引用“origin”的命令之前使用 git fetch,以确保我处理的是最新版本的代码在远程服务器上。

附带说明,您无需连接到任何网络即可在 Git 中工作,因为大多数命令都是在物理上位于您机器上的存储桶 #2 和 #3 之外执行的。当您希望git fetchgit push从/到远程服务器(#1存储桶)时,您只需要连接到网络/互联网。