Git分支:主控与源/主控与远程/源/主控


201

我认为我在正确的方向上了解git的基本概念。

我已经设置并克隆了一个远程存储库。我还创建了服务器端的空存储库,并将本地存储库链接到该存储库。

我的问题是我不了解以下两者之间的区别:

  • 原始服务器/主服务器与遥控器/原始服务器/主服务器

据我了解,master是本地分支,remotes / origin / master是远程分支。

但是起源/母版到底是什么?


1
@ChristopherWallace:您在编辑时对meta提出了两个问题:“ 我们真的需要一个[origin]标签吗? ”和“ 什么是真正的[Master]? ”。
Deduplicator 2015年

@Deduplicator有问题吗?
nbro

@ChristopherWallace:好吧,许多人似乎都认为这两个标签(创建的标签和刚刚添加的标签)都是不好的。我碰巧同意,但是也许您可以在链接讨论中添加一些未考虑的内容。如果没有,似乎是这样。
Deduplicator 2015年


后续问题:为什么会.git/refs/origin/master从中漂移.git/refs/remotes/origin/master?现在这正在发生在我身上,我被抛弃了。
保罗

Answers:


219

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

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

master是本地存储库中的一个分支。 remotes/origin/master是在名为master的远程上命名的分支origin。您可以将其称为origin/master,如:

git diff origin/master..master

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

git diff remotes/origin/master..master

这只是引用同一事物的两种不同方式(顺便说一句,这两个命令的意思是“向我展示远程master分支和我的master分支之间的更改)。

remotes/origin/HEADdefault branch名为的遥控器的origin。这使您可以简单地说origin而不是origin/master


5
好答案。我认为git branch -a将远程分支显示remotes/origin/master为部分原因是因为底层引用存储在其中.git/refs/remotes/origin(如果尚未打包)。我认为,输出git branch -a可能会更清晰,也许是通过使用斜杠以外的其他东西将远程名称与分支名称分开。
马特·赫恩

14
还要注意,git branch -r仅显示远程分支的,将显示该分支只是origin/master因为remotes/不需要前缀。
马特·赫恩

3
@misterbiscuit:没错。输出结果比澄清更令人困惑。非常感谢,这个问题的很好答案给了我正确的提示
John Rumpel 2012年

如果我看看git log我看看commit fa9sd8jasdf98 (HEAD -> master),这是什么意思?在这种情况下,HEAD是什么?我以为我目前是“大师”,并且正在致力于origin/master。我想我有些混乱,有人可以帮忙吗?编辑更新:我想我明白了,假设HEAD当前指向master分支是否正确,这意味着我当前正在提交master的过程中?
塞巴斯蒂安·尼尔森

@SebastianNielsen是的,您是对的,HEAD-> master部分意味着您当前在master分支上。
iRestMyCaseYourHonor

108

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

  • 来源/管理员是“我上次检查管理员在那儿的地方”
  • 主人是“根据我一直在做什么,主人在这里”

9
origin / master =远程计算机的备份,上次检查master时已更新master =您的origin / master副本
sakurashinken

40

从技术上讲,您的Git存储库中实际上根本没有任何“远程”内容1,只有本地名称与另一个不同存储库中的名称相对应。origin/whatever最初命名的将与您从中克隆的回购中的那些相匹配:

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

制作另一个仓库的本地副本。一路上,它会记录在那里的所有分支,并提交那些引用,并将这些分支以名称粘贴到您的本地仓库中refs/remotes/origin/

根据您花了多长时间git fetch才能更新“我在某处某处的副本”,他们可能会更改其分支,创建新的分支并删除一些分支。当您执行自己的操作git fetch(或git pull实际上是获取加合并操作)时,您的存储库将复制其新作品并refs/remotes/origin/<name>根据需要更改所有条目。正是fetching 的那一刻使所有东西都匹配了(嗯,那个和最初的克隆,还有一些pushing的情况-基本上是每当Git有机会检查的时候,但是请注意下面的警告)。

Git通常让您将自己的refs/heads/<name>称为Just <name>,将远程的称为origin/<name>,这都可以正常工作,因为很明显哪个是哪个。有时可以创建您自己的分支名称,使其不明显,但是在它发生之前不必担心。:-)只要给Git一个最短的名字就可以了,它就会从那里开始:origin/master是“上次我检查师父在那边的地方”,master是“根据我的所作所为那里师父在那儿的地方” 。根据需要运行git fetch以在“ master在那儿”上更新Git。


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


