Dowiedz się, który oddział zdalny śledzi oddział lokalny

842

Zobacz także:
Jak mogę sprawdzić, które gałęzie Git śledzą, która gałąź zdalna / nadrzędna?

Jak mogę dowiedzieć się, który oddział zdalny śledzi oddział lokalny?

Czy muszę analizować git configdane wyjściowe, czy też istnieje polecenie, które by to dla mnie zrobiło?

Tylko czytać
źródło
18
Do licha. To nie jest dokładny duplikat. Jest to podzbiór tego drugiego, ale istnieją inne sposoby na rozwiązanie tego pytania, na przykład git remote show origin. Główną odpowiedzią na drugie pytanie jest skrypt bashowy zawarty wokół prostej odpowiedzi tutaj, która może być przydatna dla niektórych. Mam nadzieję, że to pytanie nie zostanie całkowicie zamknięte.
cdunn2001,
5
Zgadzam się, to zdecydowanie nie powinno być dupkiem. Zadaje coś zupełnie innego niż powiązane pytanie
Adam Batkin

Odpowiedzi:

1002

Oto polecenie, które udostępnia wszystkie gałęzie śledzące (skonfigurowane do „ściągania”), patrz:

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

Musisz przedzierać się przez SHA i wszelkie długo owijające się komunikaty zatwierdzenia, ale szybko się pisze i wyrównuję gałęzie śledzące pionowo w trzeciej kolumnie.

Jeśli potrzebujesz informacji na temat konfiguracji „pull” i „push” na gałąź, zobacz drugą odpowiedź na git remote show origin.


Aktualizacja

Począwszy od wersji git 1.8.5, możesz wyświetlić gałąź upstream za pomocą git statusigit status -sb

jdsumsion
źródło
6
To wyjście jest bardziej bezpośrednie niż git branch -avlub git remote show origin, co daje dużo danych, nie tylko śledzone zdalne
SimplGy
60
BTW, najnowsze wersje git (1.8.5.x) również teraz pokazują gałąź upstream podczas git statusi git status -sb- więc po aktualizacji do 1.8.5.x to pytanie (i odpowiedź) nie ma znaczenia.
jdsumsion
11
Chociaż daje to informacje, których potrzebujesz, nie zgadzam się, ponieważ jest to poprawna odpowiedź. Jest to odpowiedź w ten sam sposób, gdy ktoś daje słownikowi odpowiedź „jak przeliterować XYZ”. w tym przypadku chcesz UZYSKAĆ ​​wynikową odpowiedź (nazwę oddziału) dla niektórych operacji. Ta odpowiedź pomaga mi tylko wizualnie ją zobaczyć ... nie daje ci czegoś użytecznego w kolejnym poleceniu.
UpAndAdam
Dane wyjściowe tego polecenia mogą być mylące, ponieważ komunikat zatwierdzenia może łatwo zaczynać się na przykład od „[moja-funkcja] ...”. Zobacz odpowiedź @ cdunn2001, która pokazuje tylko gałąź nadrzędną (jeśli istnieje) i nic więcej.
Jonas Berlin,
1
Zgadzam się z @ jonas-berlin - odpowiedź cdunn2001 jest lepsza, jeśli chcesz przeanalizować wynik - moja odpowiedź jest dobra, jeśli szukasz prostej komendy i chcesz wizualnie zeskanować wynik
jdsumsion
372

Dwie możliwości:

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

lub

