Git branching: master vs. origin/master vs. remotes/origin/master
我认为我正处在理解Git基本概念的正确轨道上。
我已经设置并克隆了一个远程存储库。我还创建了一个服务器端的空存储库,并将本地存储库链接到它。
我的问题是我不理解以下两者之间的区别:
- 源站/主站与远程站/源站/主站
据我所知,master是本地分支,remotes/origin/master是远程分支。
但什么是起源/主人?
复制一个远程存储库,运行
1 2 3 | * master remotes/origin/HEAD -> origin/master remotes/origin/master |
这里,
1 | git diff origin/master..master |
号
您也可以将其称为
1 | git diff remotes/origin/master..master |
这只是两种不同的方法来指同一件事(顺便说一下,这两个命令都意味着"显示远程
对像我这样的傻瓜的简短回答(从托莱克那里偷来的):
- 源站/主站是"上次我检查时主站在那里"
- 师父是"师父在这里的位置基于我所做的"
从技术上讲,Git回购协议中根本没有任何"远程"内容1,只有本地名称应与另一个不同回购协议中的名称相对应。名为
1 | git clone ssh://some.where.out.there/some/path/to/repo # or git://some.where... |
。
制作其他回购协议的本地副本。在此过程中,它注意到了所有在那里的分支机构,而那些承诺指的是,并将它们以
根据需要多久,
Git通常让您将自己的
注意:在1.8.4之前的Git版本中,
1好吧,有一件事叫做"遥控器"。但那也是本地的!名称
我会尽量让@erichbschulz的回答对初学者来说更简单:
- origin/master是远程存储库上主分支的状态
- master是本地存储库上master分支的状态
注意:获取的内容表示为远程分支。fetch让您有机会在将更改集成到项目副本之前对其进行检查。显示您和远程
一个解释(和一个让我困惑的观点):
"remotes/origin/head是默认分支"不正确。
远程/origin/master是远程存储库中的默认分支(上次检查时)。头不是一根树枝,它只是指向一根树枝。
把头部想象成你的工作区域。当你这样想的时候,"git checkout branchname"对于将你的工作区文件更改为一个特定的分支是有意义的。将分支文件"签出"到工作区。在您的工作区域内,您可以看到所有实际用途的头部。
我认为通过查看你的
例如,这里是libreoffice源库的my.git的一个略为缩写的树。
在Linux中,
向下滚动查看底部附近的参考资料(又称"参考资料"):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 | $ tree . ├── branches ├── config ├── description ├── FETCH_HEAD ├── gitk.cache ├── HEAD ├── hooks │ ├── applypatch-msg.sample ... ├── index ├── info │ └── exclude ├── logs │ ├── HEAD │ └── refs │ ├── heads │ │ ├── master │ │ └── remotes │ │ └── origin │ └── remotes │ └── origin │ ├── distro │ │ ├── cib │ │ │ └── libreoffice-6-0 │ │ ├── collabora │ │ │ └── cp-6.0 │ │ └── lhm │ │ └── libreoffice-5-2+backports │ ├── HEAD │ ├── libreoffice-6-2 │ ├── master │ └── private │ └── mst │ └── sw_redlinehide_4a ├── objects │ ├── info │ └── pack │ ├── pack-b80087dc57e2b3315f449ca0f1aaa91987bf0c5e.idx │ ├── pack-b80087dc57e2b3315f449ca0f1aaa91987bf0c5e.pack │ ├── pack-eb4e6808029e712d8d9c2671accbbd98aaeb9a04.idx │ └── pack-eb4e6808029e712d8d9c2671accbbd98aaeb9a04.pack ├── ORIG_HEAD ├── packed-refs └── refs ├── heads │ ├── master │ └── remotes │ └── origin ├── remotes │ └── origin │ ├── distro │ │ ├── cib │ │ │ └── libreoffice-6-0 │ │ ├── collabora │ │ │ └── cp-6.0 │ │ └── lhm │ │ └── libreoffice-5-2+backports │ ├── HEAD │ ├── libreoffice-6-2 │ ├── master │ └── private │ └── mst │ └── sw_redlinehide_4a └── tags └── libreoffice-6-2-branch-point 32 directories, 45 files |
如果是这样安排的话,可能就不那么令人困惑了,但事实并非如此:
1 2 3 4 5 6 7 8 | repositories (i.e. independent trees) ├──local │ └──master │ └──origin1 │ └──master └──origin2 └──master |
号
我们有三种基本的引用类型:头、遥控器和标签。
.git/refs/heads拥有我们的本地主机。
.git/refs/remotes可以容纳许多远程程序,尽管目前我们只在其中包含源代码。
.git/refs/tags(在别处讨论)。
因此,起源是我们唯一的,也是唯一的遥远。它保存原点/主点。
我们发现有两个头部(指向当前分支的指针)、一个本地和一个远程:
1 2 3 4 5 | $ cat .git/HEAD # local: HEAD -> master ref: refs/heads/master $ cat .git/refs/remotes/origin/HEAD # remote origin: HEAD -> master ref: refs/remotes/origin/master |
如果列出分支:
1 2 3 4 5 6 7 8 9 10 | $ git branch -a * master remotes/origin/HEAD -> origin/master remotes/origin/aoo/aw080 remotes/origin/aoo/trunk remotes/origin/distro/capgemini/cg-4.1 remotes/origin/distro/cib/libreoffice-5-0 remotes/origin/distro/cib/libreoffice-5-1 remotes/origin/distro/cib/libreoffice-5-2 ... |
。
- 列出的第一个分支(master)是唯一一个非远程分支。在这种情况下,我们有一个本地分支。在这里,我们将开始我们自己的工作,为我们自己的新分支和随后的承诺。
接下来,您可能有许多远程跟踪分支,我们在这里做。您知道这些是远程跟踪分支,因为它们的前缀是"remotes/"。此处显示的是用于远程命名来源的。
所以第二行是原点的当前分支指针。远程/原点:head——指向-->master。这表明在远程存储库中,当前分支是其名为master的分支(不要与本地分支master混淆)。
其余的分支在.git/refs/树中找不到,而是在
.git/packed-refs 中找到。
当我们获取Git时,我们将更改从远程存储库下载到远程跟踪存储库中。
当我们Git合并时,我们将这个本地的远程跟踪存储库中的更改合并到我们工作的本地分支中,在本例中,合并到我们的主分支中。
(当我们拉动时,我们在一个操作中同时执行这两个步骤。)
还需要注意的是,master的这些本地和远程UUID当前指向同一个节点(也称为"提交"):
1 2 3 4 5 | $ cat refs/heads/master # local master 1ca409292272632f443733450313de5a82c54a9c $ cat refs/remotes/origin/master # remote origin master 1ca409292272632f443733450313de5a82c54a9c |
所以我们的本地主机指向与远程主机相同的位置:
1 | [local] master = [remote] origin master |
。
最后,我认为看看
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | $ cat packed-refs # pack-refs with: peeled fully-peeled 3c1d4742e649fe9c8aed8c2817fe3e1f3364f298 refs/remotes/origin/aoo/aw080 e87c8b7922e9a73e0abb7f9a7a47c9ac3374a826 refs/remotes/origin/aoo/trunk b70fdffb041c12f124dcc0822b61bf3450e53137 refs/remotes/origin/distro/capgemini/cg-4.1 5dbc3f1754809b9489faaf380b1a4bdbcfbb6205 refs/remotes/origin/distro/cib/libreoffice-5-0 cfdbc96ca47d68d6785fd21829a8d61f49d6e591 refs/remotes/origin/distro/cib/libreoffice-5-1 5189c8c47461ef09739086e55512fc6a10245273 refs/remotes/origin/distro/cib/libreoffice-5-2 3bee5917569ca8e6ee3b086458f5b1a917b88ca1 refs/remotes/origin/distro/cib/libreoffice-5-3 92fbe703f9ca480d3a2b8610d87e991c729edf77 refs/remotes/origin/distro/cib/libreoffice-5-4 05c0a5df66cc69d75280f05b804cf82f3387d42b refs/remotes/origin/distro/cib/libreoffice-6-0 7fe193e759b24b90852e6e327115b77114d7b119 refs/remotes/origin/distro/cib/libreoffice-6-1 8187f7aa413e7ef7b377eea2b057d336bf256867 refs/remotes/origin/distro/collabora/cd-5.3 7a6b608591e21ef61dc05cff9fc58da531035755 refs/remotes/origin/distro/collabora/cd-5.3-3.1 .... |
。
毫无疑问,这会留下比答案更多的问题,但我认为它可以开始帮助你回答你自己关于什么是什么的问题。