ローカルブランチが追跡しているリモートブランチを見つける


842

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

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

git config出力を解析する必要がありますか、それともこれを実行するコマンドがありますか?


18
シーッシュ。これは正確な複製ではありません。これは他のサブセットですが、のように問題を解決する方法は他にもありますgit remote show origin。他の質問の主な答えは、ここで簡単な答えを囲んでいるbashスクリプトです。うまくいけば、この質問は完全に閉じられていません。
cdunn2001

5
確かに、これは間違いではありません。それはリンクされた質問とはまったく異なる何かを求めています
アダム・バットキン

回答:


1003

以下は、すべてのトラッキングブランチを提供するコマンドです(「プル」用に構成されています)。以下を参照してください:

$ git branch -vv
  main   aaf02f0 [main/master: ahead 25] Some other commit
* master add0a03 [jdsumsion/master] Some commit

SHAと長いラッピングコミットメッセージを順番にたどる必要がありますが、入力は簡単で、3番目の列で追跡ブランチが垂直に配置されます。

ブランチごとの「プル」と「プッシュ」の両方の設定に関する情報が必要な場合は、の他の回答を参照してくださいgit remote show origin


更新

gitバージョン1.8.5以降では、アップストリームブランチをgit statusおよびgit status -sb


6
この出力はgit branch -avor よりも直接的なものgit remote show originであり、追跡されるリモートだけでなく、
大量

60
ところで、gitの(1.8.5.x)の最新バージョンでは、今もの間、上流分岐を表示git statusしてgit status -sb-あなたは1.8.5.xへのアップグレード後はそう、この質問(と回答)は無関係です。
jdsumsion 2013

11
これはあなたに必要な情報を提供しますが、それが正しい答えであるとは思いません。これは、誰かに辞書を渡して「XYZをどう綴るか」と同じように答えます。適切な例として、結果の答え(ブランチ名)をいくつかの操作に使用します。
UpAndAdam 2015

コミットメッセージは、たとえば「[my-feature] ...」で簡単に開始できるため、このコマンドの出力は誤解を招く可能性があります。@ cdunn2001の回答をご覧ください。上流のブランチ(存在する場合)のみが示され、他には何も示されていません。
ジョナスベルリン

1
私は@ jonas-berlinに同意します-結果を解析したい場合はcdunn2001の答えが優れています-簡単なコマンドを探していて、出力を視覚的にスキャンしたい場合は、私の答えが適切です
jdsumsion

372

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

12
いいね!前者は何も追跡されない場合に醜いエラーを出しますが、後者はスクリプト作成に特に役立ちます。BTW %(refname:short)は、内の現在の参照の名前です--format
Tino、

9
git help revisions(ドキュメントのほとんど知られていないが最も有用な部分の1つ)を検索しupstreamます。
cdunn2001

15
この答えは、あなたのような何かをしたい場合は特に、その上の2つの答えよりもはるかに優れているgit diff `git rev-parse --abbrev-ref --symbolic-full-name @{upstream}`

2
これは本当に便利ですecho 'git for-each-ref --format=\'%(refname:short) -> %(upstream:short)\' refs/heads/$1' > ~/bin/git-show-upstream; chmod +x ~/bin/git-show-upstream
albfan '19 / 07/19

6
他のブランチのアップストリームを見つけたい場合、2番目の選択肢の変形は、git for-each-ref --format='%(upstream:short)' $(git rev-parse --symbolic-full-name SOMEBRANCH)SOMEBRANCHをブランチ名、または現在のブランチの「HEAD」で置き換える
Jonas Berlin

220

git branch -avローカルブランチが追跡しているリモートブランチを推測するために、あなたが持っているブランチとそれらがどこにコミットしているかを伝えるだけだと思います。

git remote show originどのブランチがどのリモートブランチを追跡しているかを明示的に通知します。これは、単一のコミットと呼ばれるリモートブランチを持つリポジトリからの出力例ですabranch

