Gitでどのローカルブランチがどのリモートブランチを追跡しているかを確認するにはどうすればよいですか?


234

Gitでどのローカルブランチがどのリモートブランチを追跡しているかを知る方法があるかどうかを知りたいです。

「origin」という名前の1つのリモートサーバーを使用しています。


私が間違っている場合は修正してくださいしかし、それはサーバーではなくデフォルトでoriginという名前のリモートブランチではありませんか?
クリスハルクロー

回答:


196

Github.comのアップストリームGitリポジトリからチェックアウトしたPuppetの例を使用して...

$ git remote show origin
* remote origin
  Fetch URL: git://github.com/reductivelabs/puppet.git
  Push  URL: git://github.com/reductivelabs/puppet.git
  HEAD branch: master
  Remote branches:
    0.24.x                 tracked
    0.25.x                 tracked
    2.6.x                  tracked
    master                 tracked
    next                   tracked
    primordial-ooze        tracked
    reins-on-a-horse       tracked
    testing                tracked
    testing-17-march       tracked
    testing-18-march       tracked
    testing-2-april        tracked
    testing-2-april-midday tracked
    testing-20-march       tracked
    testing-21-march       tracked
    testing-24-march       tracked
    testing-26-march       tracked
    testing-29-march       tracked
    testing-31-march       tracked
    testing-5-april        tracked
    testing-9-april        tracked
    testing4268            tracked
  Local branch configured for 'git pull':
    master merges with remote master
  Local ref configured for 'git push':
    master pushes to master (up to date)

次に、次を実行する場合:

$ git checkout -b local_2.6 -t origin/2.6.x 
Branch local_2.6 set up to track remote branch 2.6.x from origin.
Switched to a new branch 'local_2.6'

そして最後にgit remote show originコマンドを再実行すると、下の近くに次のように表示されます。

  Local branches configured for 'git pull':
    local_2.6 merges with remote 2.6.x
    master    merges with remote master

1
これは、いくつかのローカルブランチがありますが、パペットのすべてのリモートブランチを追跡できることを意味します。コマンドの結果に表示される多くの「追跡された」兆候とは何ですか?どのローカルブランチによって「追跡」されましたか?
PJ。

リモートブランチは、あなたが行うgit fetchgit pullリモートブランチへの更新がクローンリポジトリで追跡されるという点で追跡されます。ローカルブランチは、リモートブランチのローカルブランチであり、リモートブランチへの更新は追跡され、適切なコマンドが与えられたときにマージされます。ローカルブランチを作成するときに '-t'オプションを明示的に含めて、元のブランチを追跡するようにします。ローカルブランチは別のローカルブランチも追跡できるため、リモートブランチである必要はありません。
ジェレミーボーズ

5
@PJ:Gitでは、「トラック」という用語には2つの異なる意味があります。の「追跡された」行git remote show remote-nameは、「ブランチの追跡」(リモートリポジトリからのブランチのスナップショット)を指します。「とマージ」行は、「上流ブランチ」構成を持つローカルブランチを指します(gitブランチまたはgit checkoutの--track / -tオプションで作成されるため、しばしば「トラッキングブランチ」と混同されます)。
クリスジョンセン

リモート追跡ブランチ」は、上記の「追跡ブランチ」の最新の用語集エントリです。ドキュメントは8b3f3f84で更新されました
ento

124

すべてのブランチ:

git branch -avv

ローカルブランチのみ:

git branch -lvv

リモートブランチのみ:

git branch -rvv

すべてのブランチとアップストリームブランチの名前が表示されます。


2
これは、最も単純で完全な答えです。

6
gitバージョン1.7.7.5では、ローカルブランチとそれが指すsha-1が表示されますが、追跡されたリモートブランチは表示されません
...-mpontillo

gitバージョン1.7.4.1で動作します2番目の「v」は、リモートトラッキングブランチを表示するために必要です。
ピータージョンソン

4
出力削減するgit branch -lvv上流の役に立つかもしれないとちょうど支部ショーを
AB

5
^ git branch -vv私のために働く
...-notacouch

52

Jeremy Bouseはgit remote show追跡情報の表示方法を説明しています。人間が消費する情報のみが必要な場合は、これで十分です。

自動化されたコンテキスト(スクリプトなど)で情報を使用する予定がある場合は、git for-each-ref代わりに下位レベル(「配管」)を使用する必要があります。

% git remote show origin
* remote origin
⋮
  Local branches configured for 'git pull':
    master merges with remote master
    pu     merges with remote pu
