Yerel bir şubenin hangi uzak şubeyi izlediğini öğrenin


842

Ayrıca
bkz: Hangi Git dallarının hangi uzak / yukarı akış dalını izlediğini nasıl görebilirim?

Yerel bir şubenin hangi uzak dalı izlediğini nasıl öğrenebilirim?

git configÇıktıyı ayrıştırmam gerekir mi yoksa bunu benim için yapacak bir komut var mı?


18
Sheesh. Bu tam bir kopya değil . Bu, diğerinin bir alt kümesidir, ancak dış soruyu yapmanın başka yolları da vardır git remote show origin. Diğer sorudaki ana cevap, burada basit cevabın etrafına sarılmış bir bash betiğidir ve bazıları için yararlı olabilir. Umarım bu soru tamamen kapatılmaz.
cdunn2001

5
Kabul ettim, bu kesinlikle bir dupe olmamalı. Bağlantılı sorudan tamamen farklı bir şey soruyor
Adam Batkin

Yanıtlar:


1002

İşte size tüm izleme dallarını ('çekme' için yapılandırılmış) veren bir komut, bakınız:

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

SHA ve herhangi bir uzun sarma taahhüt mesajları ile geçmek zorunda, ama yazmak hızlı ve 3. sütununda izleme dalları dikey hizalanmış olsun.

Dal başına hem 'çekme' hem de 'itme' yapılandırması hakkında bilgiye ihtiyacınız varsa, diğer cevaba bakınız git remote show origin.


Güncelleme

Git sürüm 1.8.5'ten başlayarak yukarı akış dalını git statusvegit status -sb


6
Bu çıkış, yalnızca izlenen uzaktan kumandaya değil, size çok fazla veri sağlayan git branch -avveya daha doğrudandırgit remote show origin
SimplGy

60
Git'in (1.8.5.x) en yeni sürümleri olan BTW şimdi git statusve sırasında akış yukarı dalı gösterir git status -sb- bu nedenle 1.8.5.x'e yükselttiğinizde, bu soru (ve cevap) önemsizdir.
jdsumsion

11
Bu size istediğiniz bilgiyi verirken, doğru cevap olduğu konusunda aynı fikirde değilim. Bu, birisine "XYZ'yi nasıl hecelersin?" Sorusuna cevap veren bir cevaptır. Bu durumda, ortaya çıkan yanıtı (şube adı) bazı işlemler için KULLANMAK istersiniz .. Bu cevap yalnızca görsel olarak görmeme yardımcı olur ... sonraki komutta kullanılabilir bir şey vermez.
UpAndAdam

Bu komutun çıktısı yanıltıcı olabilir, çünkü bir taahhüt mesajı kolayca "[my-feature] ..." ile başlayabilir. Lütfen sadece yukarı akış dalını (varsa) gösteren ve başka bir şey olmayan @ cdunn2001'in yanıtına bakın.
Jonas Berlin

1
@ Jonas-berlin ile katılıyorum - sonucu ayrıştırmak istiyorsanız cdunn2001'in cevabı daha iyi - basit bir komut arıyorsanız ve çıktıyı görsel olarak taramaya istekli iseniz cevabım iyi
jdsumsion

372

İki seçenek:

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

veya

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

12
Güzel! İlki, hiçbir şeyin izlenmemesi durumunda çirkin hatalar verirken, ikincisi özellikle kodlama için yararlıdır. BTW %(refname:short), içinde mevcut ref'nin adıdır --format.
Tino

9
git help revisions(dokümanların az bilinen ancak en yararlı kısımlarından biri) ve arama yapın upstream.
cdunn2001

15
Bu cevap, yukarıdaki iki cevaptan çok daha iyi, özellikle de böyle bir şey yapmak istiyorsanızgit diff `git rev-parse --abbrev-ref --symbolic-full-name @{upstream}`
Jian

2
Bu gerçekten yararlıecho 'git for-each-ref --format=\'%(refname:short) -> %(upstream:short)\' refs/heads/$1' > ~/bin/git-show-upstream; chmod +x ~/bin/git-show-upstream
albfan

6
Başka bir dalın yukarı akışını bulmak istiyorsanız, ikinci seçeneğin bir çeşidi: git for-each-ref --format='%(upstream:short)' $(git rev-parse --symbolic-full-name SOMEBRANCH)SOMEBRANCH'ı şube adıyla değiştirmek veya mevcut şube için "HEAD"
Jonas Berlin

220

Sanırım git branch -avsadece hangi şubeleriniz olduğunu ve hangi taahhütte bulunduklarını söyleyerek size yerel şubelerin hangi uzak şubeleri izlediğini söylemeye izin veriyor.

