Bagaimana cara mengetahui cabang lokal mana yang melacak cabang jarak jauh mana di Git?

234

Saya ingin tahu apakah ada cara untuk mengetahui cabang lokal mana yang melacak cabang jarak jauh di Git.

Saya menggunakan satu server jauh, yang bernama "asal".

PJ.
sumber
Benar saya jika saya salah namun bukankah itu cabang jauh yang bernama asal secara default daripada server ??
Chris Halcrow

Jawaban:

196

Menggunakan contoh salinan Puppet saya yang diperiksa dari repositori Git hulu di Github.com ...

$ 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)

Maka jika saya mengeksekusi berikut:

$ 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'

Dan akhirnya jalankan kembali git remote show originperintah itu kemudian saya akan melihat berikut ini di dekat bagian bawah:

  Local branches configured for 'git pull':
    local_2.6 merges with remote 2.6.x
    master    merges with remote master
Jeremy Bouse
sumber
1
Jadi apakah ini berarti Anda dapat melacak semua cabang terpencil di boneka meskipun Anda memiliki beberapa cabang lokal. Apa artinya banyak tanda "terlacak" yang Anda lihat di hasil perintah? "dilacak" oleh cabang mana?
PJ.
Cabang-cabang jarak jauh dilacak sehingga jika Anda melakukan git fetchatau git pullmemperbarui cabang-cabang jarak jauh akan dilacak dalam repositori yang dikloning. Cabang lokal hanya itu, cabang lokal dari cabang jarak jauh dan dengan demikian pembaruan ke cabang jarak jauh akan dilacak dan digabungkan ketika perintah yang tepat untuk melakukannya diberikan. Saya secara eksplisit menyertakan opsi '-t' saat membuat cabang lokal untuk memastikannya melacak cabang dari mana asalnya. Ingat cabang lokal juga dapat melacak cabang lokal lainnya sehingga tidak harus menjadi cabang jarak jauh.
Jeremy Bouse
5
@ PJ: Istilah "track" memiliki dua arti berbeda di Git. Garis "dilacak" git remote show remote-namemengacu pada "pelacakan cabang" (snapshot cabang dari repositori jarak jauh). Baris "penggabungan dengan" merujuk ke cabang lokal yang memiliki konfigurasi "cabang hulu" (dibuat dengan opsi --track/ git branch atau git checkout dan karenanya sering bingung dengan "tracking branch "). -t
Chris Johnsen
" cabang pelacakan jarak jauh " adalah entri glosari terkini untuk "cabang pelacakan" yang disebutkan di atas. Doc telah diperbarui di 8b3f3f84 .
ke
124

Untuk semua cabang:

git branch -avv

Hanya untuk cabang lokal:

git branch -lvv

Hanya untuk cabang jarak jauh:

git branch -rvv

menampilkan semua cabang serta nama cabang hulu.

matahari terbit
sumber
2
Sejauh ini, inilah jawaban yang paling sederhana dan paling lengkap!
6
Pada git versi 1.7.7.5 ini menunjukkan kepada saya cabang lokal dan sha-1 menunjuk ke sana, tetapi tidak menunjukkan cabang jarak jauh yang dilacak ...
mpontillo
Bekerja untuk saya di git versi 1.7.4.1 'v' kedua diperlukan untuk memperlihatkan cabang pelacakan jarak jauh.
Peter Johnson
4
untuk mengurangi output git branch -lvvshow hanya cabang lokal dengan hulu mungkin berguna
AB
5
^ git branch -vvbekerja untuk saya ...
notacouch
52

Jeremy Bouse menggambarkan cara git remote showmenampilkan informasi pelacakan . Itu harus cukup jika Anda hanya ingin informasi untuk konsumsi manusia.

Jika Anda berencana untuk menggunakan informasi dalam konteks otomatis (misalnya skrip), Anda harus menggunakan level bawah ("plumbing") 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

The git for-each-refbelajar %(upstream)token Git 1.6.3 . Dengan versi Git yang lebih lama Anda harus mengekstrak informasi pelacakan dengan git config branch.<name>.remotedan git config branch.<name>.merge(mungkin menggunakan git for-each-refuntuk membangun perintah untuk setiap nama cabang lokal).

Chris Johnsen
sumber
Output jawaban Anda jauh lebih ringkas dan lebih mudah diikuti, sehingga Anda mendapatkan suara yang lebih baik :)
CubanX
Untuk membuatnya kurang ringkas, tetapi berikan cara yang bagus untuk memeriksa secara visual bahwa nama jarak jauh sama dengan nama cabang lokal, git gotcha umum: dalam bashgit for-each-ref --format=$'\n'' '' '' '' '' '' ''/%(refname:short);%(upstream:short)' refs/heads | tr ';' $'\n'
hobs
19

Untuk cabang tertentu, Anda dapat menggunakan git rev-parsedengan @{u}atau @{upstream}akhiran pada nama cabang, misalnya:

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

... atau untuk formulir yang disingkat, tambahkan --abbrev-ref

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

Anda biasanya dapat menggunakan branch@{upstream}sintaksis di mana pun komit diharapkan.

Mark Longair
sumber
1
+1 Jawaban Anda memberi saya persis apa yang saya butuhkan: git rev-parse --symbolic-full-name HEADvs. git rev-parse --symbolic-full-name HEAD@{u}, terima kasih!
Tino
10

Saya menggunakan skrip shell berikut (bernama git-tracks) untuk menampilkan cabang jauh yang dilacak oleh cabang saat ini:

#!/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:?}"

Ini juga bisa menggunakan yang disebutkan git for-each-ref, tetapi saya menemukan akses langsung agak lebih sederhana daripada memfilter output untuk cabang saat ini.

Ingo Karkat
sumber
Anda dapat mempertimbangkan untuk menggunakan "set -e" di bagian atas skrip. Itu akan memungkinkan Anda untuk menghapus semua contoh "|| keluar $?" sambil mempertahankan perilaku gagal-awal yang sama.
John Whitley
@ JohnWhitley: Terima kasih, saya sudah mengedit jawaban saya. Saya tahu set -e, tetapi biasanya menempel pada pemeriksaan eksplisit. Tetapi dalam kasus ini, ini benar-benar lebih baik.
Ingo Karkat
Tidak bekerja untukku git version 1.9.4. Echos nothing :(
Ain
8

.git/config File juga akan memberikan info cabang pelacakan sebagai

[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/*
Karthik
sumber
5
git branch -vv

menunjukkan dengan tepat apa yang Anda minta. Ini menunjukkan cabang lokal bersama dengan cabang jarak jauh yang sesuai yang mereka lacak.

Jarl
sumber
2

Tambahkan rune ini ke [alias]bagian file .gitconfig Anda:

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

Saya perlu menemukan cabang jarak jauh yang sesuai (jika ada) untuk setiap cabang lokal dalam satu lingkaran yang bekerja pada daftar cabang lokal. Saya akhirnya menggunakan yang berikut ini:

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

Ini tidak akan menghasilkan apa-apa (string kosong) untuk cabang lokal yang tidak memiliki cabang jarak jauh yang sesuai ("someremote / somebranch").

Ville
sumber
-1

Coba git branch dengan opsi :

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

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

Kalau tidak, periksa .git/config.

Andrew
sumber
3
Mereka menunjukkan cabang, tapi saya tidak mengerti yang mana yang melacak.
PJ.