Gitブランチ:マスターvsオリジン/マスターvsリモート/オリジン/マスター


201

私はgitの基本的な概念を理解するために正しい道を進んでいると思います。

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

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

  • origin / master対remotes / origin / master

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

しかし、正確にはorigin / masterは何ですか?


1
@ChristopherWallace:編集で2つの質問をメタで引き起こしました:「本当に[origin]タグが必要ですか?」と「本当の[Master]は何ですか?
デデュプリケータ2015

@Deduplicatorそれは問題ですか?
nbro 2015

@ChristopherWallace:さて、多くの人が両方のタグ(作成したタグと追加したタグ)は悪いと思っているようです。私はたまたま同意しますが、おそらくあなたは考慮されなかったリンクされた議論に追加する何かがあるでしょう。そうでなければ、そうです。
デュプリケータ


フォローアップの質問:なぜ.git/refs/origin/masterドリフトするの.git/refs/remotes/origin/masterですか?これは今私に起こって、私は捨てられています。
ポール

回答:


219

リモートリポジトリのクローンを取得して実行します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あるdefault branchという名前のリモートのためにorigin。これにより、のorigin代わりに単に言うことができますorigin/master


5
いい答えだ。基になるrefが格納されている(パックされていない場合)ためgit branch -a、リモートブランチをそのまま表示すると思います。私の意見では、おそらくリモートの名前をブランチの名前からスラッシュ以外の何かで区切ることによって、の出力はより明確になる可能性があります。remotes/origin/master.git/refs/remotes/origingit branch -a
Matt Hurne、2012年

14
またgit branch -r、はリモートブランチのみを表示するorigin/masterため、remotes/接頭辞が不要なため、ブランチが表示されることにも注意してください。
Matt Hurne、2012年

3
@misterbiscuit:それは本当です。出力は明確にするよりも混乱します。おかげで、正しいヒントが得られた私の質問への素晴らしい答え
ジョンランペル

私が見るgit logを見るとcommit fa9sd8jasdf98 (HEAD -> master)、これはどういう意味ですか?このインスタンスのHEADは何ですか?私は現在「マスター」であると思っていて、にコミットしていorigin/masterます。何か混同したと思いますが、誰かが沈静化するのを手伝ってくれませんか?編集の更新:わかったと思いますが、HEADが現在マスターブランチを指していると想定することは正しいですか?つまり、現在マスターにコミットしている最中です
セバスチャンニールセン

@SebastianNielsenはい、そうです。HEAD-> masterパートは、現在masterブランチにいることを意味します。
iRestMyCaseYourHonor

108

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

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

9
origin / master =リモートマシンのバックアップ、前回チェックしたときに更新されましたmaster = origin / masterのコピー
sakurashinken

40

技術的には、実際に任意の「リモート」すべてのものがない1あなたのGitのレポでは、そこにあるだけでローカル名必要があります別の名前、別のレポに対応しています。名前origin/whateverが付けられたものは、最初はクローン元のリポジトリ上のものと一致します。

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

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

git fetch「somes.where.out.there」の更新版を更新するまでの時間に応じて、ブランチが変更され、新しいブランチが作成され、一部が削除される場合があります。あなたがあなたのgit fetch(またはgit pull実際にフェッチとマージ)を行うとき、あなたのリポジトリは彼らの新しい仕事のコピーを作成しrefs/remotes/origin/<name>、必要に応じてすべてのエントリーを変更します。fetchすべてが一致するのは、このingの瞬間です(まあ、それと、最初のクローン、および一部の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 fetchありませんアップデートを。実行git fetch origin master していない。残念ながら、この「更新しない」モードは通常のによってトリガーされgit pullます。(これは主にちょっとした煩わしさであり、Git 1.8.4以降で修正されています。)


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


2
私のような初心者のための優れた説明、ありがとう!彼女は置く理由を明記origin/masterのステッカーをlocalレポのグラフではなく、上のremote1(私は心からジェシカカーのに新しい人々のためのプレゼンテーション「Gitはどうなる」をお勧めしますgitvimeo.com/46010208を私は30:00の間、私の頭を悩まれました- 30。: 19.)
長老

11

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

  • origin / masterは、リモートリポジトリのマスターブランチの状態です。
  • masterは、ローカルリポジトリのmasterブランチの状態です

1
良い試みだがlast time I've checked重要なポイントを失うことのない私見
Alexei Martianov

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

$ 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-これは、リモートリポジトリのマスターブランチを参照するための単なるポインタです。原点がリモートを指すと言ったことを思い出してください。

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

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


5

1つの明確化(および私を混乱させたポイント):

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

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

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


より正確にHEADは、「ブランチへのポインタ」です(ローカルリポジトリ内の実際のファイルには、文字列が含まれていることがよくありref: refs/heads/masterます。たとえば、「デタッチ」されていない限り、これはまったく別のことです)。ただし、clone「リモートHEAD」を解釈する方法にはある種のバグがあります。転送プロトコルは間接ブランチをまったく送信できず、未加工のSHA-1のみを送信できるため、gitはこれを「ほぼ機能」させます。たまに誰かが奇妙な事件に遭遇することもあります。私はgitがまったく作成remotes/origin/HEADしなかったことを願っています。特に、うまくいかなかった場合は...
torek

2

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


たとえば、LibreOfficeソースベース用の.gitのやや省略したツリーは次のとおりです。

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

リファレンスにヘッドリモートタグの 3つの基本タイプがあります

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

  • .git / refs / remotesは複数のリモートを保持できますが、現在のところ、そこにはオリジンしかありません。

  • .git / refs / タグ(他の場所で説明されています)。

したがって、起源は私たちの唯一のリモートです。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 /」が付いているため、これらはリモート追跡ブランチです。ここに表示されているものは、リモートの名前付きオリジンに関するものです。

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

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

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

git mergeするとき私達は私達のマスターブランチにこのケースでは、私たちの作業をローカルのブランチには、このローカル、リモートの追跡リポジトリに変更をマージ。

(私たちが git pullを実行すると、これら2つのステップの両方が1回の操作で実行されます。)


マスターのこれらのローカルおよびリモート UUIDが現在同じノード(別名「コミット」)を指していることに注意することも興味深いです。

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

確かにこれは答えよりも多くの質問を残しますが、何が何であるかについてのあなた自身の質問に答えるのに役立つようになり始めると思います。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.