Git分支:master与origin / master vs. remotes / origin / master

Git branching: master vs. origin/master vs. remotes/origin/master

我认为我正处在理解Git基本概念的正确轨道上。

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

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

  • 源站/主站与远程站/源站/主站

据我所知,master是本地分支,remotes/origin/master是远程分支。

但什么是起源/主人?


复制一个远程存储库,运行git branch -a(显示Git知道的所有分支)。它可能看起来像这样:

1
2
3
* master
  remotes/origin/HEAD -> origin/master
  remotes/origin/master

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

1
git diff origin/master..master

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

1
git diff remotes/origin/master..master

这只是两种不同的方法来指同一件事(顺便说一下,这两个命令都意味着"显示远程master分支和我的master分支之间的变化"。

remotes/origin/HEAD是远程命名origindefault branch。这可以让你简单地说是origin,而不是origin/master


对像我这样的傻瓜的简短回答(从托莱克那里偷来的):

  • 源站/主站是"上次我检查时主站在那里"
  • 师父是"师父在这里的位置基于我所做的"


从技术上讲,Git回购协议中根本没有任何"远程"内容1,只有本地名称应与另一个不同回购协议中的名称相对应。名为origin/whatever的那些最初将与您克隆的repo上的那些匹配:

1
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/条目。正是EDOCX1的那一刻(20),使得所有的东西都匹配起来(好吧,这个,和最初的克隆,还有一些EDOCX1的情况(21),基本上,只要Git有机会检查,但见下面的警告)。

Git通常让您将自己的refs/heads/称为,远程的则称为origin/,这一切都是有效的,因为很明显哪个是哪个。有时可以创建自己的分支名称,使其不明显,但在这种情况发生之前不要担心。:-)只要给Git一个最短的名字,它就会从这里开始:origin/master是"上一次我检查的主人在那里",master是"根据我所做的事情,主人在这里"。运行git fetch根据需要更新git上的"主文件在哪里"。

注意:在1.8.4之前的Git版本中,git fetch有一些模式不更新"主服务器在那里"(更准确地说,是不更新任何远程跟踪分支的模式)。运行git fetch origingit fetch --all甚至仅仅运行git fetch都会更新。运行git fetch origin master不会。不幸的是,这个"不更新"模式是由普通git pull触发的。(这主要是一个小麻烦,在Git 1.8.4和更高版本中进行了修复。)

1好吧,有一件事叫做"遥控器"。但那也是本地的!名称origin是Git称之为"远程"的东西。基本上,它只是克隆时使用的URL的简称。这也是origin/master中的origin的来源。名称origin/master称为远程跟踪分支,有时简称为"远程分支",特别是在较旧或更非正式的文档中。


我会尽量让@erichbschulz的回答对初学者来说更简单:

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

  • 来源-这是一个自定义和最常见的名称指向远程。
  • $ git remote add origin https://github.com/git/git.git:您将运行此命令将您的GitHub项目链接到源站。这里的原点是用户定义的。可以用$ git remote rename old-name new-name重命名

  • master-git中的默认分支名称是master。用于远程和本地计算机。
  • 原始/主-这只是一个指向远程回购中主分支的指针。记得我说过原点指向远方。
  • $ git fetch origin-将对象和refs从远程存储库下载到本地计算机[源站/主服务器]。这意味着它不会影响您的本地主分支,除非您使用$ git merge origin/master合并它们。在运行此命令之前,请记住签出需要合并的正确分支。

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


    一个解释(和一个让我困惑的观点):

    "remotes/origin/head是默认分支"不正确。

    远程/origin/master是远程存储库中的默认分支(上次检查时)。头不是一根树枝,它只是指向一根树枝。

    把头部想象成你的工作区域。当你这样想的时候,"git checkout branchname"对于将你的工作区文件更改为一个特定的分支是有意义的。将分支文件"签出"到工作区。在您的工作区域内,您可以看到所有实际用途的头部。


    我认为通过查看你的.git文件夹,这个git斜线符号可能是最容易理解的。

    例如,这里是libreoffice源库的my.git的一个略为缩写的树。

    在Linux中,sudo apt-get install tree对于查看这一点很有用。在Windows中,我认为tree命令可能仍然有效。

    向下滚动查看底部附近的参考资料(又称"参考资料"):

    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

    最后,我认为看看.git/packed-refs也是很有用的。

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

    毫无疑问,这会留下比答案更多的问题,但我认为它可以开始帮助你回答你自己关于什么是什么的问题。