143


41

"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」ビジネスとは何ですか? 最後にプッシュした人がプッシュしたときに「HEAD」が指し示していたのはどうですか? それが彼らが「プッシュ」されたものであるということがいつもそれであるということではないか? 「HEAD」は動き回る… なぜ私は誰かの「HEAD」が他のマシンで指摘したことを気にかけなければならないのですか?

私はリモートトラッキングなどを扱っているだけなので、これは長続きする混乱です。 ありがとうございます。

編集:私は、専用のリモートリポジトリ(誰もそのコードをsshに入れて作業することはありませんが、プルやプッシュなどはしないGitHubのように)は基本的にHEADを持っていないし、すべきでないという印象を受けました作業コピーはありません。 そうではありませんか?

7 Answer


125


  • @ robinst *は正しいです。

gitでは、どのブランチをデフォルトでチェックアウトするかを選択できます(例: クローンしたとき) デフォルトでは、 `origin / HEAD`はそれを指します。

GitHubで、GitHubリポジトリの管理者設定でhttps://github.com/blog/421-pick-your-default-branch [これを変更できます]。 次のコマンドラインからも実行できます。

git remote set-head origin trunk

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

git remote set-head origin -d

https://github.com/apache/ant [例] 'Switch Branches’ドロップダウンを見てください。 trunk`がチェックされるので、 origin / HEAD`は `trunk`の後に続きます。


56


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

通常、HEADはmasterを指しており、それは人々がリポジトリを複製するときにチェックアウトされるブランチです。 (ベアリポジトリのHEADを編集して)別のブランチに設定すると、そのブランチはクローンでチェックアウトされます。


23


_ 私は、専用のリモートリポジトリ(GitHubのように、誰もそのコードをsshして操作しないが、プルまたはプッシュのみなど)が、基本的には機能しないため、HEADを持たないという印象を受けました。コピー。 そうではありませんか? _

私はあなたが言ったのとまったく同じ印象を受けました。

そして私はgithubから複製されたorigin / HEADリモートトラッキングブランチを削除することさえできません。

git branch -d -r origin/HEAD

これによる影響はありません。

そのオリジン/ HEADリモートトラッキングブランチを削除する方法を教えてもらえますか?

更新

githubからクローンを作成したときになぜオリジン/ HEADが作成されるのか私は知りませんでしたが、それを削除する方法を見つけました。

gitの新バージョンが提供

git remote set-head  -d

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

また、ダムのデフォルト名 'origin’を使用して好きな名前に変更することもできます。

git remote rename origin

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


13


あなたは、専用のリモートリポジトリに*プッシュ*することは、それらが '裸’であるとき、すなわちそれらが作業ディレクトリを持っていないときにはるかにうまく機能することは正しいです。 Gitのアーキテクチャーは、パッチによる更新または pull(` fetch`)のために設計されています。これは分散型VCSでは意味があります。 ドキュメントがどこかに言っているように、現在チェックアウトされているブランチにプッシュすると* "予期しない結果" *が発生する可能性があります。

HEADは有効なリポジトリの要件の一部です。 http://kernel.org/pub/software/scm/git/docs/v1.6.0.5/gitrepository-layout.html [Git Repository Layout]次のように述べています。

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をブランチリストの一部と見なすことになります。


3


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

例:

$ gitリモートショーの由来$ gitリモートショーの由来
*  リモートオリジン取得URL:[email protected]:walkerh / pipe-o-matic.gitプッシュURL:[email protected]:walkerh / pipe-o-matic.git HEADブランチ:masterリモートブランチ:master trackedローカルブランチの設定'git pull'の場合:マスターはリモートマスターとマージします。 'git push'用に設定されたローカル参照:マスターはマスターにプッシュします(早送り可能)。

「HEAD branch:master」という行に注意してください。 これは、リモートリポジトリがデフォルトでチェックアウトするブランチをクライアントに知らせる場所です。


2


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


-8


誰かがブランチをプッシュしてそれをHEADと呼んだと私は思います:

git push origin HEAD