Gitで現在のブランチ名を取得するにはどうすればよいですか?


2595

私はSubversionの出身ですが、ブランチがあるときは、「これらの作業ファイルがこのブランチをポイントしている」ので、自分が何をしているのかわかっていました。

しかし、Gitでは、NetBeansやNotepad ++でファイルを編集しているとき、マスターと別のブランチのどちらに関連付けられているかはわかりません。

gitbashには何の問題もありません。それは私が何をしているかを教えてくれます。


11
IDEにファイルを.git/HEAD、おそらく親ディレクトリに表示させます
Tino

101
stackoverflow.com/questions/1417957/... $ gitのREV-解析--abbrev-REF HEAD
fantastory



9
Git 2.22(2019年第2四半期)を使用すると、よりシンプルなアプローチになりますgit branch --show-currentここで私の答えを参照してください
VonC 2019年

回答:


2305
git branch

リポジトリのすべてのローカルブランチを表示する必要があります。スター付きブランチが現在のブランチです。

現在のブランチの名前のみを取得したい場合は、次のようにすることができます。

git rev-parse --abbrev-ref HEAD

しかし、それはNotepad ++とNetbeansで私を助けません。ちょうどgit bash(およびProbobly Vim)と私はそれについて述べました。コマンドラインを使わない他のIdeやテキストエディターと一緒に作業するのに苦労しています。
mike628

@ mike628 GUIからアクセスできるものを必要とする場合を除いて、実際にはそれらはあなたを助けています。正しい?
Tadeck

2
Eclipseで作業するつもりであれば、「eGit」と呼ばれるプログラムがあり、そのGUIには、その中のすべてのリポジトリーの現在のブランチが表示されます。そうでなければ、私は知りません。あなたが選択したプログラム(存在する場合)と互換性のある、使用したいプラグインの作成者のなすがままになります。
roberttdev

2
やった後git checkout --orphan foo、その後git branchの分岐を示すことができませんでしたfoogit symbolic-ref HEAD提案されたように別の答えが働いたのに対し。
Marcus Junius Brutus

2
downvote、我々はすべての支店、標準出力としてのみ現在のブランチをしませほしい
アレクサンダー・ミルズ

4657

表示されている他のブランチなしで現在のブランチを表示するには、次のようにします。

git rev-parse --abbrev-ref HEAD

参照:


132
@ChrisNelson、すべてのブランチの長いリストではなく、現在のブランチのみを表示するため。
avakar

73
いいですね、残念なことに、「切り離されたHEAD」状態にある場合は機能しません(「HEAD」を出力するだけで、まったく役に立ちません)。
CarlosCampderrós2013年

34
あなたは「デタッチHEAD」状態にある場合ので、私は、それが属する枝のない追跡はありませんgitの内部で推測git branchショー* (no branch)も役に立たない、...
カルロスCampderrós

76
「git symbolic-ref --short HEAD」もこれと同じ目的で機能します
dusktreader 2013年

22
git rev-parse --abbrev-ref HEAD 2>/dev/null / dev / nullの部分は、まだHEADになっていない新しいリポジトリを作成した場合にエラーが表示されるのを防ぎます。
Paradiesstaub 2013年

523

git symbolic-ref HEAD完全なrefspecを表示するものもあります。

Git v1.8以降でブランチ名のみを表示するには(これを指摘してくれたGregに感謝します):

git symbolic-ref --short HEAD

Git v1.7以降では、次のことも実行できます。

git rev-parse --abbrev-ref HEAD

ブランチを使用している場合は、両方に同じブランチ名を付ける必要があります。頭が離れている場合、答えは異なります。

注意:

以前のクライアントでは、これはうまくいくようです:

git symbolic-ref HEAD | sed -e "s/^refs\/heads\///"

ダリエン26. 2014年3月


7
他のすべての回答と同様に、これは、「切り離されたヘッド」状態にある場合は機能しません
CarlosCampderrósJan

51
@CarlosCampderrós:デタッチされたHEAD状態の場合、現在のブランチなどはありません。結局のところ、あなたがいるコミットはゼロ、1つ以上のブランチから到達可能かもしれません。
Flimm 2014年

2
これにより、HEADがない場合に空のgitリポジトリで問題が発生します
Arne

