web-dev-qa-db-ja.com

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

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が指していたものですか?それは常に彼らがPushedされたものではないでしょうか? HEADsが動き回る...誰かがHEADが他のマシンで何を指しているのか気にするのはなぜですか?

私はリモートトラッキングなどに取り組んでいるだけなので、これは長引く混乱です。ありがとう!

編集:私は専用のリモートリポジトリ(GitHubのように誰もそのコードをsshして作業しないが、プルやプッシュなどのみ)はしなかった、そしてHEAD基本的に作業コピーがなかったからです。

146
Ben Hamill

@ robinstは正しいです。

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

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

git remote set-head Origin trunk

または経由で完全に削除します

git remote set-head Origin -d

。 [ブランチの切り替え]ドロップダウンを見てください。 trunkがチェックされているため、Origin/HEADtrunkに続きます。

129
cdunn2001

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

通常、HEADはマスターを指します。これは、リポジトリを複製するときにチェックアウトされるブランチです。別のブランチに設定する(HEAD inベアリポジトリ)は、そのブランチがクローンでチェックアウトされる結果になります。

57
robinst

私は、専用のリモートリポジトリ(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>

これが役立つことを願っています。 :)

23
boblu

確かに、プッシュ専用のリモートリポジトリは、「裸」の場合、つまり作業ディレクトリがない場合にはるかに機能します。 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を見るでしょう

13
Paul

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

例:

$ git remote show
Origin
$ git remote show Origin
* remote Origin
  Fetch URL: [email protected]:walkerh/pipe-o-matic.git
  Push  URL: [email protected]: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 branch:master」という行に注意してください。これは、リモートリポジトリがクライアントにデフォルトでチェックアウトするブランチを知らせる場所です。

3
Walker Hale IV

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

2
codelogic