Pytanie Jak uzyskać aktualną nazwę oddziału w Git?


Pochodzę ze środowiska Subversion i kiedy miałem oddział, wiedziałem, nad czym pracuję, "Te pliki robocze wskazują na tę gałąź".

Ale z Git nie jestem pewien, kiedy edytuję plik w NetBeans lub Notepad ++, niezależnie od tego, czy jest on powiązany z masterem, czy z inną gałęzią.

Nie ma problemu z git w bash mówi mi, co robię.


1718
2018-06-05 20:13


pochodzenie


Pozwól, aby Twój IDE wyświetlał plik .git/HEAD, prawdopodobnie w katalogu nadrzędnym - Tino
stackoverflow.com/questions/1417957/... $ git rev-parse --abbrev-ref HEAD - fantastory
możliwy duplikat Jak programowo określić aktualnie wyewidencjonowany oddział Git - tripleee
Z Widok -> Pokaż wersjonowanie Etykiety włączone w NetBeans, wszystko co musisz zrobić, to najechać myszką na folder Projekt (lub Plik, lub Ulubiony), aby zobaczyć bieżącą gałąź. - idclaar
Możliwy duplikat Pokaż tylko bieżącą gałąź w Git - techraf


Odpowiedzi:


git branch

powinien pokazać wszystkie lokalne oddziały twojego repo. Gwiezdna gałąź to Twoja obecna gałąź.


1298
2018-06-05 20:17