$ git branch -av
* abranch                d875bf4 initial commit
  master                 d875bf4 initial commit
  remotes/origin/HEAD    -> origin/master
  remotes/origin/abranch d875bf4 initial commit
  remotes/origin/master  d875bf4 initial commit

$ git remote show origin
* remote origin
  Fetch URL: /home/ageorge/tmp/d/../exrepo/
  Push  URL: /home/ageorge/tmp/d/../exrepo/
  HEAD branch (remote HEAD is ambiguous, may be one of the following):
    abranch
    master
  Remote branches:
    abranch tracked
    master  tracked
  Local branches configured for 'git pull':
    abranch merges with remote abranch
    master  merges with remote master
  Local refs configured for 'git push':
    abranch pushes to abranch (up to date)
    master  pushes to master  (up to date)

3
上流のブランチを検出するコマンドが必要なため、「origin」を入力として使用することが前提となっているため、これは機能しません
Alexander Mills

1
しかし、これはOPに応答します。このコマンドgit remote show originは、ローカルブランチと、それらがプッシュとプルの両方で追跡するものを示します。
dudewad

1
@dudewad要点は、このコマンドはリモートが呼び出されることを前提としてoriginいることですが、実際には何でもかまいません(たとえば、複数のリモートがあり、異なるブランチが異なるリモートからのブランチを追跡しています)。
ルスラン、

74

