「git branch -r」を実行すると「origin / HEAD」が表示されるのはなぜですか?


160

あなたが走るときgit branch -r、なぜ炎はそれをリストしorigin/HEADますか?たとえば、GitHubにはリモートリポジトリがあり、masterとawesome-featureの2つのブランチがあります。それをgit cloneつかんで新しいディレクトリに行き、ブランチをリストすると、次のようになります。

$ git branch -r
origin/HEAD
origin/master
origin/awesome-feature

またはそれがどんな順序になるか(アルファ?私はこの例を無実のレポのアイデンティティを秘密に保つために偽っています)。それで、HEADビジネスは何ですか?それが最後の人がするものですpush彼らの持っていたHEAD彼らは押されての尖ったを?それは常に彼らがpush編集したものではないでしょうか?HEADsが動き回る...なぜHEAD他のマシンで誰かが指摘されたことを気にするのですか?

私はリモートトラッキングなどのハンドルを取得しているだけなので、これは長引く混乱です。ありがとう!

編集:私は専用のリモートリポジトリ(GitHubのように誰もSSHを実行してそのコードで作業することはないが、プルまたはプッシュのみなど)はありませんでしたし、基本的にはHEADがありません作業コピーはありません。そうじゃない?


回答:


140

@robinstは正しいです。

gitでは、デフォルトで(つまり、クローンを作成するときに)チェックアウトするブランチを選択できます。デフォルトでorigin/HEADは、それを指します。

GitHubでは、GitHubリポジトリの管理設定でこれ変更できます。コマンドラインからも実行できます

git remote set-head origin trunk

またはそれを介して完全に削除する

git remote set-head origin -d

。[ブランチの切り替え]ドロップダウンを確認します。trunkがチェックされているため、origin/HEAD次のようになりますtrunk


私はあることを別のリモートと改名originし、私はotherremote/HEAD -> master私を悩ませました。コマンドを実行すると、それが修正されました。
フェリペアルバレス2017年

59

ベアリポジトリがHEADを持つことができるのは、リポジトリのクローン後に最初にチェックアウトされるブランチを決定するためです。

通常、HEADはマスターを指します。これは、リポジトリのクローンを作成するときにチェックアウトされるブランチです。(ベアリポジトリのHEADを編集して)別のブランチに設定すると、そのブランチがクローンでチェックアウトされます。


2
この参照はプッシュせずに削除できるためorigin/HEAD、ローカル参照は正しいですか?削除しても影響はありoriginますか?
Zach Posten

@zposten:いいえ、削除origin/masterしてもリモートには影響しません。
robinst 2016年

つまり、参照を複製した後は、参照は役に立たない情報にすぎません。
Bachsau

@Bachsau参照は複製されません。
robinst

27

専用のリモートリポジトリ(GitHubのように、誰もsshを実行してそのコードで作業することはないが、プルまたはプッシュのみなど)は、基本的に機能していないため、HEADを使用してはならないという印象を受けましたコピー。そうじゃない?

私はあなたが言ったのと全く同じ印象を持っていました。

そして、私はgithubからクローンされたそのorigin / HEADリモート追跡ブランチを削除することさえできません

git branch -d -r origin/HEAD

これは効果がありませんでした。

そのorigin / HEADリモート追跡ブランチを削除する方法を教えてもらえますか?

更新

githubからクローンしたときに作成されたorigin / HEADがある理由はわかりませんでしたが、削除する方法を見つけました。

gitの新しいバージョンが提供する

git remote set-head <name> -d

リモート追跡ブランチの不要なHEADポインタを削除します。

また、ダムのデフォルト名「origin」を、使用することで任意の名前に変更することもできます。

git remote rename origin <new_name>

これがお役に立てば幸いです。:)


(GitHubでも)同じ問題が発生し、set-headが機能しませんでした。「git remote set-head HEAD -d」を実行する必要がありますか?
Joost Schuur、2010

5
@Joost:それはgit remote set-head origin -d
znq

13

あなたことをしている右にプッシュ彼らは作業ディレクトリを持っていない場合には、彼らは「裸」のとき専用のリモートリポジトリがはるかに良い仕事を。Gitのアーキテクチャは、パッチまたはpullfetch)による更新用に設計されています。これは、分散型VCSでは理にかなっています。ドキュメントがどこかで言うように、現在チェックアウトされているブランチにプッシュすると、「予期しない結果」になる可能性があります。