8
gitバージョン2.4.4 git rev-parse --abbrev-ref HEADを使用HEADすると、分離した頭の上にいるときに表示されます。
peterhil、2015

何も表示されない、またはHEADを表示する他の回答とは異なり、切り離された状態の場合とgit symbolic-ref HEAD | sed -e "s/^refs\/heads\///" 同様HEAD detached at a63917fに文字列が表示されるため、最良の回答はまだです。これは重要。
Bernard

265

私自身の参照のため(ただし、他の人にとっては役立つかもしれません)、このスレッドで言及されているほとんどの(基本的なコマンドライン)テクニックの概要を作成しました。それぞれ、いくつかのユースケースに適用されます。

  • ローカルブランチ(マスター)
  • ローカルブランチと同期したリモートトラッキングブランチ(マスターと同じコミットのオリジン/マスター)
  • ローカルブランチと同期していないリモートトラッキングブランチ(origin / feature-foo)
  • タグ(v1.2.3)
  • サブモジュール(サブモジュールディレクトリ内で実行)
  • 一般的な分離ヘッド(上記のいずれでもない)

結果:

  • git branch | sed -n '/\* /s///p'
    • ローカルブランチ: master
    • リモート追跡ブランチ(同期): (detached from origin/master)
    • リモート追跡ブランチ(同期していない): (detached from origin/feature-foo)
    • 鬼ごっこ: (detached from v1.2.3)
    • サブモジュール: (HEAD detached at 285f294)
    • 一般的な分離ヘッド: (detached from 285f294)
  • git status | head -1
    • ローカルブランチ: # On branch master
    • リモート追跡ブランチ(同期): # HEAD detached at origin/master
    • リモート追跡ブランチ(同期していない): # HEAD detached at origin/feature-foo
    • 鬼ごっこ: # HEAD detached at v1.2.3
    • サブモジュール: # HEAD detached at 285f294
    • 一般的な分離ヘッド: # HEAD detached at 285f294
  • git describe --all
    • ローカルブランチ: heads/master
    • リモート追跡ブランチ(同期):(heads/master注:ない remotes/origin/master
    • リモート追跡ブランチ(同期していない): remotes/origin/feature-foo
    • 鬼ごっこ: v1.2.3
    • サブモジュール: remotes/origin/HEAD
    • 一般的な分離ヘッド: v1.0.6-5-g2393761
  • cat .git/HEAD
    • ローカルブランチ: ref: refs/heads/master
    • サブモジュール: cat: .git/HEAD: Not a directory
    • 他のすべての使用例:対応するコミットのSHA
  • git rev-parse --abbrev-ref HEAD
    • ローカルブランチ: master
    • 他のすべての使用例: HEAD
  • git symbolic-ref --short HEAD
    • ローカルブランチ: master
    • 他のすべての使用例: fatal: ref HEAD is not a symbolic ref

(これはgitバージョン1.8.3.1で行われました)


6
要約すると、誰も私が手作業で行うようなことをまったくしていません。
ブクソール2015

6
これは私にとって非常に役に立ちました:私にとってgit describe --all --exact-match 2>/dev/null | sed 's=.*/=='最良の解決策でした(タグとブランチヘッドの適切な名前、ランダムに分離されたヘッドの出力なし)
Alex Dupuy

1
しかし、git describe同じコミットを参照する複数のブランチがある場合、使用直後に重大な障害が発生することを発見しました。たとえば、直後にgit checkout -b foo-それらの1つを任意に使用します(おそらく最近作成されたもののようです)。フィルター処理された出力を使用するように戦略を変更し、結果が分離したヘッドに関するものである場合にgit branchのみ使用しますgit describe
Alex Dupuy

実際にgit branch --no-colorは、ファイル名に煩わしい端末エスケープコードがないことを確認するために使用する必要があります。
Alex Dupuy、

2
これは私にとって何度も役に立ちました。
アリスパーセル

154

gitのバージョン2.22以降では、次のように使用できます。

git branch --show-current

manページによると:

現在のブランチの名前を出力します。切り離されたHEAD状態では、何も出力されません。


2
はい、私はそのページのコメントで昨年3月にそのことを述べました:stackoverflow.com/questions/6245570/…。そして、stackoverflow.com / a / 55088865/6309にあります。
VonC

5
少なくとも、これがデタッチされたHEAD状態では機能しないことに言及してください。何時間もかけてgit 2.22が何もせずにコンパイルできるようにして数時間を費やしただけです...
David Deprost

136

もう1つの選択肢:

git name-rev --name-only HEAD

次のecho ${$(git symbolic-ref --quiet HEAD)#refs/heads/}
Antoine

12
HEADがマスターブランチと機能ブランチで同じ場合(たとえば、マージ中)は機能しません。機能ブランチで実行された場合でも、「マスター」を返します。
オレストヘラ

1
git checkout master && git name-rev --name-only HEAD # ac-187期待どおりに機能しない
Alexander Abashkin

マージの直前にこれを変数に保存します。特定のコミットをチェックアウトすると、HEADがデアタッチされる場合もあります。これらの場合、これは正常に機能します。
Ishaan Sejwal

4
Jenkinsパイプラインからこれを行っています。ですから、これは当分の間私にとって最良の答えであるように思われます。こうgit branch --listちょうど言います* (HEAD detached at 7127db5)。行うgit rev-parse --abbrev-ref HEADだけで言うHEADと、上のようにします。
Mig82

91

非常に単純で、私はそれをワンライナーで取得しました(bash)

git branch | sed -n '/\* /s///p'

(クレジット:限定的な償い)

そして、私がそこにいる間、リモートトラッキングブランチ(存在する場合)を取得する1つのライナー

git rev-parse --symbolic-full-name --abbrev-ref @{u}

8
スラッシュが多すぎます!:) sed -n 's/\* //p'トリックを行います。私は偏執狂の傾向があるのでそれでそれを固定しsed -n 's/^\* //p'ます。
マークリード

65

Linuxでは、リポジトリー・ディレクトリーにコマンド行(コンソール)を入力するだけです。

$ git status

そしていくつかのテキストが表示されます。

...
On branch master
...

これは、現在masterブランチにいることを意味します。その時点でファイルを編集していて、同じローカルリポジトリ(Gitバージョン管理下にあるファイルを含むローカルディレクトリ)にある場合、このブランチでファイルを編集しています。


2
何をしたいかに基づいて、のような結果が得られるgit status出力の最初の行のみを使用して取得できます。バージョンの違いも考慮する必要があると確信しています。git status | head -1# On branch master
Joshua Pinter、2011

@JoshPinter:を使用することもできますがgit status | grep 'On branch'、これは同じ効果をもたらすはずです(Gitのバージョンによって表示が異なる場合にそうなるとは限りません)。またはgit branch | grep '*'、これは、枝の先頭に星が付いた枝の名前を示します。
Tadeck、2012年

うん、それは同様に機能し、より柔軟かもしれません。DEVのRailsアプリでちょうどブランチ名を示すための私の最終的な結果でした:<tick>git status | head -1<tick>.gsub('# On branch ', '')
ジョシュアピンター

1
git status管理されているファイルが多い場合、値を返すのに長い時間がかかることがあります。
ティンマン

たとえば、ブランチをWebページに印刷したい場合、ページgit status全体の生成時間が長くなる可能性があります。
Artem Russakovskii

36
git symbolic-ref -q --short HEAD

現在のブランチ名が必要なスクリプトでこれを使用しています。現在のブランチ名となるHEADへの現在の短いシンボリック参照が表示されます。


1
ありがとうございます。-スクリプトに "-C path_to_folder"も追加しています。
Tony

1
-qオプションを使用すると、「デタッチされたHEAD」状態でエラーコードが返されますが、stderrには何も出力されないため、これは優れたソリューションです。
Hallidave

これは、コミットなしで新しいリポジトリで私のために働いた唯一の解決策です
kundasaba '14 / 04/19

26
git branch | grep -e "^*" | cut -d' ' -f 2

ブランチ名のみを表示します


ブランチが「*(SUM_BRANCH_01で切り離されたHEAD)」のようなものを示している場合は、この「gitブランチ| grep -e "^ *" | cut -d '' -f 5 | cut -d ')' -f 1 "
ディランカップ

このまったく同じスクリプトを作成して、現在のブランチ名を取得しました。私はそれが差分に役立つかもしれないと考えました。
tggagne

25

git branch 現在のブランチ名のみを表示します。

gitブランチではすべてのブランチが表示され、現在のブランチがアスタリスクで強調表示されますが、多数のブランチを処理する場合は扱いにくい場合があります。

現在使用しているブランチのみを表示するには、次を使用します。

git rev-parse --abbrev-ref HEAD

これは、ciおよびその他のビルドツールに最適です。
phouse512 2018

スクリプトで使用するための最良の回答
ベンキール2018

1
@DylanNicholson git branch --containsは、複数のブランチをリストすることがあります。
Joe Chacko

22

good ol 'awkを使用して、Oliver Refaloと同じ長さのコマンドラインソリューションを見つけました。

git branch | awk '/^\*/{print $2}'

awkそれを「{}正規表現に一致する行に入力する」と読みます。デフォルトでは、空白で区切られたフィールドを想定しているため、2番目を印刷します。ブランチのある行にのみ*があると想定できる場合は、^をドロップできます。ああ、バッシュゴルフ!


19
#!/bin/bash
function git.branch {
  br=`git branch | grep "*"`
  echo ${br/* /}
}
git.branch

18

現在のブランチの名前を伝えるgit-awareシェルプロンプトを使用しないのはなぜですか? git statusまた役立ちます。


どのようにgit-prompt.shからcontrib/で定義されて、(gitのバージョン2.3.0)それをしない__git_ps1ヘルパー関数:

  1. まず、進行中のリベースが検出された場合、特別なケースがあります。Gitはリベースプロセス中に名前のないブランチ(デタッチされたHEAD)を使用してアトミックにし、元のブランチは別の場所に保存されます。

  2. 場合は.git/HEAD、ファイルが(Gitリポジトリの古代史から非常にまれなケース、)シンボリックリンクである、それは使用していますgit symbolic-ref HEAD 2>/dev/null

  3. それ以外の場合は、.git/HEADファイルを読み取ります。次のステップは、その内容によって異なります。

    • このファイルが存在しない場合、現在のブランチはありません。これは通常、リポジトリが裸の場合に発生します。

    • 'ref: 'プレフィックスで始まる場合、.git/HEADsymref(シンボリック参照)であり、通常のブランチにいます。このプレフィックスを削除refs/heads/して完全な名前を取得し、削除して現在のブランチの短い名前を取得します。

      b="${head#ref: }"
      # ...
      b=${b##refs/heads/}
      
    • で始まらない場合'ref: 'は、デタッチされたHEAD(匿名ブランチ)があり、いくつかのコミットを直接指します。git describe ...現在のコミットを人間が読める形式で書き込むために使用します。

お役に立てば幸いです。


3
そして、git対応のシェルプロンプトを開発している場合、ここでどの回答を使用する必要がありますか?カメはずっと下にいます。
Tripleee、2015

1
@tripleee:github.com/git/git/blob/master/contrib/completion/git-prompt.shからアイデアを借りる
JakubNarębski15年

4
これは、git describe --contains --all HEADこのページの他の場所では現在見られないことのようです。ご存知のとおり、StackOverflowではリンクのみの回答は推奨されていません。
Tripleee、2015

2
@tripleee:私はgit-prompt.sh(別名__git_ps1)がどのようにそれを行うかについての説明を追加しました...
JakubNarębski

17

git statusのノイズの少ないバージョンでうまくいくでしょう

git status -bsuno

プリントアウト

## branch-name

1
##開発...原点/開発
Kalpesh Soni

16

申し訳ありませんが、これは別のコマンドラインの回答ですが、この質問を見つけたときに私が探していたものであり、これらの回答の多くは役に立ちました。私の解決策は次のbashシェル関数です:

get_branch () {
    git rev-parse --abbrev-ref HEAD | grep -v HEAD || \
    git describe --exact-match HEAD 2> /dev/null || \
    git rev-parse HEAD
}

これにより、常に人間が読める形式と、の引数として直接使用できる形式の両方が得られるはずgit checkoutです。

  • ローカルブランチ: feature/HS-0001
  • タグ付けされたコミット(切り離された): v3.29.5
  • リモートブランチ(デタッチ、タグなし):SHA1
  • その他の分離されたコミット:SHA1

1
これを投稿してくれてありがとう、他の答えはどれも、への引数として使用できるものを常に作成することを気にかけていないようgit checkoutです。
zwol 2018

15

作業ディレクトリコマンドでgit bashを使用できます。

git status -b

それはあなたがどのブランチにいるのかを教えてくれます

-s

--short出力を短い形式で提供します。

-b --branch短い形式でもブランチと追跡情報を表示します。

--porcelain [=]スクリプトの解析しやすい形式で出力を提供します。これは短い出力に似ていますが、ユーザー設定に関係なく、Gitバージョン全体で安定しています。詳細については、以下を参照してください。

versionパラメータは、フォーマットバージョンを指定するために使用されます。これはオプションであり、デフォルトで元のバージョンv1形式になります。

--long出力をロングフォーマットで提供します。これがデフォルトです。

-v --verbose変更されたファイルの名前に加えて、コミットされるようにステージングされたテキストの変更も表示します(つまり、git diff --cachedの出力のように)。-vが2回指定されている場合、まだステージングされていない(つまり、git diffの出力のような)作業ツリーの変更も表示します。



13

時間の経過とともに、ブランチのリストが非常に長くなる可能性があります。

他のいくつかの解決策は素晴らしいですが、これが私がすることです(Jacobの答えから簡略化されています):

git branch | grep \*

さて、

git status

機能しますが、ローカルの変更がある場合のみ


13

これら2つのコマンドのいずれかを使用することをお勧めします。

git branch | grep -e "^*" | cut -d' ' -f 2

または

git status | sed -n 1p | cut -d' ' -f 3

OR(より冗長)

git status -uno -bs| cut -d'#' -f 3 | cut -d . -f 1| sed -e 's/^[ \t]//1'| sed -n 1p


12

Netbeansで、バージョニングアノテーションが有効になっていることを確認します([表示]-> [バージョニングラベルの表示])。プロジェクト名の横にブランチ名が表示されます。

http://netbeans.org/bugzilla/show_bug.cgi?id=213582


バージョニングアノテーションが有効になっている場合は、プロジェクト(またはファイル、お気に入り)フォルダーの上にマウスを置くと、現在のブランチが表示されます。
idclaar 2015

12

これはどうですか?

{ git symbolic-ref HEAD 2> /dev/null || git rev-parse --short HEAD 2> /dev/null } | sed "s#refs/heads/##"

1
取り外したHEADケースをうまく処理できるので、はるかに良い答えです。
Pat

2
{}ではなく()を使用してgitコマンドをラップする必要があるようです
Pat

@Pat()のように、このために別のサブシェルを生成する必要はありません。{}は問題ありませんが、を追加する必要があります。または}の前の改行。実際には、コマンドをグループ化する必要がない限り、{}を完全に省略することができます。
2015

symbolic-refパーツ--shortはブランチ名の前にプレフィックスを付けることを避ける必要もないのrefs/heads/ですか?
rjp

11

現在のブランチ名を出力するgit-cbrcurrent branch)という簡単なスクリプトがあります。

#!/bin/bash

git branch | grep -e "^*"

このスクリプトをカスタムフォルダー(~/.bin)に配置しました。フォルダーは$PATHます。

したがって、gitリポジトリにいるときは、単に入力git cbrして現在のブランチ名を出力するだけです。

$ git cbr
* master

これは、gitコマンドが最初の引数を取り、という名前のスクリプトを実行しようとするため機能しますgit-arg1。たとえば、git branchというスクリプトを実行しようとしますgit-branch


11

git-branch名を表示するようにbash出力を永続的に設定できます。さまざまなブランチで作業するときに非常に便利です$ git status。常にタイプする必要はありません。Githubリポジトリgit-aware-prompt

端末を開き(ctrl-alt-t)、コマンドを入力します

mkdir ~/.bash
cd ~/.bash
git clone git://github.com/jimeh/git-aware-prompt.git

sudo nano ~/.bashrcコマンド(Ubuntuの場合)で.bashrcを編集し、次の行を先頭に追加します。

export GITAWAREPROMPT=~/.bash/git-aware-prompt
source "${GITAWAREPROMPT}/main.sh"

次に、コードを貼り付けます

export PS1="\${debian_chroot:+(\$debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\] \[$txtcyn\]\$git_branch\[$txtred\]\$git_dirty\[$txtrst\]\$ "

インストールコードを以前に貼り付けたのと同じファイルの最後に。これにより、カラー化された出力が得られます。ここに画像の説明を入力してください


10

次のシェルコマンドは、現在のブランチを示します。

git branch | grep ^\*

ブランチを知りたいときに毎回その長いコマンドを入力したくない場合で、Bashを使用している場合は、コマンドにエイリアスなどの短いエイリアスを指定しcbます。

alias cb='git branch | grep ^\*'

ブランチマスターでプロンプトがの$場合* master、次のようになります。

$ cb
* master

これは質問に対する答えを提供しません。批評したり、著者に説明を求める場合は、投稿の下にコメントを残してください。- 口コミより
Rashwan L

1
どうしてそう思うの?
mrrusof 2016年

OPの投稿をコメントおよび説明する必要があります。そうすることで、投稿を理解しやすくなります。
Rashwan L 2016

1
完全に理にかなっています。
mrrusof 2016年

1
あなたがのzsh使用する場合は、単一引用符ではgrepの正規表現をラップする必要があります:git branch | grep '^\*'
aaaarrgh

9

デタッチされたヘッド上にある場合、ブランチ名またはSHA1を返します。

git rev-parse --abbrev-ref HEAD | grep -v ^HEAD$ || git rev-parse HEAD

これは@ dmaestro12の回答の短縮版で、タグのサポートはありません。


8
より良い:git symbolic-ref --quiet --short HEAD || git rev-parse --short HEAD
11:57に

8

最後のブランチ/タグをデタッチされたHEAD状態でもチェックアウトしたい場合。

git reflog HEAD | grep 'checkout:' | head -1 | rev | cut -d' ' -f1 | rev

更新 これはawkが怖いのではない方に適しています。

git reflog HEAD | grep 'checkout:' | head -1 | awk '{print $NF}'

これrev | cut -d' ' -f1| revは、次のように簡略化できますawk '{print $NF}'
Steve Buzonas、2015年

1
これも絶対確実ではありませんが、特定のリビジョンをハッシュでチェックアウトできるので、reflogがそれを示すだけで、checkout: moving from ba7571b7fc5b8f31b8d0625821269afaa655577e to f68be8cf7bea917a5a0562b619e50368de0068a9いくつかのケースを明確にするのに役立つ便利なトリックであることを示しています。
Alex Dupuy

1
さらに短縮してgit reflog | awk '$3=="checkout:" {print $NF; exit}'
jthill 2016年

6

私はこれが遅いことを知っていますが、linux / macでは、ターミナルから次を使用できます。

git status | sed -n 1p

説明:

git status->作業ツリーのステータスを取得します
sed -n 1p->ステータス本文から最初の行を取得します

上記のコマンドに対する応答は次のようになります。

"On branch your_branch_name"

2
head -1通常の方法
ブクソール2015

5

ここに表示されるGIT_BRANCH変数を使用することもできます:https ://wiki.jenkins-ci.org/display/JENKINS/Git+Plugin

gitプラグインは、スクリプトで使用できるいくつかの環境変数を設定します。

GIT_COMMIT-現在のSHA

GIT_BRANCH-現在使用されているブランチの名前(例: "master"または "origin / foo")

GIT_PREVIOUS_COMMIT-同じブランチから以前にビルドされたコミットのSHA(ブランチの最初のビルドでの現在のSHA)

GIT_URL-リポジトリのリモートURL

GIT_URL_N-複数のリモートがある場合のリポジトリリモートURL(GIT_URL_1、GIT_URL_2など)

GIT_AUTHOR_EMAIL-コミッター/著者のメール

GIT_COMMITTER_EMAIL-コミッター/著者のメール


5

PS1Mac を使用して追加します。

PS1='\W@\u >`[ -d .git ] && git branch | grep  ^*|cut -d" " -f2`> $ '

上記のコマンドを実行する前に:

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

そのコマンドを実行した後:

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

心配しないでください。GITリポジトリでない[-d .git]場合は、.gitフォルダーが存在するかどうかをチェックするため、エラーは表示されません。

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