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

时间:2012-05-14 17:33:27

标签: git git-remote

我认为我正在理解git的基本概念。

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

我的问题是我不明白:

之间的区别
  • origin / master vs. remotes / origin / master

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

但究竟什么是 origin / master

7 个答案:

答案 0 :(得分:198)

获取远程存储库的克隆并运行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/HEAD是名为default branch的远程的origin。这样,您只需说出origin而不是origin/master

答案 1 :(得分:101)

像我这样的假人(从Torek被盗)的简短回答:

  • origin / master 是“上次检查时主人在那里的地方”
  • master 是“根据我一直在做的事情,主人在这里”

答案 2 :(得分:37)

从技术上讲,你的Git仓库中根本没有任何“远程”的东西 1 ,只有对应另一个的名字的本地名称,不同的回购。名为origin/whatever的那些最初将与您克隆的repo上的那些匹配 - 来自:

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

制作另一个回购的本地副本。在此过程中,它记录了那里的所有分支,以及那些引用的提交,并以名称refs/remotes/origin/将它们粘贴到您的本地仓库中。

根据您在git fetch或等同于更新“我的副本some.where.out.there”之前的时间长短,他们可能会更改其分支,创建新分支并删除一些分支。当您执行git fetch(或git pull真正获取加合并)时,您的仓库将复制其新工作并根据需要更改所有refs/remotes/origin/<name>条目。正是fetch的那一刻使得一切都匹配(好吧,那个,初始克隆,以及push的一些情况 - 基本上每当Git有机会检查时 - 但请看下面的警告)。

Git通常会将您自己的refs/heads/<name>称为<name>,而将远程的origin/<name>称为origin/master,这一切都正常,因为很明显哪一个是哪个。有时可能会创建自己的分支名称,使其不明显,但在发生之前不要担心。 :-)只要给Git一个最明显的名字,它就会从那里开始:master是“我上次检查时主人在那里的地方”,而git fetch是“主人在哪里基于我一直在做的事情在这里。运行git fetch根据需要在“主人在那里”更新Git。


警告:在早于1.8.4的Git版本中,git fetch origin有一些模式不会更新“主人在那里”(更准确地说,不更新任何远程跟踪分支的模式) )。运行git fetch --allgit fetch,甚至仅git fetch origin master更新。正在运行git pull 。不幸的是,这种“不更新”模式是由普通origin触发的。 (这主要是一个小麻烦,并在Git 1.8.4及更高版本中修复。)


1 好吧,有一件事是一个“远程”。但那也是本地的!名称origin是Git称之为“远程”的东西。它基本上只是您在进行克隆时使用的URL的简称。它也是origin/master中的origin/master来自的地方。名称{{1}}称为远程跟踪分支,有时会缩短为“远程分支”,尤其是在较旧或更为非正式的文档中。

答案 3 :(得分:6)

我会尽量让@ ErichBSchulz给初学者更简单的回答:

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

答案 4 :(得分:4)

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

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

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

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

答案 5 :(得分:4)

  1. 来源 - 这是一个自定义且最常见的名称,指向远程。
  2. $ 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 - 这只是一个指向远程仓库中主分支的指针。记得我说原点指向远程。
      2. $ git fetch origin - 将对象和引用从远程存储库下载到本地计算机[origin / master]。这意味着它不会影响您的本地主分支,除非您使用$ git merge origin/master合并它们。请记住在运行此命令之前签出需要合并的正确分支

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

        之间的更改

答案 6 :(得分:1)

我认为,最好是通过查看.git文件夹中的内容来更好地理解这种git斜杠符号。


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

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

我们提供三种基本的参考类型:远程标签

  • .git / refs / 负责人持有我们本地的 master

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

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

因此,

起源是我们唯一的远程站点。它包含来源/主邮件


我们发现我们有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 fetch 时,我们将更改从远程存储库下载到我们的远程跟踪存储库中。

当我们 git merge 时,我们会将本地远程跟踪存储库中的更改合并到一个或多个工作的本地分支中,在本例中将其合并到我们的master分支中。

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


有趣的是,这些 master local remote UUID当前指向同一节点(又称“提交”):< / p>

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

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