Cari tahu cabang jarak jauh mana yang dilacak oleh cabang lokal

843

Lihat juga:
Bagaimana saya bisa melihat cabang Git mana yang melacak cabang jarak jauh / hulu?

Bagaimana saya bisa mengetahui cabang jarak jauh mana yang dilacak oleh cabang lokal?

Apakah saya perlu mengurai git configoutput, atau apakah ada perintah yang akan melakukan ini untuk saya?

Hanya baca
sumber
18
Sheesh. Ini bukan duplikat yang tepat. Ini adalah bagian dari yang lain, tetapi ada cara lain untuk melakukan pertanyaan keluar, seperti git remote show origin. Jawaban utama dalam pertanyaan lain adalah skrip bash melilit jawaban sederhana di sini, yang mungkin berguna bagi sebagian orang. Semoga pertanyaan ini tidak akan sepenuhnya tertutup.
cdunn2001
5
Setuju, ini pastinya bukan penipuan. Ini menanyakan sesuatu yang sama sekali berbeda dari pertanyaan terkait
Adam Batkin

Jawaban:

1004

Sini adalah perintah yang memberi Anda semua cabang pelacakan (dikonfigurasi untuk 'tarikan'), lihat:

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

Anda harus mengarungi SHA dan semua pesan komit yang sudah lama, tetapi cepat untuk mengetik dan saya mendapatkan cabang pelacakan disejajarkan secara vertikal di kolom ke-3.

Jika Anda memerlukan info tentang konfigurasi 'tarikan' dan 'dorong' per cabang, lihat jawaban lainnya di git remote show origin.


Memperbarui

Mulai di git versi 1.8.5 Anda dapat menunjukkan cabang upstream dengan git statusdangit status -sb

jdsumsion
sumber
6
Output ini lebih langsung daripada git branch -avatau git remote show origin, yang memberi Anda BANYAK data, bukan hanya remote yang dilacak
SimplGy
60
BTW, versi terbaru dari git (1.8.5.x) juga sekarang menunjukkan cabang upstream selama git statusdan git status -sb- jadi setelah Anda memutakhirkan ke 1.8.5.x, pertanyaan ini (dan jawaban) tidak relevan.
jdsumsion
11
Meskipun ini memberi Anda informasi yang Anda inginkan, saya tidak akan setuju karena itu adalah jawaban yang benar. Ini adalah jawaban dengan cara yang sama dengan memberi seseorang jawaban kamus "bagaimana Anda mengeja XYZ". Contohnya, Anda ingin MENGGUNAKAN jawaban yang dihasilkan (nama cabang) untuk beberapa operasi .. Jawaban ini hanya membantu saya melihatnya secara visual ... tidak memberi Anda sesuatu yang dapat digunakan dalam perintah berikutnya.
UpAndAdam
Output dari perintah ini dapat menyesatkan karena pesan komit dapat dengan mudah dimulai dengan misalnya "[fitur-saya] ...". Silakan lihat jawaban @ cdunn2001 yang hanya menunjukkan cabang upstream (jika ada) dan tidak ada yang lain.
Jonas Berlin
1
Saya setuju dengan @ jonas-berlin - jawaban cdunn2001 lebih baik jika Anda ingin menguraikan hasilnya - jawaban saya baik jika Anda mencari perintah sederhana dan bersedia memindai output secara visual
jdsumsion
372

Dua pilihan:

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

atau

% git for-each-ref --format='%(upstream:short)' "$(git symbolic-ref -q HEAD)"
origin/mainline
cdunn2001
sumber
12
Bagus! Yang pertama memberikan kesalahan jelek jika tidak ada yang dilacak, sedangkan yang kedua sangat membantu untuk skrip. BTW %(refname:short)adalah nama ref saat ini di dalam --format.
Tino
9
git help revisions(salah satu bagian dokumen yang sedikit diketahui tetapi paling berguna) dan mencari upstream.
cdunn2001
15
Jawaban ini jauh lebih baik daripada dua jawaban di atasnya, terutama jika Anda ingin melakukan sesuatu sepertigit diff `git rev-parse --abbrev-ref --symbolic-full-name @{upstream}`
Jian
2
Ini sangat bergunaecho 'git for-each-ref --format=\'%(refname:short) -> %(upstream:short)\' refs/heads/$1' > ~/bin/git-show-upstream; chmod +x ~/bin/git-show-upstream
Albfan
6
Jika Anda ingin mengetahui hulu untuk beberapa cabang lain, varian pilihan kedua adalah: git for-each-ref --format='%(upstream:short)' $(git rev-parse --symbolic-full-name SOMEBRANCH)mengganti SOMEBRANCH dengan nama cabang, atau "HEAD" untuk cabang saat ini
Jonas Berlin
220

Saya pikir git branch -avhanya memberi tahu Anda cabang apa yang Anda miliki dan komit mana yang berada, membuat Anda dapat menyimpulkan cabang mana yang dilacak oleh cabang lokal.

git remote show originsecara eksplisit memberi tahu Anda cabang mana yang melacak cabang jarak jauh mana. Berikut ini contoh keluaran dari repositori dengan komit tunggal dan cabang jarak jauh yang disebut 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

