web-dev-qa-db-ja.com

Gitの分岐:マスターvs. Origin /マスターvs. remotes / Origin / master

私はgitの基本概念を理解するための正しい軌道に乗っていると思います。

すでにリモートリポジトリをセットアップしてクローンを作成しています。また、サーバー側の空のリポジトリを作成し、ローカルリポジトリをリンクしました。

私の問題は、以下の違いが理解できないことです。

  • Origin/master vs. remotes/Origin/master

私が理解している限り、masterはローカルブランチであり、remotes/Origin/masterはリモートブランチです。

しかしOrigin/masterとは正確には何ですか?

181
John Rumpel

リモートリポジトリのクローンを作成し、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

これらは、同じものを参照する2つの異なる方法です(偶然にも、これらのコマンドは両方とも「リモートのmasterブランチとmasterブランチ間の変更を表示する」という意味です)。

remotes/Origin/HEADは、Originという名前のリモートのdefault branchです。これにより、Origin/masterではなくOriginと簡単に言うことができます。

199
larsks

私のようなダミーの短い答え(Torekから盗まれた):

  • Origin/masterは、「前回チェックしたときにマスターがそこにいた場所」です
  • マスターは、「私がやっていることに基づいてマスターがここにいる」
101
ErichBSchulz

技術的には、実際には「リモート」なものはまったくありません1 Gitリポジトリには、shouldが別の異なるリポジトリの名前に対応するローカル名のみがあります。 Origin/whateverという名前のものは、最初に複製元のリポジトリ上のものと一致します。

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

他のリポジトリのローカルコピーを作成します。途中で、そこにあったすべてのブランチを記録し、それらの参照先をコミットし、refs/remotes/Origin/という名前でローカルリポジトリに貼り付けます。

あなたがgit fetchまたは "some's some.where.out.thereの私のコピー"を更新するのに相当するまでの時間に応じて、彼らはブランチを変更し、新しいブランチを作成し、いくつかを削除します。 git fetch(または実際にフェッチとマージを行うgit pull)を実行すると、リポジトリは新しい作業のコピーを作成し、必要に応じてすべてのrefs/remotes/Origin/<name>エントリを変更します。すべてが一致するのはfetchingの瞬間です(まあ、それと、最初のクローン、およびPushingのいくつかのケースも-基本的にGitがチェックする機会を得るたびに-しかし、以下の警告を参照してください)。

Gitでは通常、自分のrefs/heads/<name>を単に<name>と呼び、リモートのものをOrigin/<name>と呼びますが、どれがどちらであるかが明らかであるため、すべて正常に機能します。明らかではない独自のブランチ名を作成することもできますが、それが発生するまで心配しないでください。 :-) Gitにわかりやすい最短の名前を付けるだけで、そこから行くことができます:Origin/masterは「前回チェックしたときにマスターがそこにいた場所」で、masterは「マスターがいる場所ここで私がやってきたことに基づいて」。必要に応じてgit fetchを実行して、「マスターが向こうにある場所」でGitを更新します。


警告:1.8.4より古いGitのバージョンでは、git fetchには、「マスターがそこにある」場所を更新しないモード(より正確には、リモート追跡ブランチを更新しないモード)があります。 git fetch Origin、またはgit fetch --all、または単にgit fetchdoes updateを実行しています。 git fetch Origin masterしないを実行しています。残念ながら、この「更新しない」モードは通常のgit pullによってトリガーされます。 (これは主にマイナーな迷惑であり、Git 1.8.4以降で修正されています。)


1さて、called「リモート」ということが1つあります。しかし、それもローカルです!名前Originは、Gitが「リモート」と呼ぶものです。基本的には、クローンを作成したときに使用したURLの短い名前です。また、Origin/master内のOriginの由来でもあります。 Origin/masterという名前はremote-tracking branchと呼ばれ、特に古いドキュメントや非公式のドキュメントでは「リモートブランチ」に短縮されることがあります。

37
torek

私は初心者のために@ErichBSchulzの答えをより簡単にしようとします:

  • Origin/masterは、リモートリポジトリのmasterブランチの状態です
  • masterはローカルリポジトリのmasterブランチの状態です
