どのGitブランチがどのリモート/アップストリームブランチを追跡しているかを確認するにはどうすればよいですか?


825

できることはわかっgit branch --allています。ローカルブランチとリモートブランチの両方が表示されますが、ブランチ間の関係を示すのにそれほど役立ちません。

どのローカルブランチがどのリモートを追跡しているかを示す方法でブランチを一覧表示するにはどうすればよいですか?

回答:


1146

非常に磁器製のコマンドですが、これをスクリプトで使用したい場合は不向きです。

git branch -vv   # doubly verbose!

git 1.8.3では、上流のブランチがで表示されることに注意してください(「gitでこのブランチトラッキング(ある場合)とは何ですか?」を参照)。


きれいな出力が必要な場合は、arcresuの回答を参照してください。この回答は、私が最初にこの回答を書いたときに存在していたとは思わない磁器コマンドを使用しているため、少し簡潔で、マージだけでなく、リベース用に構成されたブランチで機能します。


3
上記の最初の方法では、必要な情報が提供されません。2番目の...は、特にKubiの回答が機能するため、やりすぎのようです。何か不足していますか?
garyp

3
@garyp質問したのはあなたではありません。1つ目はOPに必要なものを提供し、2つ目はスクリプト用にクリーンな形式でそれを必要とする場合、または単にエイリアスとして保存したい場合に、彼が必要とするものを正確に提供しました。(「Overkill」は、必要なものが得られ、それを繰り返す必要がない場合は問題ありません。)この質問の観点から、kubiの回答はいくつかの無関係な情報を提供し、複数のリモートがある場合はそれを提供しますすべてを表示するわけではありませんが、ニーズに合っている場合は、ぜひ使用してください。
Cascabel 2012

2
お詫び申し上げます。最初に最初の方法を実行したとき、どのトラックが何を追跡しているのかについて情報を得られなかったので、それを明示的に述べるべきだった。しかし、今は追跡情報が表示されるので、設定に問題があったはずです。だから私何か欠けていました。
garyp

2
FWIW -vと-vvが同様の出力を表示するため、混乱しました。追跡されたブランチは、ハッシュの後、(デフォルトのOSX自作インストールで)最新のコミットの前に角括弧で表示されます。
jerclarke 2012年

3
これで私が行うことは、各ブランチの最後のコミットハッシュとコメントを出力することだけです。
capybaralet 2015

263

git remote show origin

「origin」をリモコンの名前に置き換えます。


11
この磁器のコマンドは人間には有効ですが(磁器の出力を解析する必要があるため、スクリプトにはそれほど役立ちません)、このアプローチについて私が気に入らないのは、git remote showコマンドが実際にリモートリポジトリに接続することです...オフラインであるか、
なんらかの

17
@pvandenberk git remote show -n originオフラインでも一部の情報を取得するために使用できます。gitのリモートドキュメント:「-nオプションを指定すると、リモートヘッドはgitのLS-リモート<名前>で最初に照会されていません。キャッシュされた情報が代わりに使用されます。」
セラン2014年

5
このコマンドの奇妙な点の1つは、プル/プッシュ用に構成されたローカルブランチがない場合でも、リモートブランチを「追跡済み」としてリストします。私はいつもこれを混乱させます。この出力で「追跡される」が何を意味するのかは、実際にはわかりません。件名のgitドキュメントにより、リモートブランチがプッシュ/プルのためにローカルブランチにリンク/バインドされている場合にのみ、リモートブランチが「追跡」されるように聞こえる...
Hawkeye Parker

問題は、実際に探しているものが表示されるまで、すべてのリモート名に対してこれを呼び出す必要があることです。
jolvi 2016年

2
@jolviすべてのリモートのgit remote show | xargs git remote show -n結合追跡情報を表示するために実行できます。
Synoli、2016年

107

のマニュアルページをgit-rev-parse見ると、次の構文が記述されていることがわかります。

<branchname>@{upstream}、例えばmaster@{upstream}@{u}

@{upstream}ブランチ名のサフィックス(短縮形 <branchname>@{u})は、branchnameで指定されたブランチがその上に構築するように設定されているブランチを指します。欠落しているブランチ名はデフォルトで現在の名前になります。

したがって、ブランチの上流を見つけるにはmaster、次のようにします。

git rev-parse --abbrev-ref master@{upstream}
# => origin/master

各ブランチの情報を出力するには、次のようにします。

while read branch; do
  upstream=$(git rev-parse --abbrev-ref $branch@{upstream} 2>/dev/null)
  if [[ $? == 0 ]]; then
    echo $branch tracks $upstream
  else
    echo $branch has no upstream configured
  fi