1好吧,有一件事叫做 “远程”。但这也是本地的!名称origin就是Git所说的“远程”。它基本上只是克隆时使用的URL的缩写。这也是originin的origin/master来源。该名称origin/master称为远程跟踪分支,有时会缩写为“远程分支”,尤其是在较早或更正式的文档中。


2
对于像我这样的新手来说,很好的描述,谢谢!阐明了为什么她将origin/master标签贴在local回购图表上,而不是贴在上面remote(我全心向杰米卡 ·克尔(Jessica Kerr)的“ Git Happens”演示文稿推荐给vimeo.com/46010208的新手。我在30 git: 00-30之间抓挠头: 19.)
年长者,2016年

11

我会尝试让@ErichBSchulz的答案对初学者来说更简单:

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

1
很好的尝试,但是恕我直言,没有last time I've checked它失去了重点
Alexei Martianov

6
  1. origin-这是一个自定义且最常用的名称,它指向远程。

$ git remote add origin https://github.com/git/git.git---您将运行此命令将github项目链接到origin。这里的起源是用户定义的。 您可以通过以下方式重命名$ git remote rename old-name new-name


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

  1. origin / master-这只是一个引用远程仓库中master分支的指针。记住我说起源指向远程。

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

注意:提取的内容表示为远程分支。通过Fetch,您可以先查看更改,然后再将其集成到项目副本中。显示您和遥控器之间的更改$git diff master..origin/master


5

一种澄清(这一点使我感到困惑):

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

remotes / origin / master是远程存储库中的默认分支(上次检查)。HEAD不是分支,它仅指向分支。

将HEAD视为您的工作区域。当您以这种方式想到它时,'git checkout branchname'就将您的工作区文件更改为特定分支的文件而言是有意义的。您可以将分支文件“检出”到工作区中。出于所有实际目的,HEAD是您在工作区域中看到的。


更准确地说,HEAD是“指向分支的指针”(本地存储库中的实际文件通常包含字符串ref: refs/heads/master,例如...,除非它是“分离的”,这完全是另一回事)。但是,在clone解释“远程HEAD” 的方式上存在一个错误:传输协议根本无法发送间接分支,而只能发送原始SHA-1,因此git产生了使此“主要工作”的麻烦。偶尔有人偶然发现一个奇怪的案件。我有点希望git根本不会创建remotes/origin/HEAD,尤其是当它出现错误时……
torek

2

我认为通过查看.git文件夹内部可能会更好地理解这种git斜杠表示法。


例如,这是LibreOffice源库的.git的略缩树。

linux sudo apt-get install tree中查看此内容很有用。
Windows中,我认为该tree命令可能仍然有效。

向下滚动并查看底部附近的引用(又称“引用”):

$ 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

如果这样布置,可能会减少混乱,但事实并非如此:

repositories (i.e. independent trees)
├──local
│  └──master
│
└──origin1
│  └──master
└──origin2
   └──master

我们有三种基本的引用类型:headremotestags

  • .git / refs / heads担任我们的本地管理员

  • .git / refs / remotes可以容纳许多遥控器,尽管目前我们只有它的起源

  • .git / refs / 标签(在其他地方讨论)。

因此,起源是我们唯一的偏远地区。它拥有origin / master


我们发现我们有2个HEADS(指向当前分支的指针),一个本地和一个远程:

$ 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

如果列出分支机构

$ 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 / '。此处显示的用于远程命名的origin。

  • 因此,第二行是原点的当前分支指针。遥控器/原点:HEAD-指向-> master。这表明在远程存储库中,当前分支是其名为master的分支(不要与我们的本地分支master混淆)。

  • 在您的.git / refs /树中找不到其余的分支,但是您可以在中找到它们.git/packed-refs

当我们git获取我们将更改从远程存储库下载到我们的远程跟踪存储库中。

当我们git合并我们会将本地远程跟踪存储库中的更改合并到我们工作的一个或多个本地分支中,在这种情况下合并到我们的master分支中。

(当我们进行git pull时,我们在一个操作中同时完成了这两个步骤。)


还很有趣的是,当前主机的这些本地远程 UUID 指向同一节点(也称为“提交”):

$ cat refs/heads/master                   # local         master
1ca409292272632f443733450313de5a82c54a9c

$ cat refs/remotes/origin/master          # remote origin master
1ca409292272632f443733450313de5a82c54a9c

因此,我们的本地主机与远程主机的原始主机指向同一位置:

[local] master = [remote] origin master

最后,我认为看看 .git/packed-refs

$ 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
....

毫无疑问,这留下的问题多于答案,但我认为它可以开始帮助您回答有关什么的问题。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.