6
MKJ

1つの説明(および私を混乱させた点):

「remotes/Origin/HEADがデフォルトのブランチです」は実際には正しくありません。

remotes/Origin/masterは、リモートリポジトリのデフォルトのブランチでした(前回チェックしたとき)。 HEADはブランチではなく、ブランチを指しているだけです。

HEADを作業領域と考えてください。このように考えると、「git checkout branchname」は、作業領域ファイルを特定のブランチのものに変更することに関して意味があります。ブランチファイルを作業領域に「チェックアウト」します。 HEADは、すべての実用的な目的のために、作業領域であなたに見えるものです。

4
rick
  1. Origin-これは、リモートを指すカスタムで最も一般的な名前です。

$ git remote add Origin https://github.com/git/git.git ---このコマンドを実行して、githubプロジェクトをOriginにリンクします。ここで、Originはユーザー定義です。$ git remote rename old-name new-nameで名前を変更できます。


  1. master-Gitのデフォルトのブランチ名はmasterです。リモートコンピューターとローカルコンピューターの両方。

  1. Origin/master-これは、リモートリポジトリでmasterブランチを参照するための単なるポインタです。 Originがリモートを指していると言ったことを思い出してください。

$ git fetch Origin-リモートリポジトリからローカルコンピューター[Origin/master]にオブジェクトと参照をダウンロードします。つまり、$ git merge Origin/masterを使用してマージしない限り、ローカルマスターブランチには影響しません。このコマンドを実行する前に、マージする必要がある正しいブランチをチェックアウトすることを忘れないでください

注:フェッチされたコンテンツは、リモートブランチとして表されます。 Fetchを使用すると、プロジェクトのコピーに変更を統合する前に変更を確認できます。自分とリモート間の変更を表示するには$git diff master..Origin/master

4
Gnanasekar S

このgitスラッシュ表記法は、おそらく.gitフォルダーの中を見ることで最もよく理解されると思います。


たとえば、これはLibreOfficeソースベース用の私の.gitのやや省略されたツリーです。

linuxSudo apt-get install treeは、これを表示するのに便利です。
In 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

参照には3つの基本タイプがあります:headsremotes、およびtags

  • .git/refs/headsはローカルmasterを保持します。

  • .git/refs/-remotesは多くのリモートを保持できますが、現時点ではOriginしかありません。

  • .git/refs/tags(他で議論されています)。

Originしたがって、私たちの唯一のリモートです。 Origin/masterを保持します。


2つのHEADS(現在のブランチへのポインター)、1つのローカル、および1つのリモートがあることがわかります。

$ 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)は、リモートではない唯一のブランチです。したがって、この場合、1つのローカルブランチがあります。ここから、独自の新しいブランチと後続のコミットのために、独自の作業を開始します。

次に、多くのリモートトラッキングブランチがありますが、ここで行います。これらは「remotes /」という接頭辞が付いているため、リモート追跡ブランチであることがわかります。ここに示されているものは、Originという名前のリモート用です。

  • したがって、2行目はOriginの現在のブランチポインターです。 Remotes/Origin:HEAD --points to-> master。これは、リモートリポジトリでは、現在のブランチがmasterという名前のブランチであることを示しています(masterというローカルブランチと混同しないでください)。

  • 残りのブランチは.git/refs /ツリーにはありませんが、.git/packed-refsにあります。

git fetchの場合、変更をリモートリポジトリからリモートトラッキングリポジトリにダウンロードします。

git mergeの場合、このローカルのリモートトラッキングリポジトリの変更を作業中のローカルブランチ(この場合はマスターブランチ)にマージします。

git pullの場合、これら2つのステップの両方を1回の操作で行います。)


これらのlocalおよびremotemasterのUUIDが現在同じノードを指す(別名「コミット」)ことに注意することも興味深いです:

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

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

したがって、ローカルマスターは、リモートのOriginマスターと同じ場所を指します。

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

答えよりも疑問の方が多いのは間違いありませんが、何が何であるかについてのあなた自身の質問に答える助けになると思います。

1
Elliptical view