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

问题描述 投票:176回答:7

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

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

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

  • origin / master vs. remotes / origin / master

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

但究竟什么是起源/主人?

git git-remote
7个回答
197
投票

获取远程存储库的克隆并运行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 branchorigin。这让你简单地说origin而不是origin/master


99
投票

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

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

37
投票

从技术上讲,在你的Git仓库中实际上并没有任何“远程”的东西,只有本地名称应该对应于另一个不同仓库的名称。名为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,它真的是fetch plus merge)时,你的repo将复制他们的新工作并根据需要更改所有refs/remotes/origin/<name>条目。这是fetching的那一刻,使得一切都匹配(好吧,那个,以及最初的克隆,以及一些pushing的情况 - 基本上每当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 --all,或git fetch,甚至只是git fetch origin master,确实会更新。运行git pull没有。不幸的是,这种“不更新”模式是由普通的origin触发的。 (这主要是一个小麻烦,并在Git 1.8.4及更高版本中得到修复。)


1好吧,有一件事被称为“远程”。但那也是本地的!名字origin是Git称之为“远程”的东西。它基本上只是您在进行克隆时使用的URL的简称。这也是origin/masterorigin/master来自哪里。名称$ git remote add origin https://github.com/git/git.git称为远程跟踪分支,有时会缩短为“远程分支”,尤其是在较旧或更为非正式的文档中。


5
投票

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

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

4
投票

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

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

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

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


4
投票
  1. origin - 这是一个自定义且最常见的名称,指向远程。

$ git remote rename old-name new-name ---您将运行此命令将您的github项目链接到origin。这里的来源是用户定义的。您可以通过$ git fetch origin重命名它


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

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

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

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


1
投票

我认为通过查看你的sudo apt-get install tree文件夹可能最好理解这个git斜杠符号。


例如,这里是LibreOffice源代码库的.git的略微缩写树。

在linux中,tree对查看此内容非常有用。 在Windows中我认为$ 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 命令可能仍然有效。

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

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

如果像这样布局,可能不那么令人困惑,但事实并非如此:

$ 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

我们有三种基本类型的引用:head,remotes和tags。

  • .git / refs / heads持有我们当地的主人。
  • .git / refs / remotes可以容纳一些遥控器,虽然目前我们只有它的起源。
  • .git / refs / tags(在别处讨论)。

因此,原点是我们独一无二的。它拥有起源/主人。


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

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

如果您列出您的分支机构:

.git/packed-refs
  • 列出的第一个分支(主)是唯一不是远程的分支。所以在这种情况下,我们有一个本地分支。对于我们自己的新分支和后续提交,我们将从这里开始自己的工作。

接下来,您可能有许多远程跟踪分支,我们在这里做。您知道这些是远程跟踪分支,因为它们以“remotes /”为前缀。这里显示的是远程命名原点。

  • 所以第二行是origin的当前分支指针。遥控器/原产地:HEAD - 指向 - >主人。这表明在远程存储库中,当前分支是其名为master的分支(不要与我们的名为master的本地分支混淆)。
  • 你的.git / refs / tree中找不到其余的分支,但你可以在$ cat refs/heads/master # local master 1ca409292272632f443733450313de5a82c54a9c $ cat refs/remotes/origin/master # remote origin master 1ca409292272632f443733450313de5a82c54a9c 找到它们。

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

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

(当我们git pull时,我们在一个操作中执行这两个步骤。)


有趣的是,注意到master的这些本地和远程UUID当前指向同一节点(也称为'commit'):

[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 .... 也很有用

qazxswpoi

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

© www.soinside.com 2019 - 2024. All rights reserved.