Jeśli chcesz pracować w Eclipse, istnieje program o nazwie "eGit", który ma GUI, który powie ci bieżącą gałąź dla wszystkich repozytoriów w niej. W przeciwnym razie, nie wiem ... byłbyś na łasce twórcy jakiejkolwiek wtyczki, którą chciałbyś użyć, która jest zgodna z twoim wyborem programu (jeśli są jakieś). - roberttdev
git branch | grep \* aby zwrócić tylko bieżącą gałąź (ale wciąż z gwiazdą przed nią) - fboes
git branch | grep \* | cut -d ' ' -f2 rozdzielać przestrzeń po gwiazdce, zwracając tylko imię. Na podstawie komentarza @fboes - jgraup
git branch | grep \* | cut -d ' ' -f2- - Sugerowałbym niewielką zmianę w komentarzu @ jgraup (zastąp -f2 z -f2-), aby uzyskać wszystko po 1 spacji, ponieważ w przypadku * (HEAD detached at ff3de3c) dostajesz (HEAD tylko - boobiq
BTW: git rev-parse --abbrev-ref HEAD (jak wspomniano poniżej) działa bez żadnych dalszych czynności i zwraca bieżącą nazwę oddziału bez sed lub grep - fboes


git rev-parse --abbrev-ref HEAD --

To wyświetli bieżącą gałąź.

Odniesienie:


3643
2017-08-27 12:33



@ChrisNelson, ponieważ wyświetla tylko bieżącą gałąź, a nie długą listę wszystkich gałęzi. - avakar
Dobrze, niestety nie działa, jeśli jesteś w stanie "odłączony HEAD" (po prostu wydaje "HEAD", co jest całkowicie bezużyteczne). - Carlos Campderrós
Domyślam się, że git, jeśli jesteś w stanie "odłączonym HEAD", nie ma śledzenia gałęzi, do której należy, ponieważ git branch przedstawia * (no branch), który jest również bezużyteczny ... - Carlos Campderrós
"git symbolic-ref --short HEAD" działa również w tym samym celu - dusktreader
git rev-parse --abbrev-ref HEAD 2>/dev/null  Część / dev / null zapobiega wyświetlaniu błędu, jeśli właśnie utworzono nowe repozytorium, które jeszcze nie ma HEAD. - Paradiesstaub


Ty też masz git symbolic-ref HEAD który wyświetla pełny refspec.

Aby wyświetlić tylko nazwę oddziału w Git v1.8 i później (dziękuję Gregowi za wskazanie tego):

$ git symbolic-ref --short HEAD

W Git v1.7 + możesz także:

$ git rev-parse --abbrev-ref HEAD

Oba powinny nadać tę samą nazwę oddziału, jeśli jesteś w oddziale. Jeśli jesteś na oderwanej głowie, odpowiedzi są różne.

Uwaga:

Na wcześniejszym kliencie wygląda to tak:

$ git symbolic-ref HEAD | sed -e "s/^refs\/heads\///"

- Darien 26. mar 2014


399
2017-08-08 15:55



Jak wszystkie inne odpowiedzi, to nie działa, gdy jesteś w stanie "odłączonego HEAD" - Carlos Campderrós
@ CarlosCampderrós: ​​jeśli jesteś w stanie oddzielenia HEAD, nie ma czegoś takiego jak obecna gałąź. W końcu zatwierdzenie, w którym się znajdujesz, może być osiągalne przez zero, jedną lub więcej gałęzi. - Flimm
powoduje to problemy w pustych repozytoriach git, gdy nie ma HEAD - Arne
Z wersją git 2.4.4 git rev-parse --abbrev-ref HEAD przedstawia HEAD kiedy jesteś na odłączonej głowie. - peterhil
Najlepsza odpowiedź jest nadal git symbolic-ref HEAD | sed -e "s/^refs\/heads\///"  ponieważ wyświetli ciąg znaków takich jak HEAD detached at a63917f będąc w stanie odłączonym, w przeciwieństwie do innych odpowiedzi, które pokazują albo nic, albo HEAD. To jest ważne. - Alkaline


Dla własnego odniesienia (ale może być użyteczne dla innych) zrobiłem przegląd większości (podstawowych poleceń) technik wymienionych w tym wątku, każdy zastosowany do kilku przypadków użycia: HEAD jest (wskazując na):

  • oddział lokalny (master)
  • zdalna gałąź śledzenia, zsynchronizowana z lokalną gałęzią (origin / master z tym samym commitem co master)
  • zdalna gałąź śledząca, niezsynchronizowana z lokalnym oddziałem (origin / feature-foo)
  • tag (v1.2.3)
  • Ogólna odłączona głowica (żadna z powyższych)

Wyniki:

  • git branch | sed -n '/\* /s///p'
    • oddział lokalny: master
    • zdalna gałąź śledzenia (w synchronizacji): (detached from origin/master)
    • zdalna gałąź śledzenia (nie zsynchronizowana): (detached from origin/feature-foo)
    • etykietka: (detached from v1.2.3)
    • Ogólna odłączona głowica: (detached from 285f294)
  • git status | head -1
    • oddział lokalny: # On branch master
    • zdalna gałąź śledzenia (w synchronizacji): # HEAD detached at origin/master
    • zdalna gałąź śledzenia (nie zsynchronizowana): # HEAD detached at origin/feature-foo
    • etykietka: # HEAD detached at v1.2.3
    • Ogólna odłączona głowica: # HEAD detached at 285f294
  • git describe --all
    • oddział lokalny: heads/master
    • zdalna gałąź śledzenia (w synchronizacji): heads/master (Uwaga: nie  remotes/origin/master)
    • zdalna gałąź śledzenia (nie zsynchronizowana): remotes/origin/feature-foo
    • etykietka: v1.2.3
    • Ogólna odłączona głowica: v1.0.6-5-g2393761
  • cat .git/HEAD:
    • oddział lokalny: ref: refs/heads/master
    • wszystkie inne przypadki użycia: SHA odpowiedniego zatwierdzenia
  • git rev-parse --abbrev-ref HEAD
    • oddział lokalny: master
    • wszystkie inne przypadki użycia: HEAD
  • git symbolic-ref --short HEAD
    • oddział lokalny: master
    • wszystkie inne przypadki użycia: fatal: ref HEAD is not a symbolic ref

(FYI zostało to zrobione z git w wersji 1.8.3.1)


168
2017-10-25 08:53



Podsumowując, nikt nie wydaje się robić tego, co bym zrobił ręcznie. - bukzor
To było dla mnie bardzo pomocne: git describe --all --exact-match 2>/dev/null | sed 's=.*/==' było dla mnie najlepszym rozwiązaniem (dobre nazwy dla tagów i głowic gałęzi, brak danych dla losowych odłączonych głowic. - Alex Dupuy
Jednak właśnie odkryłem, że za pomocą git describe ma poważne awarie, gdy istnieje wiele gałęzi odwołujących się do tego samego zatwierdzenia, np. zaraz po git checkout -b foo - używa jednego z nich arbitralnie (wydaje się być może ostatnio utworzony). Zmienię swoją strategię, aby używać filtrowanego wyjścia z git branch i używaj tylko git describe jeśli wynik jest związany z odłączoną głową. - Alex Dupuy
Właściwie muszę użyć git branch --no-color aby upewnić się, że nazwa pliku jest wolna od irytujących kodów ucieczki terminala. - Alex Dupuy
To bardzo mi pomogło nieraz, dzięki za bycie tak dokładnym! - Alice Purcell


Jeszcze jedna alternatywa:

git name-rev --name-only HEAD

118
2017-11-02 19:17



można go również odzyskać echo ${$(git symbolic-ref --quiet HEAD)#refs/heads/} - Antoine
Nie działa, jeśli HEAD jest taki sam dla gałęzi master i feature (np. Podczas scalania). Zwraca "master", nawet jeśli jest wykonywany w gałęzi funkcji. - Orest Hera
git checkout master && git name-rev --name-only HEAD # ac-187 To nie działa zgodnie z oczekiwaniami - Alexander Abashkin
Zapisuję to w zmiennej tuż przed połączeniem, a także w przypadkach, gdy mój HEAD może zostać zdekodowany, jeśli dokonam kasacji określonego zatwierdzenia. W takim przypadku to działa dobrze. - Ishaan Sejwal
Robię to z rurociągu Jenkinsa. To wydaje się być na razie najlepszą odpowiedzią dla mnie. Robić git branch --list właśnie mówi * (HEAD detached at 7127db5). Robić git rev-parse --abbrev-ref HEAD właśnie mówi HEAD i tak dalej. - Mig82


Bardzo proste, dostałem go w jednej liniowej (bash)

git branch | sed -n '/\* /s///p'

(kredyt: ograniczone odkupienie)

A gdy tam jestem, jeden liniowiec, aby uzyskać oddział śledzenia zdalnego (jeśli istnieje)

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

87
2018-04-04 15:20



Zbyt wiele ukośników! :) sed -n 's/\* //p' Zrób sztuczkę. Chociaż mam skłonność do paranoików, więc chciałbym to zakotwiczyć sed -n 's/^\* //p'. - Mark Reed


Możesz po prostu wpisać wiersz poleceń (konsola) w systemie Linux, w katalogu repozytorium:

$ git status

i zobaczysz trochę tekstu, między innymi coś podobnego do:

...
On branch master
...

co oznacza, że ​​jesteś obecnie włączony master gałąź. Jeśli edytujesz dowolny plik w tym momencie i znajduje się on w tym samym lokalnym repozytorium (lokalnym katalogu zawierającym pliki, które są w zarządzaniu kontrolą wersji Git), edytujesz plik w tej gałęzi.


49
2018-06-05 20:31



Na podstawie tego, co chcesz zrobić, możesz użyć git status i dostajemy tylko pierwszy wiersz wyjścia git status | head -1 co daje coś w stylu # On branch master. Jestem pewien, że różnice między wersjami również będą musiały zostać uwzględnione. - Joshua Pinter
@JoshPinter: Możesz również użyć git status | grep 'On branch', które powinno mieć ten sam efekt (powinno, nie znaczy, że będzie, jeśli twoja wersja Gita wyświetla to inaczej). Lub git branch | grep '*', która pokaże nazwę oddziału z gwiazdką na początku. - Tadeck
Tak, to działa równie dobrze i może być bardziej elastyczne. Mój końcowy wynik pokazujący nazwę oddziału w aplikacji dev Rails to: <tick>git status | head -1<tick>.gsub('# On branch ', '') - Joshua Pinter
git status może zająć dużo czasu, aby zwrócić wartość, jeśli zarządzanych jest wiele plików. - the Tin Man


git symbolic-ref -q --short HEAD

Używam tego w skryptach, które wymagają aktualnej nazwy oddziału. Pokaże ci bieżące krótkie symboliczne odniesienie do HEAD, które będzie twoją bieżącą nazwą oddziału.


26
2017-10-02 22:09



Dzięki, działa świetnie! - Dodam także do tego skryptu "-C path_to_folder". - Tony


git branch | grep -e "^*" | cut -d' ' -f 2

wyświetli tylko nazwę oddziału


24
2018-06-14 13:08



Jeśli twój oddział pokazuje coś takiego jak "* (HEAD odłączone na SUM_BRANCH_01)", spróbuj tego "git branch | grep -e" ^ * "| cut-d '' -f 5 | cut-d ')" -f 1 " - Dylan Kapp
Właśnie stworzyłem ten sam skrypt, aby uzyskać aktualną nazwę oddziału. Pomyślałem, że może pomóc w różnicach. - tggagne