221

我认为我在理解 git 的基本概念方面处于正确的轨道上。

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

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

  • origin/master 与 remotes/origin/master

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

但是origin/master到底是什么?

4

7 回答 7

230

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

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

这里,master是本地存储库中的一个分支。 是远程命名remotes/origin/master的分支。您可以将其称为 any ,如:masteroriginorigin/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.

于 2012-05-14T17:56:41.020 回答
115

像我这样的傻瓜的简短回答(从 Torek 偷来的):

  • origin/master是“我上次检查时主人在哪里”
  • 主人是“根据我一直在做的事情,主人在哪里”
于 2013-02-17T05:48:08.387 回答
40

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

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

制作另一个 repo 的本地副本。一路上,它记录了那里的所有分支,以及那些引用的提交,并将它们粘贴到您的本地存储库中,名称为refs/remotes/origin/.

取决于你在你之前多久git fetch或相当于更新“我的什么是 some.where.out.there”的副本,他们可能会改变他们的分支,创建新的分支,并删除一些。当你做你的git fetch(或git pull真正的 fetch 加合并)时,你的 repo 将复制他们的新工作并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 在那边”(更准确地说,模式不会更新任何远程跟踪分支)。Running git fetch origin, or git fetch --all,甚至只是git fetch确实会更新。跑步git fetch origin master 不会。不幸的是,这种“不更新”模式是由普通的git pull. (这主要只是一个小麻烦,在 Git 1.8.4 及更高版本中已修复。)


1嗯,有一种东西叫做“远程”。但这也是本地的!这个名字origin是 Git 称之为“远程”的东西。它基本上只是您在克隆时使用的 URL 的简称。这也是originin 的origin/master来源。该名称origin/master称为远程跟踪分支,有时缩写为“远程分支”,尤其是在较旧或更非正式的文档中。

于 2012-05-14T18:09:51.470 回答
12

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

  • origin/master是远程仓库上 master 分支的状态
  • master是本地存储库上 master 分支的状态
于 2017-09-29T15:07:13.710 回答
8
  1. origin - 这是指向远程的自定义和最常见的名称。

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


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

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

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

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

于 2016-12-13T22:36:45.797 回答
5

一个澄清(以及让我感到困惑的一点):

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

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

将 HEAD 视为您的工作区域。当您以这种方式考虑时,“git checkout branchname”对于将工作区文件更改为特定分支的文件是有意义的。您将分支文件“签出”到您的工作区域。出于所有实际目的,HEAD 是您在工作区域中可见的内容。

于 2013-09-06T15:04:09.867 回答
3

我认为这个 git 斜线表示法可能最好通过查看您的.git文件夹来理解。


例如,这是我的 .git 的一个略为缩写的树,用于 LibreOffice 源代码库。

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

向下滚动并查看底部附近的 refs(又名“references”):

$ 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包含我们本地的master

  • .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/ ”为前缀。此处显示的用于远程命名的原点。

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

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

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

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

(当我们git pull我们在一个操作中完成这两个步骤。)


有趣的是, master的这些本地远程UUID当前指向同一个节点(又名“提交”):

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

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

所以我们的本地 master 指向与远程的 origin master 相同的地方:

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

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

于 2018-11-24T17:12:49.373 回答