% git for-each-ref --format='%(upstream:short)' "$(git symbolic-ref -q HEAD)"
origin/mainline
cdunn2001
źródło
12
Miły! Pierwszy zawiera brzydkie błędy w przypadku, gdy nic nie jest śledzone, a drugi jest szczególnie pomocny w skryptowaniu. BTW %(refname:short)to nazwa bieżącego ref w obrębie --format.
Tino,
9
git help revisions(jedna z mało znanych, ale najbardziej przydatnych części dokumentów) i wyszukaj upstream.
cdunn2001
15
Ta odpowiedź jest znacznie lepsza niż dwie powyższe odpowiedzi, szczególnie jeśli chcesz zrobić coś takiegogit diff `git rev-parse --abbrev-ref --symbolic-full-name @{upstream}`
Jian
2
Jest to naprawdę przydatneecho 'git for-each-ref --format=\'%(refname:short) -> %(upstream:short)\' refs/heads/$1' > ~/bin/git-show-upstream; chmod +x ~/bin/git-show-upstream
albfan
6
Jeśli chcesz dowiedzieć się, w górę dla jakiegoś innego oddziału, wariant drugiego wyboru to: git for-each-ref --format='%(upstream:short)' $(git rev-parse --symbolic-full-name SOMEBRANCH)zastąpienie SOMEBRANCH nazwą oddziału lub „HEAD” dla aktualnego oddziału
Jonas Berlin
220

Myślę, że git branch -avmówi tylko, jakie masz gałęzie i które zatwierdzają, pozostawiając cię do wnioskowania, które odległe gałęzie śledzą lokalne oddziały.

git remote show originwyraźnie informuje, które gałęzie śledzą, które gałęzie zdalne. Oto przykładowe dane wyjściowe z repozytorium z pojedynczym zatwierdzeniem i zdalną gałęzią o nazwie 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

przeciw

$ 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
źródło
3
Potrzebuję polecenia, które odkryje gałąź nadrzędną, więc użycie „origin” jako danych wejściowych czyni założenie, więc to nie działa dla mnie
Alexander Mills
1
Ale to odpowiada na OP. Polecenie git remote show originpokazuje lokalne oddziały i ich śledzenie zarówno dla push i pull.
dudewad
1
@dudewad Myślę, że chodziło o to, że to polecenie zakłada, że ​​pilot jest wywoływany origin, podczas gdy w rzeczywistości może to być wszystko (np. wiele pilotów, z różnymi gałęziami śledzącymi gałęzie z różnych pilotów).
Ruslan
74