melawan

$ 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)
Ajit George
sumber
3
Saya membutuhkan perintah yang menemukan cabang hulu, jadi menggunakan 'asal' sebagai input membuat asumsi, jadi ini tidak bekerja untuk saya
Alexander Mills
1
Tapi ini TIDAK menjawab OP. Perintah ini git remote show originmenunjukkan kepada Anda cabang lokal dan apa yang mereka lacak untuk push dan pull.
dudewad
1
@dudewad Saya pikir intinya adalah bahwa perintah ini mengasumsikan bahwa remote dipanggil origin, sementara itu sebenarnya bisa berupa apa saja (misalnya beberapa remote, dengan cabang yang berbeda melacak cabang dari remote yang berbeda).
Ruslan
74

Pembaruan: Yah, sudah beberapa tahun sejak saya memposting ini! Untuk tujuan spesifik saya membandingkan HEAD dengan hulu, saya sekarang menggunakan @{u}, yang merupakan jalan pintas yang merujuk pada KEPALA dari cabang pelacakan hulu. (Lihat https://git-scm.com/docs/gitrevisions#gitrevisions-emltbranchnamegtupstreamemegemmasterupstreamememuem ).

Jawaban asli: Saya juga mengalami masalah ini. Saya sering menggunakan beberapa remote di repositori tunggal, dan mudah untuk melupakan yang mana dilacak oleh cabang Anda saat ini. Dan kadang-kadang berguna untuk mengetahui hal itu, seperti ketika Anda ingin melihat komitmen lokal Anda via git log remotename/branchname..HEAD.

Semua hal ini disimpan dalam variabel git config, tetapi Anda tidak perlu menguraikan output git config. Jika Anda menjalankan git config diikuti dengan nama variabel, itu hanya akan mencetak nilai variabel itu, tidak perlu parsing. Dengan mengingat hal itu, berikut adalah beberapa perintah untuk mendapatkan info tentang pengaturan pelacakan cabang Anda saat ini:

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`

Dalam kasus saya, karena saya hanya tertarik untuk mencari tahu nama remote saya saat ini, saya melakukan ini:

git config branch.`git name-rev --name-only HEAD`.remote
Aaron Wells
sumber
2
Ini sangat berguna dalam membuat alias untuk rebase apa pun cabang saya saat ini. Terima kasih!
Justin Spahr-Summers
Juga berguna untuk alias 'cepat ke depan' kami yang akan memajukan cabang pelacakan lokal ke jarak jauh selama operasi adalah maju cepat.
Altreus
4
Sebenarnya saya menemukan ini git name-rev --name-only HEADtidak akan memberi tahu Anda di mana Anda berada. Untuk itu saya baru saja menggunakangit branch | grep '^\*' | cut -d' ' -f2
Altreus
1
Terima kasih! Jawaban lain untuk pertanyaan serupa tidak menyebutkan @{u}alias / pintasan dan itulah yang saya cari! Tidak ada alasan untuk membandingkan dengan cabang utama jika Anda hanya ingin menentukan apakah Anda perlu menarik atau tidak.
Dan M.
1
@{u}adalah bomnya. Dan sudah ada sejak 1.7.0, yang berarti bahwa jika tidak tersedia di git yang digunakan seseorang pada tahun 2018, mereka mungkin akan melakukan upgrade.
Chris Cleeland
48

Cabang-cabang lokal dan remote mereka.

git branch -vv 

Semua cabang dan pelacak jarak jauh.

git branch -a -vv

Lihat di mana cabang lokal dikonfigurasikan secara eksplisit untuk mendorong dan menarik.

git remote show {remote_name}
nikkypx
sumber
21

Ini akan menunjukkan kepada Anda cabang tempat Anda berada:

$ git branch -vv

Ini hanya akan menampilkan cabang Anda saat ini:

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

sebagai contoh:

myremote/mybranch

Anda dapat mengetahui URL remote yang digunakan oleh cabang saat ini Anda gunakan untuk:

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

sebagai contoh:

https://github.com/someone/somerepo.git
rubo77
sumber
19

Anda dapat menggunakan git checkout, yaitu "periksa cabang saat ini". Ini adalah no-op dengan efek samping untuk menampilkan informasi pelacakan, jika ada, untuk cabang saat ini.

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

Saya tidak tahu apakah ini dianggap parsing output dari git config, tetapi ini akan menentukan URL dari remote yang dilacak oleh master:

$ git config remote. $ (git config branch.master.remote) .url
William Pursell
sumber
Atau git config branch.$(git symbolic-ref -q HEAD).remotejika Anda hanya ingin nama remote dilacak dari cabang saat ini— git config remote.$(git config branch.$(git symbolic-ref -q HEAD).remote).urluntuk URL.
Anakhand
Saya perlu menambahkan --shortopsi agar berfungsi. Jadi untuk mendapatkan nama jauh dari cabang saat ini: git config branch.$(git symbolic-ref -q --short HEAD).remotedan untuk mendapatkan URL dari jarak jauh dari cabang saat ini:git config remote.$(git config branch.$(git symbolic-ref -q --short HEAD).remote).url
Nelson
13

Namun cara lain

git status -b --porcelain

Ini akan memberimu

## BRANCH(...REMOTE)
modified and untracked files
FragLegs
sumber
10

Cara sederhana lainnya adalah menggunakan

cat .git/config dalam repo git

Ini akan mencantumkan detail untuk cabang lokal

Trickmaster
sumber
Bekerja dengan baik di Linux. Tidak akan bekerja pada Windows kecuali dalam prompt mirip Unix (mis. Cygwin atau git bash).
Contango
Di Windows, gunakan saja type .git/configalih-alih cat .git/configpada baris perintah biasa ..
khmarbaise
9

Metode lain (terima kasih osse), jika Anda hanya ingin tahu ada atau tidaknya:

if git rev-parse @{u} > /dev/null 2>&1
then
  printf "has an upstream\n"
else
  printf "has no upstream\n"
fi
Wayne Walker
sumber
Bahasa apa? Ini terlihat seperti skrip shell Linux tetapi tidak memberikan informasi atau konteks lain.
Suncat2000
8

git branch -vv | grep 'BRANCH_NAME'

git branch -vv : Bagian ini akan menampilkan semua cabang lokal bersama dengan cabang hulu mereka.

grep 'BRANCH_NAME' : Ini akan menyaring cabang saat ini dari daftar cabang.

Sabyasachi Ghosh
sumber
7
git branch -r -vv

akan mendaftar semua cabang termasuk jarak jauh.

Ranushka Goonesekere
sumber
5

Daftar cabang lokal dan jauh:

$ git branch -ra

Keluaran:

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

git-status porcelain (dapat dibaca mesin) v2 terlihat seperti ini:

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

Dan untuk mendapatkan cabang di hulu saja:

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

Jika cabang tidak memiliki upstream, perintah di atas akan menghasilkan output kosong (atau gagal dengan set -o pipefail).

AndiDog
sumber
2

Jika Anda ingin menemukan hulu untuk cabang apa pun (bukan hanya cabang yang Anda gunakan), berikut adalah sedikit modifikasi pada jawaban @ cdunn2001:

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

Itu akan memberi Anda nama cabang jarak jauh untuk cabang lokal bernama YOUR_LOCAL_BRANCH_NAME.

Jeremy Thomerson
sumber
2

Anda dapat mencoba ini:

git remote show origin | grep "branch_name"

branch_name perlu diganti dengan cabang Anda

xpionir
sumber
Apa yang terjadi jika nama cabang Anda juga cocok dengan cabang lainnya? Apa yang terjadi nama cabang Anda cocok dengan beberapa teks lain dalam output git remote show origin- jika itu disebut mergesatau configure?
Tom Swirly
tidak mengerti kamu. maksud Anda beberapa cabang memiliki nama yang sama
xpioneer
1

Saya menggunakan alias ini

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

kemudian

git track

perhatikan bahwa skrip juga dapat digunakan untuk mengatur pelacakan.

Lebih banyak alias hebat di https://github.com/orefalo/bash-profiles

Olivier Refalo
sumber
0

Saya menggunakan EasyGit (alias "eg") sebagai pembungkus super ringan di atas (atau di sepanjang sisi) Git. EasyGit memiliki sub-perintah "info" yang memberi Anda semua jenis informasi super berguna, termasuk cabang pelacakan cabang jarak jauh saat ini. Berikut ini contoh (di mana nama cabang saat ini adalah "foo"):

pknotz @ s883422: (foo) ~ / workspace / bd
$ mis. info
Total komitmen: 175
Repositori lokal: .git
Repositori jauh bernama: (nama -> lokasi)
  origin -> git: //sahp7577/home/pknotz/bd.git
Cabang saat ini: foo
  Checkum kriptografi (sha1sum): bd248d1de7d759eb48e8b5ff3bfb3bb0eca4c5bf
  Repositori pull / push default: asal
  Opsi tarik / dorong standar:
    branch.foo.remote = asal
    branch.foo.merge = ref / kepala / aal_devel_1
  Jumlah kontributor: 3
  Jumlah file: 28
  Jumlah direktori: 20
  Ukuran file terbesar, dalam byte: 32473 (pygooglechart-0.2.0 / COPYING)
  Berkomitmen: 62
Pat Notz
sumber
0

Memperbaiki jawaban ini , saya datang dengan .gitconfigalias ini :

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
Tom Hale
sumber
bahasa apa itu?
Daniel Farrell
3
@Dan Farrell: shell. Alias ​​dimulai dengan! gunakan / bin / sh. Kutipan ganda dikutip untuk file konfigurasi git.
Tom Hale
0

Jika Anda menggunakan 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
    }
ravikanth
sumber
-2

Perintah berikut akan merujuk garpu asal saat ini merujuk

git remote -v

Untuk menambahkan jalur jauh,

git remote menambahkan asal path_name

Nagaraja G Devadiga
sumber
di sini Anda tidak menemukan jalan jauh - Anda menambahkan
serup