更新:まあ、私がこれを投稿してから数年になります!HEADをアップストリームと比較するという特定の目的のために、ここでを使用します@{u}。これは、アップストリーム追跡ブランチのHEADを参照するショートカットです。(https://git-scm.com/docs/gitrevisions#gitrevisions-emltbranchnamegtupstreamemegemmasterupstreamememuemを参照してください)。

元の答え:この問題にも遭遇しました。私は1つのリポジトリで複数のリモートを使用することがよくありますが、現在のブランチが追跡しているリモートを忘れるのは簡単です。また、を介してローカルコミットを確認する場合など、そのことを知っておくと便利な場合がありますgit log remotename/branchname..HEAD

このすべてのものはgit構成変数に格納されますが、git構成の出力を解析する必要はありません。git configに続けて変数の名前を呼び出すと、その変数の値が出力されるだけで、解析は必要ありません。これを念頭に置いて、現在のブランチの追跡設定に関する情報を取得するためのコマンドをいくつか次に示します。

LOCAL_BRANCH=`git name-rev --name-only HEAD`
TRACKING_BRANCH=`git config branch.$LOCAL_BRANCH.merge`
TRACKING_REMOTE=`git config branch.$LOCAL_BRANCH.remote`
REMOTE_URL=`git config remote.$TRACKING_REMOTE.url`

私の場合、私は現在のリモコンの名前を見つけることだけに興味があるので、これを行います。

git config branch.`git name-rev --name-only HEAD`.remote

2
これは、現在のブランチが何であれリベースするエイリアスを作成するのに非常に役立ちました。ありがとう!
Justin Spahr-Summers 2012

操作が早送りである限り、ローカルトラッキングブランチをリモートに進める「早送り」エイリアスにも同様に役立ちます。
Altreus

4
実際には、これgit name-rev --name-only HEADは実際にはどのブランチにいるのかを教えてくれないことを発見しました。そのために使用したばかりgit branch | grep '^\*' | cut -d' ' -f2
Altreus

1
ありがとう!同様の質問に対する他の回答では、@{u}エイリアス/ショートカットについては触れられていませんでした。それがまさに私が探していたものです。プルする必要があるかどうかを判断するだけの場合は、マスターブランチと比較する理由はありません。
Dan M.17年

1
@{u}爆弾です。そして、1.7.0以降に使用されています。つまり、誰かが2018で使用しているgitで使用できない場合、おそらくアップグレードの予定です。
クリスクリーランド

48

ローカルブランチとそのリモート。

git branch -vv 

すべてのブランチと追跡リモコン。

git branch -a -vv

ローカルブランチが明示的にプッシュおよびプル用に構成されている場所を確認します。

git remote show {remote_name}

21

これにより、現在のブランチが表示されます。

$ git branch -vv

これにより、現在のブランチのみが表示されます。

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

例えば:

myremote/mybranch

現在のブランチで使用されているリモートのURLを確認できます。

$ git remote get-url $(git for-each-ref --format='%(upstream:short)' $(git symbolic-ref -q HEAD)|cut -d/ -f1)

例えば:

https://github.com/someone/somerepo.git

19

を使用できますgit checkout。つまり、「現在のブランチをチェックアウト」します。これは、現在のブランチの追跡情報(存在する場合)を表示するという副作用のある何もしません。

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

17

これがgit configの出力の解析としてカウントされるかどうかはわかりませんが、これはマスターが追跡しているリモートのURLを決定します。

$ git config remote。$(git config branch.master.remote).url

またはgit config branch.$(git symbolic-ref -q HEAD).remote現在のブランチgit config remote.$(git config branch.$(git symbolic-ref -q HEAD).remote).urlで追跡されているリモートの名前(URL)だけが必要な場合。
アナカンド

機能--shortするようにオプションを追加する必要がありました。したがって、現在のブランチのリモート名git config branch.$(git symbolic-ref -q --short HEAD).remoteを取得する場合、および現在のブランチのリモート名を取得する場合:git config remote.$(git config branch.$(git symbolic-ref -q --short HEAD).remote).url
Nelson

13

さらに別の方法

git status -b --porcelain

これはあなたに与えるでしょう

## BRANCH(...REMOTE)
modified and untracked files

10

別の簡単な方法は使用することです

cat .git/config Gitリポジトリ

これはローカルブランチの詳細をリストします


Linuxでうまく動作します。Unixライクなプロンプト(例:cygwinまたはgit bash)でない限り、Windowsでは機能しません。
Contango 2017年

Windowsでは、単に使用type .git/configする代わりにcat .git/config...平野、コマンドライン上のコースの
khmarbaise

9

別の方法(osseに感謝)、それが存在するかどうかを知りたいだけの場合:

if git rev-parse @{u} > /dev/null 2>&1
then
  printf "has an upstream\n"
else
  printf "has no upstream\n"
fi

何語?これはLinuxシェルスクリプトのように見えますが、他の情報やコンテキストはありません。
Suncat2000、19年

8

git branch -vv | grep 'BRANCH_NAME'

git branch -vv :この部分では、すべてのローカルブランチとその上流ブランチが表示されます。

grep 'BRANCH_NAME' :ブランチリストから現在のブランチをフィルタリングします。



5

ローカルブランチとリモートブランチの両方を一覧表示します。

$ git branch -ra

出力:

  feature/feature1
  feature/feature2
  hotfix/hotfix1
* master
  remotes/origin/HEAD -> origin/master
  remotes/origin/develop
  remotes/origin/master

3

git-status磁器(マシンが読み取り可能な)v2の出力は次のようになります。

$ git status -b --porcelain=v2
# branch.oid d0de00da833720abb1cefe7356493d773140b460
# branch.head the-branch-name
# branch.upstream gitlab/the-branch-name
# branch.ab +2 -2

そして、ブランチを上流のみに取得するには:

$ git status -b --porcelain=v2 | grep -m 1 "^# branch.upstream " | cut -d " " -f 3-
gitlab/the-branch-name

ブランチに上流がない場合、上記のコマンドは空の出力を生成します(またはで失敗しますset -o pipefail)。


2

(自分がいるブランチだけではなく)任意のブランチのアップストリームを見つけたい場合は、@ cdunn2001の回答を少し変更します。

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

という名前のローカルブランチのリモートブランチ名が表示されYOUR_LOCAL_BRANCH_NAMEます。


2

あなたはこれを試すことができます:

git remote show origin | grep "branch_name"

branch_name あなたのブランチで置き換える必要があります


ブランチ名が他のブランチとも一致するとどうなりますか?ブランチ名が何の出力で他のテキストと一致するかgit remote show origin-それが呼び出されたmerges場合、それともconfigure
トムスワーリー

あなたを取得しませんでした。あなたは、同じ名前を持つ複数のブランチを意味しています
xpioneer

1

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

git config --global alias.track '!sh -c "
if [ \$# -eq 2 ]
 then
   echo \"Setting tracking for branch \" \$1 \" -> \" \$2;
   git branch --set-upstream \$1 \$2;
 else
   git for-each-ref --format=\"local: %(refname:short) <--sync--> remote: %(upstream:short)\" refs/heads && echo --URLs && git remote -v;
fi  
" -'

その後

git track

このスクリプトはトラッキングの設定にも使用できることに注意してください。

https://github.com/orefalo/bash-profilesのより優れたエイリアス


0

EasyGit(別名 "eg")をGitの上(または横)の超軽量ラッパーとして使用しています。EasyGitには「info」サブコマンドがあり、現在のブランチのリモート追跡ブランチなど、あらゆる種類の非常に役立つ情報を提供します。次に例を示します(現在のブランチ名は「foo」です)。

pknotz @ s883422:(foo)〜/ workspace / bd
$例情報
コミット総数:175
ローカルリポジトリ:.git
名前付きリモートリポジトリ:(名前->場所)
  原点-> git://sahp7577/home/pknotz/bd.git
現在のブランチ:foo
  暗号化チェックサム(sha1sum):bd248d1de7d759eb48e8b5ff3bfb3bb0eca4c5bf
  デフォルトのプル/プッシュリポジトリ:origin
  デフォルトのプル/プッシュオプション:
    branch.foo.remote = origin
    branch.foo.merge = refs / heads / aal_devel_1
  投稿者数:3
  ファイル数:28
  ディレクトリ数:20
  最大ファイルサイズ、バイト単位:32473(pygooglechart-0.2.0 / COPYING)
  コミット:62

0

この答えを改善し、私はこれらの.gitconfigエイリアスを思いつきました:

branch-name = "symbolic-ref --short HEAD"
branch-remote-fetch = !"branch=$(git branch-name) && git config branch.\"$branch\".remote || echo origin #"
branch-remote-push  = !"branch=$(git branch-name) && git config branch.\"$branch\".pushRemote || git config remote.pushDefault || git branch-remote-fetch #"
branch-url-fetch = !"remote=$(git branch-remote-fetch) && git remote get-url        \"$remote\" #"  # cognizant of insteadOf
branch-url-push  = !"remote=$(git branch-remote-push ) && git remote get-url --push \"$remote\" #"  # cognizant of pushInsteadOf

それはどの言語ですか?
ダニエルファレル

3
@ダンファレル:シェル。で始まるエイリアス / bin / shを使用します。二重引用符はgitの構成ファイルで引用されています。
トム・ヘイル

0

Gradleを使用している場合、

def gitHash = new ByteArrayOutputStream()
    project.exec {
        commandLine 'git', 'rev-parse', '--short', 'HEAD'
        standardOutput = gitHash
    }

def gitBranch = new ByteArrayOutputStream()
    project.exec {
        def gitCmd = "git symbolic-ref --short -q HEAD || git branch -rq --contains "+getGitHash()+" | sed -e '2,\$d'  -e 's/\\(.*\\)\\/\\(.*\\)\$/\\2/' || echo 'master'"
        commandLine "bash", "-c", "${gitCmd}"
        standardOutput = gitBranch
    }

-2

次のコマンドは、リモートの現在のフォークが参照している

git remote -v

リモートパスを追加するには、

git remote add origin path_name


ここでは、リモートパスが見つかりません-追加しています
serup
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.