Git分支:大师与起源/主人与远程/起源/主人

我想我正在理解git的基本概念。

我已经build立并克隆了一个远程仓库。 我也创build了一个服务器端的空存储库,并将我的本地存储库链接到它。

我的问题是,我不明白之间的区别:

  • 起源/主控与遥控/起源/主控

据我所知, 主人是一个本地的分支, 远程/起源/主人是远程的。

但究竟是起源/主人

拿一个远程仓库的克隆,并运行git branch -a (显示所有分支git知道)。 它可能看起来像这样:

 * master remotes/origin/HEAD -> origin/master remotes/origin/master 

在这里, master是本地存储库中的一个分支。 remotes/origin/master是远程命名origin上名为master的分支。 你可以参考这个作为origin/master ,如在:

 git diff origin/master..master 

您也可以将其称为remotes/origin/master

 git diff remotes/origin/master..master 

这些只是指向同一事物的两种不同的方式(顺便说一句,这两个命令的意思是“让我看看远程master分支和我的master分支之间的变化)。

remotes/origin/HEAD是远程指定origindefault branch 。 这可以让你简单地说出origin而不是origin/master

对于像我这样的假人来说简短的回答(从Torek偷走):

  • 起源/主人是“上次在那里主人在那里检查”
  • 主人是“哪里主人在这里根据我一直在做什么”

从技术上讲,在你的Git仓库中,实际上并没有任何“远程”的东西,只有本地名称应该与另一个不同的仓库中的名称相对应。 那些被称为“ origin/whatever最初将与你克隆的回购中的origin/whatever匹配:

 git clone ssh://some.where.out.there/some/path/to/repo # or git://some.where... 

制作另一个回购的本地副本。 一路上,它注意到所有在那里的分支,以及那些引用的提交,并将这些提交到名为refs/remotes/origin/下的本地repo中。

根据您在git fetch或等同于更新“somewhere.where.out.where的副本”之前要走多久,他们可能会更改其分支,创build新分支,并删除一些分支。 当你做你的git fetch (或者git pull是真正的获取和合并)时,你的repo会复制他们的新工作,并根据需要更改所有的refs/remotes/origin/<name>条目。 正是这个时候,所有的东西都匹配起来(当然,还有最初的克隆,还有一些push情况 – 基本上,只要Git有机会检查,但是看到下面的警告)。

Git通常把你自己的refs/heads/<name>称为<name> ,把远程的称为origin/<name> ,这一切都是正常的,因为很明显哪一个是哪个。 有时候可能会创build自己的分支名称,使其不明显,但不要担心,直到它发生。 :-)给Git一个明显的最短名称,它会从那里开始: origin/master是“上次我在那里主人在那里检查的地方”, master是“这里的主人在哪里,一直在做“。 运行git fetch来根据需要更新“主控在哪里”的Git。


警告:在Git版本高于1.8.4的版本中, git fetch具有一些不更新“主机在那里”(更确切地说,不更新任何远程跟踪分支的模式)的模式。 运行git fetch origin ,或者git fetch --all ,甚至只是git fetch ,都会更新。 运行git fetch origin master 不行 。 不幸的是,这个“不更新”模式是由普通的git pull触发的。 (这主要是一个小麻烦,并在Git 1.8.4及更高版本中修复)


1有一件事叫做 “遥远”。 但是,这也是本地的! 名字的origin是Git称之为“远程”的东西。 这基本上只是您做克隆时使用的URL的简称。 这也是origin origin/master originorigin/master 。 名称origin/master被称为远程跟踪分支 ,有时会缩短为“remote branch”,特别是在较老的或更为非正式的文档中。

一个澄清(和我困惑的一点):

“remotes / origin / HEAD是默认分支”并不是真的正确。

remotes / origin / master是远程存储库中的默认分支(上次选中时)。 HEAD不是分支,只是指向一个分支。

把HEAD当作你的工作区域。 当你这样想的时候,'git checkout branchname'对于将你的工作区域文件改成特定分支是有意义的。 你“签出”分支文件到你的工作区域。 所有实际目的的头是你在你的工作领域是可见的。

  1. 起源 – 这是一个指向远程的自定义和最常见的名称。

$ git remote add origin https://github.com/git/git.git —你将运行这个命令来链接你的github项目到原点。 这里的来源是用户定义的。 您可以通过$ git remote rename old-name new-name来重新命名它


  1. master – Git中默认的分支名称是master。 对于远程和本地计算机。

  1. 起源/主 – 这只是一个指向远程回购中的主分支的指针。 记得我说的原点指向远程。

$ git fetch origin – 从远程仓库下载对象和引用到本地计算机[origin / master]。 这意味着它不会影响你的本地主分支,除非你使用$ git merge origin/master来合并它们。 请记住在运行此命令之前签出需要合并的正确分支

注意:获取的内容表示为远程分支。 Fetch使您有机会在将更改集成到项目副本之前对其进行审查。 显示你和远程$git diff master..origin/master之间的变化

对于初学者,我会进一步尝试使@ErichBSchulz的答案更简单:

  • origin / master是远程存储库上主分支的状态
  • master是本地存储库上主分支的状态