git remote show originhangi şubelerin hangi uzak şubeleri izlediğini açıkça belirtir. Aşağıda, tek bir taahhüt ve uzak dal adı verilen bir depodan örnek çıktı verilmiştir 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

karşı

$ 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
Akış yukarı dalı keşfeden bir komuta ihtiyacım var , bu yüzden giriş olarak 'origin' kullanmak bir varsayım yapıyor, bu yüzden bu benim için çalışmıyor
Alexander Mills

1
Ama bu OP'ye cevap veriyor. Komut git remote show originsize yerel şubeleri ve hem itme hem çekme için ne izlediklerini gösterir.
dudewad

1
@dudewad Bence bu komut, uzaktan kumandanın çağrıldığını varsayarken, originaslında herhangi bir şey olabilir (örneğin, birden fazla uzaktan kumanda, farklı şubelerden farklı dalları takip eden dallar).
Ruslan

74

Güncelleme: Bunu yayınlamamın üzerinden birkaç yıl geçti! HEAD'ı yukarı akışla karşılaştırmak için özel amacım olarak, şimdi @{u}yukarı akış izleme dalının HEAD'ini ifade eden bir kısayol olan kullanıyorum . (Bkz. Https://git-scm.com/docs/gitrevisions#gitrevisions-emltbranchnamegtupstreamemegemmasterupstreamememuem ).

Orijinal cevap: Bu problemle de karşılaştım. Tek bir depoda genellikle birden fazla uzaktan kumanda kullanıyorum ve mevcut şubenizin hangisine karşı izlediğini unutmak kolay. Ve bazen bunu bilmek, örneğin yerel taahhütlerinize ne zaman bakmak istediğiniz gibi git log remotename/branchname..HEAD.

Tüm bunlar git config değişkenlerinde saklanır, ancak git config çıkışını ayrıştırmanıza gerek yoktur. Git config komutunu ve ardından bir değişkenin adını çağırırsanız, yalnızca bu değişkenin değerini yazdırır, ayrıştırma gerekmez. Bunu göz önünde bulundurarak, mevcut şubenizin izleme kurulumu hakkında bilgi almak için bazı komutlar şunlardır:

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`

Benim durumumda, sadece geçerli uzaktan kumandanın adını bulmakla ilgilendiğim için bunu yapıyorum:

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

2
Bu, mevcut şubem ne olursa olsun yeniden takma ad yapmak için çok yararlı oldu. Teşekkürler!
Justin Spahr-Summers

Aynı şekilde, işlem bir ileri sarma olduğu sürece yerel izleme dalını uzaktan kumandaya ilerletecek olan 'hızlı ileri' takma adımız için de yararlıdır.
Altreus

4
Aslında bunun git name-rev --name-only HEADhangi şubede olduğunuzu söylemeyeceğini keşfettim . Bunun için az önce kullandımgit branch | grep '^\*' | cut -d' ' -f2
Altreus

1
Teşekkürler! Benzer soruların diğer cevapları @{u}takma ad / kısayoldan bahsetmedi ve tam da aradığım şey buydu! Sadece çekmeniz gerekip gerekmediğini belirlemek istiyorsanız ana dal ile karşılaştırmak için bir neden yoktur.
Dan M.

1
@{u}bomba. Ve 1.7.0'dan beri var, yani 2018'de birisinin kullandığı bir git'te bulunmuyorsa, muhtemelen bir yükseltme yapılması gerekiyor.
Chris Cleeland

48

Yerel şubeler ve uzaktan kumandaları.

git branch -vv 

Tüm şubeler ve izleme uzaktan kumandaları.

git branch -a -vv

Yerel şubelerin itme ve çekme için açıkça yapılandırıldığını görün.

git remote show {remote_name}

21

Bu, bulunduğunuz şubeyi gösterecektir:

$ git branch -vv

Bu yalnızca bulunduğunuz dalı gösterir :

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

Örneğin:

myremote/mybranch

Bulunduğunuz dalın kullandığı uzaktan kumandanın URL'sini bulabilirsiniz :

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

Örneğin:

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

19

Kullanabilirsiniz git checkout, yani "geçerli dalı kontrol edin". Bu, geçerli şube için varsa izleme bilgilerini gösteren yan etkilere sahip bir işlemdir.

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

17

Bu git config çıktı ayrıştırma olarak sayılır bilmiyorum, ama bu ana izliyor uzaktan kumandanın URL'sini belirler:

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

Veya git config branch.$(git symbolic-ref -q HEAD).remoteyalnızca uzaktan kumandanın adının geçerli daldan izlenmesini istiyorsanız - git config remote.$(git config branch.$(git symbolic-ref -q HEAD).remote).urlURL için.
Anakhand

--shortÇalışması için seçenek eklemem gerekiyordu . Mevcut şubenin uzak adını almak için: git config branch.$(git symbolic-ref -q --short HEAD).remoteve mevcut şubenin uzaktan kumandasının URL'sini almak için:git config remote.$(git config branch.$(git symbolic-ref -q --short HEAD).remote).url
Nelson

13

Yine başka bir yol

git status -b --porcelain

Bu sana verecek

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

10

Başka bir basit yol da

cat .git/config git deposunda

Bu, yerel şubelerin ayrıntılarını listeleyecektir


Linux üzerinde iyi çalışır. Unix benzeri bir istemde (örn. Cygwin veya git bash) Windows'ta çalışmaz.
Contango

Windows sadece kullanım type .git/configyerine cat .git/config.. düz komut satırında tabii
khmarbaise

9

Başka bir yöntem (teşekkürler osse), sadece var olup olmadığını bilmek istiyorsanız:

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

Hangi dil? Bu bir Linux kabuk betiğine benziyor, ancak başka bilgi veya bağlam vermiyor.
Suncat2000

8

git branch -vv | grep 'BRANCH_NAME'

git branch -vv : Bu bölüm tüm yerel şubeleri yukarı akış şubeleriyle birlikte gösterecektir.

grep 'BRANCH_NAME' : Geçerli dalı, şube listesinden filtreleyecektir.



5

Hem yerel hem de uzak dalları listeler:

$ git branch -ra

Çıktı:

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

3

git-status porselen (makine tarafından okunabilir) v2 çıkışı şöyle görünür:

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

Ve şubeyi sadece yukarı akış yönünde almak için:

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

Dalın yukarı akış yoksa, yukarıdaki komut boş bir çıktı oluşturur (veya başarısız olur set -o pipefail).


2

Herhangi bir dalın yukarı akışını bulmak istiyorsanız (sadece bulunduğunuz dalın aksine), @ cdunn2001'in cevabında küçük bir değişiklik var:

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

Bu, adlı yerel dal için uzak dal adını verecektir YOUR_LOCAL_BRANCH_NAME.


2

Bunu deneyebilirsiniz:

git remote show origin | grep "branch_name"

branch_name şubenizle değiştirilmesi gerekiyor


Şube adınız diğer şubelerle de eşleşirse ne olur? Şube adınız, veya olarak git remote show originadlandırılırsa çıktıdaki diğer bazı metinlerle ne olur ? mergesconfigure
Tom Swirly

seni anlamadım. Aynı isimlere sahip birden çok dal mı demek istediniz
xpioneer

1

Bu takma adı kullanıyorum

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

sonra

git track

komut dosyasının izleme kurulumunda da kullanılabileceğini unutmayın.

Https://github.com/orefalo/bash-profiles adresindeki diğer harika takma adlar


0

Kullandığım EasyGit (aka "mesela") (veya yan tarafı boyunca) Git üstüne bir süper hafif sargı olarak. EasyGit, mevcut şubeler uzaktan izleme şubesi de dahil olmak üzere her türlü süper yararlı bilgiyi veren bir "bilgi" alt komutuna sahiptir. İşte bir örnek (mevcut şube adının "foo" olduğu yer):

pknotz @ s883422: (foo) ~ / çalışma alanı / bd
$ eg info
Toplam taahhüt: 175
Yerel depo: .git
Adlandırılmış uzak depolar: (ad -> konum)
  kökeni -> git: //sahp7577/home/pknotz/bd.git
Mevcut şube: foo
  Şifreleme sağlama toplamı (sha1sum): bd248d1de7d759eb48e8b5ff3bfb3bb0eca4c5bf
  Varsayılan çekme / itme havuzu: başlangıç ​​noktası
  Varsayılan çekme / itme seçenekleri:
    branch.foo.remote = kökeni
    branch.foo.merge = refs / kafalar / aal_devel_1
  Katkıda bulunan sayısı: 3
  Dosya sayısı: 28
  Dizin sayısı: 20
  Bayt cinsinden en büyük dosya boyutu: 32473 (pygooglechart-0.2.0 / COPYING)
  İşlemler: 62

0

Bu cevabı geliştirerek şu .gitconfigtakma adlarla karşılaştım:

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

hangi dil bu
Daniel Farrell

3
Dan Farrell: deniz hayvanı kabuğu. A ile başlayan takma adlar! / bin / sh kullanın. Çift tırnak işaretleri git'in config dosyası için verilmiştir.
Tom Hale

0

Gradle kullanıyorsanız,

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

Aşağıdaki komut uzak kökenli akım çatalı

git remote -v

Uzak bir yol eklemek için,

git remote orijin ekle path_name


burada uzak bir yol bulamıyorsunuz - ekliyorsunuz
serup
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.