HEADは、有効なリポジトリーの要件の一部です。Gitリポジトリレイアウトによると、

HEAD

A symref (see glossary) to the refs/heads/ namespace describing the currently active  
branch. It does not mean much if the repository is not associated with any working tree  
(i.e. a bare repository), but a valid git repository must have the HEAD file; some  
porcelains may use it to guess the designated "default" branch of the repository  
(usually master). It is legal if the named branch name does not (yet) exist.

したがって、「それはあまり意味がない...」としても、HEADはブランチリストの一部として表示されます。


これは意味がありません。リポジトリは最初は裸のままですが、何かをプッシュするとき、もはや裸ではなく、それらに対して「gitブランチ」を実行すると、現在チェックアウトされているブランチが表示されます。
ジオイデシック2014

@geoidesicリポジトリにプッシュしたとしても、それは裸になる可能性があります。以下はmkdir foobar; cd foobar; git init --bare; cd ..; git clone foobar foobar_clone; cd foobar_clone; touch file; git add file; git config --global user.email "you@example.com"; git config --global user.name "Your Name"; git commit -m "test"; git push origin master; cd ..; cd foobar; git config core.baretrueを出力します。また、これらのコマンドに対するfoobarリポジトリには、プッシュされたファイルの作業用コピーはありません。
AndersLindén16年

@geoidesicリポジトリにプッシュしたとしても、それは裸になる可能性があります。以下はmkdir foobar; cd foobar; git init --bare; cd ..; git clone foobar foobar_clone; cd foobar_clone; touch file; git add file; git config user.email "you@example.com"; git config user.name "Your Name"; git commit -m "test"; git push origin master; cd ..; cd foobar; git config core.baretrueを出力します。また、これらのコマンドに対するfoobarリポジトリには、プッシュされたファイルの作業用コピーはありません。
AndersLindén16年

@geoidesic --bare git repoは、作業ツリーのないレポ、つまり.gitディレクトリのみを含むが、チェックアウトされたファイルをまったく持たないレポを意味します。チェックアウトされたファイルがないため、実際には.gitディレクトリさえありません。すべての.gitファイルを直接メインディレクトリに配置します。作成すると表示されます!
00prometheus

5

「origin」がリモートリポジトリの場合、origin / HEADはそのリモートリポジトリのデフォルトのブランチを識別します。

例:

$ git remote show
origin
$ git remote show origin
* remote origin
  Fetch URL: git@github.com:walkerh/pipe-o-matic.git
  Push  URL: git@github.com:walkerh/pipe-o-matic.git
  HEAD branch: master
  Remote branch:
    master tracked
  Local branch configured for 'git pull':
    master merges with remote master
  Local ref configured for 'git push':
    master pushes to master (fast-forwardable)

「HEADブランチ:マスター」という行に注意してください。ここで、リモートリポジトリは、デフォルトでチェックアウトするブランチをクライアントに通知します。


1

リモートリポジトリ(マスターの場合とそうでない場合があります)の現在チェックアウトされているブランチを指す HEADが常に存在します。リモートリポジトリにも現在のブランチがあります。通常それはマスターであり、私の頭の上からそれを変更したいと思う理由は何も考えられませんが、変更することはできます。


2
githubリポジトリはブランチをチェックアウトしていません。これが当てはまる理由がわかりません。
ダスティン

リモートリポジトリには作業ディレクトリがあってはなりません。リモートリポジトリは--bareにする必要があるため、現在チェックアウトされているブランチを含めることはできません。
n4rzul 2015

-14

私の推測では、誰かがブランチをプッシュしてHEADと呼びました:

git push origin HEAD

これの何が問題になっているのかについてコメントをいただけますか?GitHubでorigin / HEADが必要な場合は、それが私がそこに到達するための唯一の方法です。
ダスティン

リモートHEADはシンボリック参照です(通常はrefs / heads / master)。シンボリック参照を現在のブランチのコミットのハッシュIDに置き換えます。
Daniel Fanjul、2009年

2
推測は、不正確な回答ではなく、コメントで議論されるべきではありませんか?
Luciano
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.