Aktualizacja: Cóż, minęło kilka lat, odkąd to opublikowałem! Dla mojego konkretnego celu porównania HEAD z upstream, teraz używam @{u}, który jest skrótem odnoszącym się do HEAD w gałęzi śledzenia upstream. (Zobacz https://git-scm.com/docs/gitrevisions#gitrevisions-emltbranchnamegtupstreamemegemmasterupstreamememuem ).

Oryginalna odpowiedź: napotkałem również ten problem. Często używam wielu pilotów w jednym repozytorium i łatwo jest zapomnieć, z którego z nich śledzi twoja obecna gałąź. A czasem dobrze jest o tym wiedzieć, na przykład, gdy chcesz spojrzeć na swoje lokalne zobowiązania za pośrednictwem git log remotename/branchname..HEAD.

Wszystkie te rzeczy są przechowywane w zmiennych konfiguracyjnych git, ale nie musisz analizować danych wyjściowych git config. Jeśli wywołasz git config, a po nim nazwę zmiennej, po prostu wydrukuje ona wartość tej zmiennej, bez konieczności analizowania. Mając to na uwadze, oto kilka poleceń, aby uzyskać informacje o bieżącej konfiguracji śledzenia Twojego oddziału:

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`

W moim przypadku, ponieważ jestem zainteresowany tylko znalezieniem nazwy mojego obecnego pilota, robię to:

git config branch.`git name-rev --name-only HEAD`.remote
Aaron Wells
źródło
2
Było to bardzo przydatne w tworzeniu aliasu w celu bazowania niezależnie od mojej obecnej gałęzi. Dzięki!
Justin Spahr-Summers
Przydatny jest również nasz alias „fastforward”, który przesunie lokalną gałąź śledzenia do pilota, o ile operacja jest przewijana do przodu.
Altreus,
4
Właściwie odkryłem, że git name-rev --name-only HEADto nie powie ci, na której gałęzi jesteś. Do tego właśnie użyłemgit branch | grep '^\*' | cut -d' ' -f2
Altreus
1
Dzięki! Inne odpowiedzi na podobne pytania nie wspominały o @{u}aliasie / skrócie i właśnie tego szukałem! Nie ma powodu, aby porównywać z gałęzią master, jeśli chcesz tylko ustalić, czy musisz wyciągnąć, czy nie.
Dan M.
1
@{u}jest bombą. I jest już od wersji 1.7.0, co oznacza, że ​​jeśli nie jest dostępny w gitarze, którego ktoś używa w 2018 r., Prawdopodobnie należy go aktualizacja.
Chris Cleeland,
48

Lokalne oddziały i ich piloty.

git branch -vv 

Wszystkie oddziały i piloty śledzące.

git branch -a -vv

Zobacz, gdzie lokalne oddziały są jawnie skonfigurowane dla push i pull.

git remote show {remote_name}
nikkypx
źródło
21

Spowoduje to wyświetlenie gałęzi, w której się znajdujesz:

$ git branch -vv

Spowoduje to wyświetlenie tylko bieżącego oddziału, w którym się znajdujesz:

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

na przykład:

myremote/mybranch

Możesz dowiedzieć się, jaki jest adres URL pilota używanego przez bieżący oddział :

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

na przykład:

https://github.com/someone/somerepo.git
rubo77
źródło
19

Możesz użyć git checkout, tzn. „Sprawdź bieżący oddział”. Jest to brak operacji z efektami ubocznymi, aby wyświetlić informacje o śledzeniu, jeśli istnieją, dla bieżącej gałęzi.

$ git checkout 
Your branch is up-to-date with 'origin/master'.
Eugene Yarmash
źródło
17

Nie wiem, czy liczy się to jako analizowanie danych wyjściowych git config, ale to określi adres URL zdalnego, który śledzi master:

$ git config remote. $ (git config branch.master.remote) .url
William Pursell
źródło
Lub git config branch.$(git symbolic-ref -q HEAD).remotejeśli chcesz, aby nazwa pilota była śledzona w bieżącym oddziale - git config remote.$(git config branch.$(git symbolic-ref -q HEAD).remote).urldla adresu URL.
Anakhand
Musiałem dodać --shortopcję, aby to działało. Aby uzyskać zdalną nazwę bieżącego oddziału: git config branch.$(git symbolic-ref -q --short HEAD).remotei uzyskać adres URL zdalnego oddziału:git config remote.$(git config branch.$(git symbolic-ref -q --short HEAD).remote).url
Nelson
13

Jeszcze inny sposób

git status -b --porcelain

To ci da

## BRANCH(...REMOTE)
modified and untracked files
FragLegs
źródło
10

Innym prostym sposobem jest użycie

cat .git/config w repozytorium git

Spowoduje to wyświetlenie szczegółów dla lokalnych oddziałów

Trickmaster
źródło
Ładnie działa w systemie Linux. Nie będzie działał w systemie Windows, chyba że w monicie podobnym do Uniksa (np. Cygwin lub git bash).
Contango,
W systemie Windows po prostu używaj type .git/configzamiast, cat .git/configoczywiście, w zwykłej linii poleceń.
Khmarbaise
9

Inna metoda (dzięki osse), jeśli chcesz tylko wiedzieć, czy istnieje:

if git rev-parse @{u} > /dev/null 2>&1
then
  printf "has an upstream\n"
else
  printf "has no upstream\n"
fi
Wayne Walker
źródło
Jaki język? To wygląda jak skrypt powłoki Linuksa, ale nie daje żadnych innych informacji ani kontekstu.
Suncat2000 10.10.19
8

git branch -vv | grep 'BRANCH_NAME'

git branch -vv : Ta część pokaże wszystkie lokalne oddziały wraz z ich odgałęzieniem.

grep 'BRANCH_NAME' : Filtruje bieżącą gałąź z listy gałęzi.

Sabyasachi Ghosh
źródło
7
git branch -r -vv

wyświetli wszystkie gałęzie, w tym zdalne.

Ranushka Goonesekere
źródło
5

Wyświetla listę oddziałów lokalnych i zdalnych:

$ git branch -ra

Wynik:

  feature/feature1
  feature/feature2
  hotfix/hotfix1
* master
  remotes/origin/HEAD -> origin/master
  remotes/origin/develop
  remotes/origin/master
joseluisq
źródło
3

git-status porcelana (do odczytu maszynowego) v2 wygląda następująco:

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

I aby uzyskać oddział tylko powyżej:

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

Jeśli gałąź nie ma żadnych danych wyjściowych, powyższe polecenie wygeneruje puste dane wyjściowe (lub zakończy się niepowodzeniem set -o pipefail).

AndiDog
źródło
2

Jeśli chcesz znaleźć upstream dla dowolnej gałęzi (w przeciwieństwie do tej, w której się znajdujesz), oto niewielka modyfikacja odpowiedzi @ cdunn2001:

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

To da ci nazwę oddziału zdalnego dla oddziału lokalnego o nazwie YOUR_LOCAL_BRANCH_NAME.

Jeremy Thomerson
źródło
2

Możesz spróbować:

git remote show origin | grep "branch_name"

branch_name musi zostać zastąpiony przez twój oddział

Xpioneer
źródło
Co się stanie, jeśli nazwa twojego oddziału pasuje również do innych oddziałów? Co się stanie, nazwa twojej gałęzi pasuje do innego tekstu na wyjściu git remote show origin- jeśli to się nazywa mergeslub configure?
Tom Swirly,
nie dostałem ciebie. masz na myśli wiele oddziałów o takich samych nazwach
xpioneer
1

Używam tego aliasu

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

następnie

git track

pamiętaj, że skrypt może być również użyty do konfiguracji śledzenia.

Więcej świetnych aliasów na https://github.com/orefalo/bash-profiles

Olivier Refalo
źródło
0

Używam EasyGit (aka „np.”) Jako superlekkiego opakowania na Git (lub obok niego). EasyGit ma podkomendę „info”, która zapewnia wszelkiego rodzaju bardzo przydatne informacje, w tym gałąź zdalnego śledzenia bieżących gałęzi. Oto przykład (gdzie obecna nazwa oddziału to „foo”):

pknotz @ s883422: (foo) ~ / workspace / bd
$ np. informacje
Całkowita liczba zobowiązań: 175
Lokalne repozytorium: .git
Nazwane zdalne repozytoria: (nazwa -> lokalizacja)
  origin -> git: //sahp7577/home/pknotz/bd.git
Obecny oddział: foo
  Kryptograficzna suma kontrolna (sha1sum): bd248d1de7d759eb48e8b5ff3bfb3bb0eca4c5bf
  Domyślne repozytorium pull / push: origin
  Domyślne opcje pull / push:
    branch.foo.remote = origin
    branch.foo.merge = refs / heads / aal_devel_1
  Liczba autorów: 3
  Liczba plików: 28
  Liczba katalogów: 20
  Największy rozmiar pliku, w bajtach: 32473 (pygooglechart-0.2.0 / COPYING)
  Zobowiązania: 62
Pat Notz
źródło
0

Poprawiając tę odpowiedź , wymyśliłem te .gitconfigaliasy:

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
źródło
który to język?
Daniel Farrell,
3
@Dan Farrell: shell. Aliasy zaczynające się na! użyj / bin / sh. Podwójne cudzysłowy są cytowane w pliku konfiguracyjnym git.
Tom Hale,
0

Jeśli używasz 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
źródło
-2

Następujące polecenie będzie dotyczyć bieżącego początkowego rozwidlenia

git zdalny -v

Aby dodać ścieżkę zdalną,

git zdalnie dodaj początek nazwa_ścieżki

Nagaraja G Devadiga
źródło
tutaj nie znajdujesz odległej ścieżki - dodajesz
serup