「gitstatus」がマスターブランチにいることを示し、「gitbranch」が新しく作成されたリポジトリにないのはなぜですか?


83

プロセスを自動化し、git branchコマンドを発行して、自分がどのブランチにいるかを調べようとしています。git branch何も返さない新しく初期化されたリポジトリを除いて、すべてが正常に機能しています。最初のコミットでさえも、リポジトリで何もしなかったので、答えを受け入れることができます。ただし、を実行するgit statusと、次のように、masterブランチにいることがわかります。

$ mkdir todelete
$ cd todelete
$ git init
Initialized empty Git repository in /u/u70021a/todelete/.git
$ git status
On branch master

No commits yet

nothing to commit (create/copy files and use "git add" to track)
$ git branch
$

私は何か間違ったことをしていますか?正しく設定していない設定はありますか?

また、Gitには新しい人がたくさんいますが、彼らがどのブランチにいるかを表示するコマンドが何も表示しないのに、statusコマンドが表示する理由を説明できません。

回答:


94

私は他に2つの答えを支持しましたが、これを考える方法は簡単だと思います 。存在しないブランチにいることができます。ブランチ名が存在するためには、そのブランチ名既存の有効なコミットのハッシュIDを識別しなければならないため、 これは新しい空のリポジトリでも正常です。新しい空のリポジトリにはコミットがないため、ブランチ名はまだ存在できません。

それにもかかわらず、あなたは最初、いくつかのブランチにいます。現在のブランチは、その名前が特別な名前に格納されているブランチですHEAD。新しい空のリポジトリでは、Gitは名前master(より正確にrefs/heads/masterは、ブランチのフルネーム)をに格納するHEADためmastermaster存在しない間はになります。

使用している存在しないブランチを変更できますgit checkout -b

$ git init
Initialized empty Git repository in [path]
$ git checkout -b asdf
Switched to a new branch 'asdf'
$ git checkout -b hello
Switched to a new branch 'hello'

存在しないブランチにいるときはいつでも、次に行うコミットによってブランチが作成されます。これはまた、どのようにgit checkout --orphan機能するかです。


6
ありがとう。私はgitが表示しているものに同意しませんが。少なくとも私はその理由を理解しています。チェックアウトの例は興味深いものです。「gitcheckout」のドキュメントによると、-bは次のことを意味します。厳密には正しくない<new_branch>という名前の新しいブランチを作成します。あなたの例では、ブランチasdfもhelloも実際には作成されていません。ただし、コミットが実行された場合はそうなります。私の個人的な意見では、コミットが実行されるまでマスターブランチは存在しないため、「ブランチマスター上」メッセージを「ブランチマスターへの次のコミット」に変更する必要があります。
GOVarney

2
これがあなたのケースに関連しているかどうかはわかりませんが、Gitの場合、ブランチにまったく参加しない可能性があることを指摘したいと思います。
sklott

Gitは内部的に使用していますcat .git/HEAD枝の把握、それが何であるかを見るために、分岐のはおそらく、なぜ彼らはそれをしなかったように、より多くのCPUとディスクの時間を消費することになる存在
Ferrybig

言及すべきことgit branchは、自動化されたプロセスでは、そのユースケース向けに設計されていないため、まったく使用すべきではないということです。磁器以外のコマンドがここに何を示しているかを見るのは興味深いでしょうgit symbolic-ref --short HEADが、同じ動作をしますか?
VOO

@Voo:切り離されていない場合にgit symbolic-ref含まれるHEAD(したがって、孤立した/生まれていないブランチ参照)に含まれる名前を示しますHEAD。新しい空のリポジトリでHEAD 、デタッチされたHEADに既存の有効なコミットのハッシュIDが含まれている必要があるため、デタッチできません。(HEADが切り離された空でないリポジトリでgit symbolic-refは、エラーが発生します。)
torek

23

git branchブランチがないため、何も表示されません。しかし、あなたが読むことができるようにman git init

このコマンドは、空のGitリポジトリーを作成します。基本的には、オブジェクト、refs / heads、refs / tags、およびテンプレートファイルのサブディレクトリを持つ.gitディレクトリです。マスターブランチのHEADを参照する初期HEADファイルも作成されます。

関連すると思われる部分を太字にしました。マスターブランチはまだありませんが、それへの参照はすでに存在しているため、に示されていgit statusます。コミットすると、適切なブランチが作成されます。


3
それは「gitの状態」だけに見られるように、「支店名」を表示されるようになりますので.gitを/ HEAD(参照:レフリー/ヘッド/マスター)が、中に見ることで何の整合性チェックを行いません.git /レフリー/ヘッドそれかどうかを確認するために実際に存在します。
GOVarney

gitのコードを調べていなかったので、はっきりとはわかりませんが、あなたが書いたことは私には理にかなっています。しかし、それでも私は私のよりもトレックの答えを好みます:)。
Stanowczo

17

既存の回答は、出力がそれが何であるかという文字通りの質問に対処していますが、実際の問題については少し理解していると思います...

あなたは何かを自動化していると言ったので、スクリプトのコンテキストではどちらgit statusgit branch最良のツールではないことをお勧めします。

このディスカッションでは、いくつかの代替案を見つけることができます。現在チェックアウトされているGitブランチをプログラムで決定する方法

あなたのニーズ(またはあなたが胎児の枝をどのように振る舞わせたいか)を知らなければ、私は必ずしも推奨をすることはできませんが、私が得ているポイントは、いくつかのコマンドは人間の相互作用(磁器)用であり、他のコマンドはスクリプト(配管)


15

枝はまだ生まれていません。したがってgit branch、表示されません(git symbolic-ref HEADHEADがデフォルトのブランチマスターを指していること、およびgit branch表示されていないために生まれていないことを示します。つまり、まだ存在していないブランチにいる可能性があります)。ただし、何かをコミットするとブランチが作成されます。

これは、orphanブランチをチェックアウトする場合にも当てはまります。

git statusこれが作成されるブランチであるため、ブランチ名が表示されていると思います。

スクリプトについては、現在チェックアウトされているGitブランチをプログラムで判別する方法を参照してください。


2

gitでは、デフォルトのブランチはmasterです。コミットすると、gitは現在のブランチを「使用」します。「デフォルト」ブランチにある新しいリポジトリを初期化したため、ブランチリストにリポジトリが表示されないため、変更をコミットすると表示されます。

ここに画像の説明を入力してください

ここに画像の説明を入力してください


2
ブランチを理解していますが、「gitstatus」が存在しないブランチにいると言っている理由がわかりません。
GOVarney
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.