⋮
% git for-each-ref --format='%(refname:short) <- %(upstream:short)' refs/heads
master <- origin/master
pu <- origin/pu

git for-each-ref学ん%(upstream)でトークンをGitリポジトリ1.6.3。Gitの以前のバージョンでは、追跡情報を抽出する必要がgit config branch.<name>.remoteありますgit config branch.<name>.merge(おそらくgit for-each-ref、各ローカルブランチ名のコマンドをビルドするために使用します)。


あなたの回答の出力はずっと簡潔で、従うのが簡単なので、あなたは賛成票を獲得します:)
CubanX

簡潔にするために、リモート名がローカルブランチ名と同じであることを視覚的に確認する良い方法を提供するために、一般的なgit gotcha:in bashgit for-each-ref --format=$'\n'' '' '' '' '' '' ''/%(refname:short);%(upstream:short)' refs/heads | tr ';' $'\n'
hobs

19

特定の分岐については、使用することができますgit rev-parse@{u}、または@{upstream}ブランチ名の接尾辞、例えば:

$  git rev-parse --symbolic-full-name master@{u}
refs/remotes/github-mhl/master

...または省略形の場合は、追加 --abbrev-ref

$ git rev-parse --symbolic-full-name --abbrev-ref master@{u}
github-mhl/master

通常branch@{upstream}、コミットが予想される場所であればどこでも構文を使用できます。


1
1あなたの答えは私が必要な正確に何を私に与えた:git rev-parse --symbolic-full-name HEADgit rev-parse --symbolic-full-name HEAD@{u}、感謝を!
ティノ

10

次のシェルスクリプト(名前git-tracks)を使用して、現在のブランチによって追跡されているリモートブランチを表示します。

#!/bin/sh -e
branch=$(git symbolic-ref HEAD)
branch=${branch##refs/heads/}
remote=$(git config "branch.${branch}.remote")
remoteBranch=$(git config "branch.${branch}.merge")
remoteBranch=${remoteBranch##refs/heads/}

echo "${remote:?}/${remoteBranch:?}"

これには前述のを使用することもできgit for-each-refますが、直接アクセスは現在のブランチの出力をフィルタリングするよりもいくぶん簡単であることがわかりました。


スクリプトの上部で「set -e」を使用することを検討してください。これにより、「|| exit $?」のすべてのインスタンスを削除できます。同じフェイルアーリー動作を維持しながら。
ジョンホイットリー

@JohnWhitley:ありがとう、回答を編集しました。についてset -eは知っていますが、通常は明示的なチェックに固執します。しかし、この場合、それは本当に優れています。
インゴカルカット

私のために働いていませんgit version 1.9.4。何もエコーしません:(
アイン

8

.git/config ファイルは、追跡ブランチ情報も提供します

[remote "Hub"]
    url = ssh://xxxx/tmp/Hub
    fetch = +refs/heads/*:refs/remotes/Hub/*
[branch "develop"]
    remote = Hub
    merge = refs/heads/develop
[branch "Dev1"]
    remote = Test
    merge = refs/heads/Dev1
[remote "Test"]
    url = ssh://xxxx/tmp/gittesting/Dev1GIT
    fetch = +refs/heads/*:refs/remotes/Test/*

5
git branch -vv

まさにあなたが求めるものを示しています。ローカルブランチと、それらが追跡している対応するリモートブランチを表示します。


2

これらのルーン文字を[alias].gitconfigファイルのセクションに追加します。

show-tracking = !sh -c 'git ls-remote . |grep `git log -1 --grep="git-svn-id" --format=%H`|perl -pe "s/[[:alnum:]]+[[:space:]]//"'

0

ローカルブランチのリストに作用するループ内の各ローカルブランチに対応するリモートブランチ(存在する場合)を見つける必要がありました。私は次のものを使用することになりました:

git for-each-ref --format='%(refname:short):%(upstream:short)' refs/heads | grep "^LocalBranchName:.*/" | sed "s/^LocalBranchName://"

これは、対応するリモートブランチを持たないローカルブランチ( "someremote / somebranch")に対しては何も出力しません(空の文字列)。


-1

git branch オプションを試してください:

 -r
List or delete (if used with -d) the remote-tracking branches. 

-a
List both remote-tracking branches and local branches. 

それ以外の場合は、を調べます.git/config


3
それらはブランチを表示しますが、どれがどれを追跡しているかはわかりません。
PJ。
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.