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; }'
Ollie Saunders
źródło
1
myślę, że to najszybszy możliwy sposób na zdobycie obecnego oddziału
Eimantas,
2
możliwy duplikat Jak uzyskać aktualną nazwę oddziału w Git?
Chandrayya GK
@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.

hrabia
źródło
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
dieresys
źródło
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.

VonC
źródło
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ć.

Michael Krelin - haker
źródło
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 '*'
Theruss
źródło
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
urvish
źródło
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.

iny
źródło
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'
arn0n
źródło
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>
tymtam
źródło
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
Antagonista Kaliyug
źródło