done < <(git for-each-ref --format='%(refname:short)' refs/heads/*)

# Output:
# master tracks origin/master
# ...

これは、リファレンスと設定を手動で解析するよりもクリーンです。


それを見つけてもrev-parseでそのビットを理解できなかったので、明確な説明に感謝します!
アリスパーセル

3
「feature / blahblah」という名前のブランチを使用してgit-flowを使用している場合、whileループの終了ステートメントは次のようになります。グロブパターンの最後にある2つのアスタリスクにdone < <(git for-each-ref --format='%(refname:short)' refs/heads/**)注意してください。
markeissler、2015年

2
git rev-parse --abbrev-ref HEAD@{upstream}現在のブランチではうまく機能しているようです。また、素晴らしいgitエイリアスになります。
Digikata 2017年

whileループ構文は、私には少し奇妙に見えます。git for-each-ref ... | while read branch; do ...FIFOを必要とせず、記述されたコマンドと同じ順序で実行されるものを使用できます。
DanielBöhmer、2018年

少なくともgit 2.5.1以降では、次のようなワンライナーがありますgit for-each-ref --format='%(refname:short) tracks %(upstream:short)' refs/heads/*
Mat M

81

kubiの答えの代わりに.git/config、ローカルリポジトリの構成を示すファイルを確認することもできます。

cat .git/config


6
また git config --get-regex branch
Tamir Daniely

6
または、より具体的には、 'git config --get-regexp branch。* merge'
yoyo

41
git for-each-ref --format='%(refname:short) <- %(upstream:short)' refs/heads

ローカルブランチごとに線が表示されます。追跡ブランチは次のようになります。

master <- origin/master

追跡しないものは次のようになります。

test <- 

いいです
dimir

美しく簡潔で、実際の出力は受け入れられgit branch -vvたものよりもはるかに読みやすくなっています。🙏
joki

唯一の問題は、これを思い出せないことです。私はgit config --global alias.track 'for-each-ref --format='\''%(refname:short) <- %(upstream:short)'\'' refs/heads'
joki

38

以下のために現在のブランチ、ここでは2つの良い選択肢があります。

% git rev-parse --abbrev-ref --symbolic-full-name @{u}
origin/mainline

または

% git for-each-ref --format='%(upstream:short)' $(git symbolic-ref -q HEAD)
origin/mainline

その回答もここにあります。これは、(間違って)重複としてマークされた少し異なる質問に対するものです。


5
これに基づいて、すべてのブランチをスクリプトフレンドリーな方法でリストできますgit for-each-ref --shell --format='%(refname:short) %(upstream:short)' refs/heads
ダニエルジェームズ

15

現在のブランチについては、git checkout(ブランチなし)と言うこともできます。これは、現在のブランチの追跡情報(存在する場合)を表示するという副作用のある何もしません。

$ git checkout 
Your branch is up-to-date with 'origin/master'.

十分に公平ですが、誤ってと入力してもかまいgit checkout .ません。これは何もしません。
Tomasz Gandor

6

このエイリアスを使用します

git config --global alias.track '!f() { ([ $# -eq 2 ] && ( echo "Setting tracking for branch " $1 " -> " $2;git branch --set-upstream $1 $2; ) || ( git for-each-ref --format="local: %(refname:short) <--sync--> remote: %(upstream:short)" refs/heads && echo --Remotes && git remote -v)); }; f'

その後

git track

5
2つのパラメーターを使用して、コマンドがトラックブランチを構成することに注意してください。
albfan

3

Olivier Refaloの回答に基づく

if [ $# -eq 2 ] 
then
    echo "Setting tracking for branch " $1 " -> " $2
    git branch --set-upstream $1 $2
else
    echo "-- Local --" 
    git for-each-ref --shell --format="[ %(upstream:short) != '' ] && echo -e '\t%(refname:short) <--> %(upstream:short)'" refs/heads | sh
    echo "-- Remote --" 
    REMOTES=$(git remote -v) 
    if [ "$REMOTES" != '' ]
    then
        echo $REMOTES
    fi  
fi

トラックが設定されたローカルのみが表示されます。

パス上のgit-trackと呼ばれるスクリプトにそれを書いてください、そうすればgit trackコマンドを取得します

https://github.com/albfan/git-showupstreamのより詳細なバージョン


1

git config --get-regexp "branch\.$current_branch\.remote"

追跡されているリモコンの名前が表示されます

git config --get-regexp "branch\.$current_branch\.merge"

追跡されているリモートブランチの名前が表示されます。

$ current_branchを現在のブランチの名前に置き換える必要があります。あなたはそれを動的に得ることができますgit rev-parse --abbrev-ref HEAD

次のミニスクリプトはそれらを組み合わせたものです。という名前のファイルに貼り付けgit-tracking、実行可能にして、パスに含まれていることを確認します。

その後、あなたは言うことができます

$ git  tracking
<current_branch_name>-><remote_repo_name>/<remote_branch_name>

リモートブランチ名はローカルブランチ名と異なる場合があります(ただし、通常はそうではありません)。例えば:

$git tracking 
xxx_xls_xslx_thing -> origin/totally_bogus

コードを見るとわかるように、これの鍵はgit構成からデータを抽出することです。sedを使用して、無関係なデータをクリアします。

#!/bin/sh

current_branch=$(git rev-parse --abbrev-ref HEAD)
remote=$(git config --get-regexp "branch\.$current_branch\.remote" | sed -e "s/^.* //")
remote_branch=$(git config --get-regexp "branch\.$current_branch\.merge" | \
  sed -e "s/^.* //" -e "s/refs\/.*\///")

echo "$current_branch -> $remote/$remote_branch"

1

ここに清楚でシンプルなものがあります。git remote -v現在のブランチのすべての起点と上流を示すチェック可能。

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