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
是远程指定origin
的default 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
origin
的origin/master
。 名称origin/master
被称为远程跟踪分支 ,有时会缩短为“remote branch”,特别是在较老的或更为非正式的文档中。
一个澄清(和我困惑的一点):
“remotes / origin / HEAD是默认分支”并不是真的正确。
remotes / origin / master是远程存储库中的默认分支(上次选中时)。 HEAD不是分支,只是指向一个分支。
把HEAD当作你的工作区域。 当你这样想的时候,'git checkout branchname'对于将你的工作区域文件改成特定分支是有意义的。 你“签出”分支文件到你的工作区域。 所有实际目的的头是你在你的工作领域是可见的。
- 起源 – 这是一个指向远程的自定义和最常见的名称。
$ git remote add origin https://github.com/git/git.git
—你将运行这个命令来链接你的github项目到原点。 这里的来源是用户定义的。 您可以通过$ git remote rename old-name new-name
来重新命名它
- master – Git中默认的分支名称是master。 对于远程和本地计算机。
- 起源/主 – 这只是一个指向远程回购中的主分支的指针。 记得我说的原点指向远程。
$ git fetch origin
– 从远程仓库下载对象和引用到本地计算机[origin / master]。 这意味着它不会影响你的本地主分支,除非你使用$ git merge origin/master
来合并它们。 请记住在运行此命令之前签出需要合并的正确分支
注意:获取的内容表示为远程分支。 Fetch使您有机会在将更改集成到项目副本之前对其进行审查。 显示你和远程$git diff master..origin/master
之间的变化
对于初学者,我会进一步尝试使@ErichBSchulz的答案更简单:
- origin / master是远程存储库上主分支的状态
- master是本地存储库上主分支的状态