Pokaż tylko bieżący oddział w Git


356

Próbowałem poszukać specjalnego polecenia Git, ale nie mogłem go znaleźć. Czy jest coś krótszego lub szybszego niż poniższe?

git branch | awk '/\*/ { print $2; }'

1
myślę, że to najszybszy możliwy sposób na zdobycie obecnego oddziału
Eimantas,


@ChandrayyaGK: Nie, ponieważ drugie pytanie dotyczy robienia tego z poziomu IDE. (Wiele odpowiedzi dotyczy użycia wiersza polecenia, więc warto to sprawdzić, ale nie jest to właściwy duplikat, a odpowiedzi te powinny być prawdopodobnie migrowane tutaj, jeśli są jakieś, które wnoszą znaczącą wartość do tego, co już jest.)
tripleee

3
@Torek - oto kolejne proste zadanie utrudnione przez Git.
jww

Najlepsza odpowiedź na opublikowany link @ChandrayyaGK jest znacznie wolniejsza!
Colm Bhandal

Odpowiedzi:


659
$ git rev-parse --abbrev-ref HEAD
master

Powinno to działać z Git 1.6.3 lub nowszym.


Dla mnie też nie działa z git-1.6.2.5. git rev-parse --abbrev-ref HEAD => --abbrev-ref 311172491a9a667f9321bdf1c4fe5e22cc6e2c08 (tj. rev-parse nie akceptuje --abbrev-ref (również na stronie
podręcznika

1
JasonWoof, działa dla mnie w 1.6.4.2, muszę zmienić dziennik, aby zobaczyć, kiedy dokładnie to się stało ;-)
Michael Krelin - haker

7
O ile wiem z dzienników Git, ta funkcja została połączona w 2009-04-20 i została wydana wraz z wersją 1.6.3.
hrabia

1
Też bardzo chciałbym to zrozumieć. Jak to właściwie działa? Wygląda też na to, że --abbrev-ref nie zwraca niczego dla żadnego innego argumentu. Nie może po prostu mieć HEAD jako argumentu.
Setafire,

6
Należy pamiętać, że jeśli jesteś w domku jednorodzinnym odniesienia symbolicznego (środkiem może, że jesteś w oddziale, ale wyrejestrowany poprzednie popełnić), to polecenie tylko wróci HEAD, nie oczekujemaster
unifreak

129

W Git 1.8.1 możesz użyć polecenia git symbolic-ref z opcją „--short”:

$ git symbolic-ref HEAD
refs/heads/develop
$ git symbolic-ref --short HEAD
develop

Dzięki. Utworzono alias.
Michael Burr

7
Lepsza niż zaakceptowana odpowiedź IMO, ponieważ działa na repo bez zobowiązań
Jerome Dalbert

2
fatal: ref HEAD is not a symbolic refWystępuje błąd podczas uruchamiania tego w ramach kompilacji
TravisCI

wydaje się nie działać w GIT 1.9.1 `` fat git wersja 1.9.1 fatal: ref HEAD nie jest symbolicznym ref ''
Richard

Działa dla mnie: git wersja 2.16.2.windows.1
Tagc

59

Z Git 2.22 (Q2 2019), trzeba będzie prostsze podejście: git branch --show-current.

Zobacz commit 0ecb1fc (25 października 2018) autor: Daniels Umanovskis ( umanovskis) .
(Połączone przez Junio ​​C Hamano - gitster- w commit 3710f60 , 07 marca 2019)

branch: --show-currentwprowadź opcję wyświetlania

Po wywołaniu za pomocą --show-current, git branchwydrukuje bieżącą nazwę oddziału i zakończy działanie.
Drukowane jest tylko rzeczywiste imię, bez refs/heads.
W stanie odłączonym HEAD nic nie jest wyprowadzane.

Przeznaczony zarówno do skryptów, jak i do interaktywnego / informacyjnego użytku.
W przeciwieństwie do tego git branch --list, aby uzyskać nazwę oddziału, nie jest wymagane filtrowanie.


15
Wreszcie, co wydaje się, że powinno być tam od samego początku, zostało dodane!
dtasev

27

Możesz być zainteresowany produkcją

git symbolic-ref HEAD

W szczególności, w zależności od potrzeb i układu, które możesz chcieć zrobić

basename $(git symbolic-ref HEAD)

lub

git symbolic-ref HEAD | cut -d/ -f3-

i znowu jest .git/HEADplik, który może Cię również zainteresować.


2
Możesz skrócić git rev-parse --symbolic-full-namedo git symbolic-ref.
hrabia

1
Nie musisz używać basenamelub cut; use BR=${BR#refs/heads/}(gdzie BR jest nazwą zmiennej, z której zapisałeś dane wyjściowe git symbolic-ref HEAD).
Jakub Narębski,

Jakub, oczywiście, że nie, pod warunkiem, że masz wynik w zmiennej.
Michael Krelin - haker

5
można git symbolic-ref --short HEADteż zrobić
Fahad Siddiqui

2
To się zepsuje, jeśli w nazwach gałęzi występują ukośniki („task / foo”, „feature / bar”). Kilka moich skryptów startowych zaczęło zawieść, gdy koledzy zdecydowali, że cięcia są fajne ...
vacri

13

Z tego, co mogę powiedzieć, nie ma sposobu, aby natywnie pokazać tylko bieżącą gałąź w Git, więc używałem:

git branch | grep '*'

3
Chociaż działa to z rdzeniami GNU, grep '*'jest nominalnie błędem składni. Prawdopodobnie i git branch | sed -n 's/^\* //p'tak chcesz . A właściwie to, co opublikował PO, co oznacza to samo.
tripleee

@tripleee, czy możesz mi wyjaśnić, dlaczego grep '*'nominalnie jest to błąd składniowy?
JK ABC,

1
@JKABC: co @tripleee miał na myśli, '*'to wyrażenie regularne i jako takie jest nieprawidłowe. Prawdopodobnie chcesz użyć '[*]'(czyli znak *zamiast operatora „zero lub więcej razy”).
johndodo

2
@ johndodo dziękuję za wyjaśnienie, ma to dla mnie sens teraz. Zazwyczaj robię to przezgrep '\*'
JK ABC

2
może wyciąć tylko nazwę oddziału za pomocągit branch | grep "*" | cut -d' ' -f2
Fahad Siddiqui

6

Myślę, że powinno to być szybkie i może być używane z API Pythona:

git branch --contains HEAD
* master

4
To nie wyświetla aktualnej gałęzi. Wyświetla listę rozgałęzień, które akurat wskazują punkt zatwierdzenia HEAD. I tak, może się nakładać, ale może to prowadzić do nieporozumień. Utwórz nowy oddział, z którego jesteś, i ponów próbę: dwa oddziały. Pytanie dotyczy „ tylko bieżącej gałęzi ”.
RomainValeri

4

używam

/etc/bash_completion.d/git

Przyszedł z Git i zawiera monit z nazwą gałęzi i uzupełnieniem argumentów.


Jak można aktywować ten monit?
Alex

W Ubuntu $ source /etc//bash_completion.d/git-prompt nazwa pliku może być różna w różnych systemach. (Uwaga: sourcesłowo kluczowe jest takie samo jak po prostu .(kropka) w bash.)
Michael

1

Nie jest to krótsze, ale dotyczy również odłączonych gałęzi:

git branch | awk -v FS=' ' '/\*/{print $NF}' | sed 's|[()]||g'

1

Dla pełności, echo $(__git_ps1) przynajmniej w Linuksie, powinien podać nazwę bieżącej gałęzi otoczoną nawiasami.

Może to być przydatne w niektórych scenariuszach, ponieważ nie jest to polecenie Git (w zależności od Git), w szczególności do skonfigurowania wiersza polecenia Bash do wyświetlania bieżącej gałęzi .

Na przykład:

/mnt/c/git/ConsoleApp1 (test-branch)> echo $(__git_ps1)
(test-branch)
/mnt/c/git/ConsoleApp1 (test-branch)> git checkout master
Switched to branch 'master'
/mnt/c/git/ConsoleApp1 (master)> echo $(__git_ps1)
(master)
/mnt/c/git/ConsoleApp1 (master)> cd ..
/mnt/c/git> echo $(__git_ps1)

/mnt/c/git>

pozycja jest aliasem i powinna być obecna dla interaktywnych skryptów powłoki. prawdopodobnie nie ma go w żadnym rodzaju skryptów.
Alexander Stohr

0

Ktoś może uznać to ( ) za pomocne. Bieżąca gałąź jest oznaczona *.git show-branch --current

host-78-65-229-191:idp-mobileid user-1$ git show-branch --current
! [CICD-1283-pipeline-in-shared-libraries] feat(CICD-1283): Use latest version of custom release plugin.
 * [master] Merge pull request #12 in CORES/idp-mobileid from feature/fix-schema-name to master
--
+  [CICD-1283-pipeline-in-shared-libraries] feat(CICD-1283): Use latest version of custom release plugin.
+  [CICD-1283-pipeline-in-shared-libraries^] feat(CICD-1283): Used the renamed AWS pipeline.
+  [CICD-1283-pipeline-in-shared-libraries~2] feat(CICD-1283): Point to feature branches of shared libraries.
-- [master] Merge pull request #12 in CORES/idp-mobileid from feature/fix-schema-name to master
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.