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


2591

Pochodzę z Subversion i kiedy miałem gałąź, wiedziałem nad czym pracuję z „Te pliki robocze wskazują na tę gałąź”.

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

W gitbash nie ma problemu , mówi mi to, co robię.


11
Pozwól, aby IDE wyświetliło plik .git/HEAD, prawdopodobnie w katalogu nadrzędnym
Tino

101
stackoverflow.com/questions/1417957/… $ git rev-parse --abbrev-ref HEAD
fantastory



9
Z Git 2.22 (Q2 2019), trzeba będzie prostsze podejście: git branch --show-current. Zobacz moją odpowiedź tutaj .
VC

Odpowiedzi:


2301
git branch

powinien pokazać wszystkie lokalne oddziały Twojego repozytorium. Oddział oznaczony gwiazdką to Twój obecny oddział.

Jeśli chcesz odzyskać tylko nazwę oddziału, w którym jesteś, możesz:

git rev-parse --abbrev-ref HEAD

Ale to nie pomaga mi w Notepad ++ i Netbeans. Po prostu git bash (i Probobly Vim) i wspomniałem o tym. Pracuję z innymi edytorami Ide i edytorami tekstu, które nie są wierszem poleceń.
mike628,

@ mike628 W rzeczywistości pomagają ci, z wyjątkiem tego, że chcesz czegoś dostępnego poprzez GUI. Poprawny?
Tadeck

2
Jeśli chcesz pracować w Eclipse, istnieje program o nazwie „eGit”, który ma GUI, który poinformuje cię o bieżącej gałęzi dla wszystkich repozytoriów w nim zawartych. W przeciwnym razie nie wiem ... byłbyś na łasce twórcy jakiejkolwiek wtyczki, której chcesz użyć, która jest zgodna z twoim wyborem programu (jeśli taki istnieje).
roberttdev

2
po wykonaniu git checkout --orphan foowtedy git branchnie udało się wyświetlić gałęzi foo. Podczas gdy git symbolic-ref HEADjak sugerowano, zadziałała inna odpowiedź.
Marcus Junius Brutus,

2
w dół, chcemy tylko bieżący oddział jako stdout, nie wszystkie gałęzie
Alexander Mills,

4656

Aby wyświetlić bieżącą gałąź, w której się znajdujesz, bez innych gałęzi na liście, możesz wykonać następujące czynności:

git rev-parse --abbrev-ref HEAD

Odniesienie:


132
@ChrisNelson, ponieważ wyświetla tylko bieżącą gałąź, a nie długą listę wszystkich gałęzi.
avakar

73
Dobry, niestety nie działa, jeśli jesteś w stanie „odłączonej HEAD” (po prostu wyprowadza „HEAD”, co jest całkowicie bezużyteczne).
Carlos Campderrós

34
Sądzę, że po wewnętrznej stronie gita, jeśli jesteś w stanie „odłączonej HEAD”, nie ma śledzenia gałęzi, do której należy, ponieważ git branchpokazuje * (no branch), co jest również bezużyteczne ...
Carlos Campderrós 30.01.2013

76
„git symbolic-ref --short HEAD” działa również w tym samym celu
dusktreader

22
git rev-parse --abbrev-ref HEAD 2>/dev/null Część / dev / null zapobiega wyświetleniu błędu, jeśli właśnie utworzono nowe repozytorium, które nie ma jeszcze HEAD.
Paradiesstaub

523

Masz również, git symbolic-ref HEADktóry wyświetla pełny refspec.

Aby wyświetlić tylko nazwę oddziału w Git v1.8 i nowszych (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 podać tę samą nazwę oddziału, jeśli jesteś w oddziale. Jeśli masz odłączoną głowę, odpowiedzi mogą się różnić.

Uwaga:

W przypadku wcześniejszego klienta wydaje się to działać:

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

- Darien 26. mar 2014


7
Jak wszystkie inne odpowiedzi, to nie działa, gdy jesteś w stanie „odłączonej HEAD”
Carlos Campderrós

51
@ CarlosCampderrós: ​​jeśli jesteś w stanie odłączonym HEAD, nie ma czegoś takiego jak bieżąca gałąź. W końcu zatwierdzenie, w którym jesteś, może być osiągalne przez zero, jedną lub więcej gałęzi.
Flimm

2
powoduje to problemy w pustych repozytoriach git, gdy nie ma HEAD
Arne

8
W wersji git 2.4.4 git rev-parse --abbrev-ref HEADpokazuje, HEADkiedy jesteś na głowie.
peterhil

Najlepsza odpowiedź jest nadal, git symbolic-ref HEAD | sed -e "s/^refs\/heads\///" ponieważ wyświetli ciąg znaków jak HEAD detached at a63917fw stanie odłączonym, w przeciwieństwie do innych odpowiedzi, które nie pokazują nic lub HEAD. To jest ważne.
Bernard,

264

Dla własnego odniesienia (ale może być użyteczne dla innych) dokonałem przeglądu większości (podstawowych linii poleceń) technik wymienionych w tym wątku, z których każda dotyczy kilku przypadków użycia: HEAD jest (wskazując na):

  • oddział lokalny (master)
  • zdalna gałąź śledzenia, zsynchronizowana z gałęzią lokalną (origin / master w tym samym zatwierdzeniu co master)
  • gałąź zdalnego śledzenia, niezsynchronizowana z gałęzią lokalną (origin / feature-foo)
  • tag (v1.2.3)
  • submodule (uruchom w katalogu submodule)
  • ogólna odłączona głowa (żadna z powyższych)

Wyniki:

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

(FYI dokonano tego w wersji git 1.8.3.1)


6
Podsumowując, wydaje się, że nikt nie robi tego, co robiłbym ręcznie.
bukzor

6
Było to 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łówek gałęzi, brak wyjścia dla losowo odłączonych głów.
Alex Dupuy

1
Jednak właśnie odkryłem, że użycie git describema poważną wadę, gdy istnieje wiele gałęzi odwołujących się do tego samego zatwierdzenia, np. Zaraz po git checkout -b foonim - używa jednej z nich arbitralnie (wydaje się, że być może najnowszą). Zmienię strategię, aby używać filtrowanych danych wyjściowych git branchi używaj tylko git describewtedy, gdy wynikiem jest coś z odłączoną głową.
Alex Dupuy,

Właściwie muszę git branch --no-colorsię upewnić, że nazwa pliku jest wolna od irytujących kodów ucieczki terminala.
Alex Dupuy,

2
To bardzo mi pomogło więcej niż raz, dzięki za tak dokładne podejście!
Alice Purcell,

153

Od wersji 2.22 git można po prostu użyć:

git branch --show-current

Według strony podręcznika:

Wydrukuj nazwę bieżącego oddziału. W stanie odłączonym HEAD nic nie jest drukowane.


2
Tak, mówiłem, że w marcu w komentarzach tej stronie: stackoverflow.com/questions/6245570/... . Oraz w stackoverflow.com/a/55088865/6309 .
VonC

5
Przynajmniej wspomnij, że to nie działa w stanie odłączonym HEAD. Właśnie straciłem godziny, żeby git 2.22 skompilował się za darmo ...
David Deprost,

136

Jeszcze jedna alternatywa:

git name-rev --name-only HEAD

można go również odzyskać za pomocąecho ${$(git symbolic-ref --quiet HEAD)#refs/heads/}
Antoine

12
Nie działa, jeśli HEAD jest taki sam dla gałęzi master i feature (np. Podczas łączenia). Zwraca „master”, nawet jeśli jest wykonywane w gałęzi funkcji.
Orest Hera,

1
git checkout master && git name-rev --name-only HEAD # ac-187Nie działa zgodnie z oczekiwaniami
Alexander Abashkin

Zapisuję to w zmiennej tuż przed scaleniem, a także w przypadkach, gdy mój HEAD może zostać odłączony, jeśli kasuję określone zatwierdzenie. W takim przypadku działa to dobrze.
Ishaan Sejwal

4
Robię to z rurociągu Jenkinsa. Wydaje się, że na razie jest to najlepsza odpowiedź dla mnie. Robienie git branch --listtylko mówi * (HEAD detached at 7127db5). Robienie git rev-parse --abbrev-ref HEADtylko mówi HEADi tak dalej.
Mig82,

91

Cóż, dość proste, mam to w jednej wkładce (bash)

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

(kredyt: Ograniczone Zadośćuczynienie)

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

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

8
Za dużo cięć! :) sed -n 's/\* //p'załatwia sprawę. Chociaż dążę do paranoi, więc zakotwiczę ją sed -n 's/^\* //p'.
Mark Reed,

64

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

$ git status

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

...
On branch master
...

co oznacza, że ​​jesteś obecnie w masteroddziale. Jeśli w tym momencie edytujesz dowolny plik, który znajduje się w tym samym lokalnym repozytorium (lokalny katalog zawierający pliki objęte zarządzaniem kontrolą wersji Git), edytujesz plik w tej gałęzi.


2
Na podstawie tego, co chcesz zrobić, możesz użyć git statusi uzyskać tylko pierwszy wiersz danych wyjściowych, z git status | head -1którym daje coś podobnego # On branch master. Jestem pewien, że różnice w wersjach również będą musiały zostać uwzględnione.
Joshua Pinter,

@JoshPinter: Możesz także użyć git status | grep 'On branch', co powinno mieć ten sam efekt (powinien, nie znaczy, że będzie, jeśli Twoja wersja Git wyświetla go inaczej). Lub git branch | grep '*', która pokaże nazwę gałęzi z gwiazdą na początku.
Tadeck

Tak, to również działa i może być bardziej elastyczne. Mój końcowy wynik za wyświetlenie tylko nazwy oddziału w aplikacji dla deweloperów Rails to:<tick>git status | head -1<tick>.gsub('# On branch ', '')
Joshua Pinter

1
git statuszwracanie wartości może zająć dużo czasu, jeśli zarządzanych jest wiele plików.
Tin Man

Tak, jeśli chcesz wydrukować gałąź na stronie internetowej, na przykład git statusmoże to zająć czas generowania całej strony.
Artem Russakovskii

36
git symbolic-ref -q --short HEAD

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


1
Dzięki, działa świetnie! - Do tego dodaję również „-C ścieżka_do_foldera” w moim skrypcie.
Tony,

1
To dobre rozwiązanie, ponieważ z opcją -q zwraca kod błędu w stanie „odłączonej HEAD”, ale nic nie drukuje na stderr.
hallidave

to jedyne rozwiązanie, które zadziałało dla mnie na świeżym repo bez żadnych zobowiązań
kundasaba

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

pokaże tylko nazwę oddziału


Jeśli twoja gałąź pokazuje coś takiego „* (HEAD odłączony na SUM_BRANCH_01)”, spróbuj tego „git branch | grep -e" ^ * "| cut -d '' -f 5 | cut -d ')' -f 1 „
Dylan Kapp,

Właśnie utworzyłem ten sam skrypt, aby uzyskać bieżącą nazwę oddziału. Pomyślałem, że może to pomóc w różnicach.
tggagne

25

git branch pokaż tylko bieżącą nazwę oddziału.

Podczas gdy gałąź git wyświetli wszystkie gałęzie i podświetli obecną gwiazdkę, może być zbyt kłopotliwa podczas pracy z wieloma gałęziami.

Aby wyświetlić tylko gałąź, w której aktualnie jesteś, użyj:

git rev-parse --abbrev-ref HEAD

to jest świetne dla ci i innych narzędzi do budowania!
phouse512,

najlepsza odpowiedź na użycie go w skrypcie
Ben Keil

1
@DylanNicholson git branch --containsczasami wymienia więcej niż jeden oddział.
Joe Chacko,

22

Znaleziono rozwiązanie wiersza polecenia o tej samej długości co Oliver Refalo , używając dobrego ol 'awk:

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

awkczyta to jako „zrób to w {}liniach pasujących do wyrażenia regularnego”. Domyślnie przyjmuje pola rozdzielane spacjami, więc drukujesz drugi. Jeśli możesz założyć, że tylko linia z twoim oddziałem ma *, możesz upuścić ^. Ach, bash golf!


19
#!/bin/bash
function git.branch {
  br=`git branch | grep "*"`
  echo ${br/* /}
}
git.branch

18

Dlaczego nie skorzystać z powłoki powłoki git, która poda nazwę bieżącej gałęzi? git statuspomaga również.


Jak git-prompt.sh z contrib/prawda (git wersja 2.3.0), jak określono w __git_ps1funkcji pomocnika:

  1. Po pierwsze, nie jest przypadkiem szczególnym, jeśli rebase jest wykrywany w toku. Git używa nienazwanej gałęzi (odłączonej HEAD) podczas procesu zmiany bazy, aby uczynić ją atomową, a oryginalna gałąź jest zapisywana gdzie indziej.

  2. Jeśli .git/HEADplik jest dowiązaniem symbolicznym (bardzo rzadki przypadek ze starożytnej historii Gita), używagit symbolic-ref HEAD 2>/dev/null

  3. W przeciwnym razie czyta .git/HEADplik. Kolejne kroki zależą od jego zawartości:

    • Jeśli ten plik nie istnieje, to nie ma bieżącej gałęzi. Zwykle dzieje się tak, gdy repozytorium jest puste.

    • Jeśli zaczyna się od 'ref: 'przedrostka, to .git/HEADjest symref (odniesienie symboliczne), a my jesteśmy na normalnej gałęzi. Usuń ten prefiks, aby uzyskać pełną nazwę, i usuń, refs/heads/aby uzyskać krótką nazwę bieżącego oddziału:

      b="${head#ref: }"
      # ...
      b=${b##refs/heads/}
      
    • Jeśli nie zaczyna się 'ref: ', to zostaje odłączony HEAD (anonimowa gałąź), wskazując bezpośrednio na pewne zatwierdzenie. Służy git describe ...do zapisywania bieżącego zatwierdzenia w formie czytelnej dla człowieka.

Mam nadzieję że to pomogło.


3
A jeśli opracowujesz podpowiedź powłoki dla gitów, której odpowiedzi tutaj powinieneś użyć? Żółwie do samego końca.
tripleee


4
Co do zapisu wydaje się działać, git describe --contains --all HEADczego obecnie nie widzę gdzie indziej na tej stronie. Jak zapewne wiesz, odpowiedzi typu link nie są zalecane w StackOverflow.
tripleee

2
@tripleee: Dodałem wyjaśnienie, jak to git-prompt.sh(aka __git_ps1) robi ...
Jakub Narębski

17

Mniej hałaśliwa wersja statusu git załatwi sprawę

git status -bsuno

Drukuje

## branch-name

1
## develop ... origin / develop
Kalpesh Soni

16

Przepraszam, to jest kolejna odpowiedź z wiersza poleceń, ale tego właśnie szukałem, kiedy znalazłem to pytanie i wiele z tych odpowiedzi było pomocnych. Moje rozwiązanie to następująca funkcja powłoki bash:

get_branch () {
    git rev-parse --abbrev-ref HEAD | grep -v HEAD || \
    git describe --exact-match HEAD 2> /dev/null || \
    git rev-parse HEAD
}

To zawsze powinno dać mi coś zarówno czytelnego dla człowieka, jak i bezpośredniego do wykorzystania jako argument git checkout.

  • w lokalnym oddziale: feature/HS-0001
  • na oznaczonym zatwierdzeniu (odłączony): v3.29.5
  • w zdalnej gałęzi (odłączony, nieoznaczony): SHA1
  • na każdym innym odłączonym zatwierdzeniu: SHA1

1
Dzięki za opublikowanie tego, żadna z pozostałych odpowiedzi nie wydawała się troszczyć o to, aby zawsze produkować coś użytecznego jako argument git checkout.
zwolnienie

15

możesz użyć git bash na komendzie katalogu roboczego w następujący sposób

git status -b

powie ci, na której gałęzi jesteś, jest wiele poleceń, które są użyteczne, niektóre z nich

-s

--short Podaj dane wyjściowe w krótkim formacie.

-b --branch Pokazuje informacje o oddziale i śledzeniu, nawet w krótkim formacie.

--porcelain [=] Podaj dane wyjściowe w łatwym do przeanalizowania formacie dla skryptów. Jest to podobne do krótkiego wyjścia, ale pozostanie stabilne w wersjach Git i niezależnie od konfiguracji użytkownika. Szczegóły poniżej.

Parametr wersji służy do określenia wersji formatu. Jest to opcjonalne i domyślnie jest w oryginalnym formacie v1.

--long Podaj dane wyjściowe w formacie długim. To jest domyślne.

-v --verbose Oprócz nazw plików, które zostały zmienione, pokazują także zmiany tekstowe, które są wprowadzane do zatwierdzenia (tj. jak dane wyjściowe git diff --cached). Jeśli parametr -v zostanie podany dwukrotnie, pokaż również zmiany w działającym drzewie, które nie zostały jeszcze przemieszczone (tj. Jak dane wyjściowe git diff).


14
git status 

poda także nazwę oddziału wraz ze zmianami.

na przykład

>git status
On branch master // <-- branch name here
.....

13

Z czasem możemy mieć naprawdę długą listę oddziałów.

Chociaż niektóre inne rozwiązania są świetne, oto co robię (uproszczone z odpowiedzi Jacoba):

git branch | grep \*

Teraz,

git status

działa, ale tylko w przypadku jakichkolwiek lokalnych zmian


13

Polecam użycie dowolnego z tych dwóch poleceń.

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

LUB

git status | sed -n 1p | cut -d' ' -f 3

LUB (więcej informacji)

git status -uno -bs| cut -d'#' -f 3 | cut -d . -f 1| sed -e 's/^[ \t]//1'| sed -n 1p


12

W Netbeans upewnij się, że adnotacje dotyczące wersji są włączone (Widok -> Pokaż etykiety wersji). Następnie możesz zobaczyć nazwę oddziału obok nazwy projektu.

http://netbeans.org/bugzilla/show_bug.cgi?id=213582


Po włączeniu adnotacji dotyczących wersji wystarczy najechać myszką na folder Projekt (lub Plik lub Ulubione), aby wyświetlić bieżącą gałąź.
idclaar

12

A co z tym?

{ git symbolic-ref HEAD 2> /dev/null || git rev-parse --short HEAD 2> /dev/null } | sed "s#refs/heads/##"

1
Znacznie lepsza odpowiedź, ponieważ dobrze radzi sobie z odłączoną obudową HEAD.
Pat

2
Wygląda na to, że powinieneś używać () a nie {} do zawijania poleceń git
Pat

@Pat Nie ma potrzeby tworzenia osobnej podpowłoki, tak jak zrobiłby to (). {} jest w porządku, z tym wyjątkiem, że musisz dodać; lub nowa linia przed}. W rzeczywistości możesz po prostu całkowicie zrezygnować z {}, chyba że będziesz musiał pogrupować polecenia.
aij

Czy symbolic-refczęść nie musi również --shortunikać prefiksu nazwy gałęzi refs/heads/?
rjp

11

Mam prosty skrypt o nazwie git-cbr( bieżąca gałąź ), który wypisuje nazwę bieżącej gałęzi.

#!/bin/bash

git branch | grep -e "^*"

Umieszczam ten skrypt w folderze niestandardowym ( ~/.bin). Folder jest w $PATH.

Więc teraz, gdy jestem w repozytorium git, po prostu piszę, git cbraby wydrukować bieżącą nazwę oddziału.

$ git cbr
* master

Działa to, ponieważ gitpolecenie przyjmuje swój pierwszy argument i próbuje uruchomić skrypt o nazwie git-arg1. Na przykład git branchpróbuje uruchomić skrypt o nazwie git-branchitp.


11

Możesz na stałe skonfigurować wyjście bash, aby wyświetlało swoją nazwę git-branch. Jest to bardzo przydatne, gdy pracujesz z różnymi gałęziami, bez potrzeby ciągłego pisania $ git status. Github repo git-świadom-monit .

Otwórz terminal (ctrl-alt-t) i wprowadź polecenia

mkdir ~/.bash
cd ~/.bash
git clone git://github.com/jimeh/git-aware-prompt.git

Edytuj .bashrc za pomocą sudo nano ~/.bashrcpolecenia (dla Ubuntu) i dodaj następujące na górze:

export GITAWAREPROMPT=~/.bash/git-aware-prompt
source "${GITAWAREPROMPT}/main.sh"

Następnie wklej kod

export PS1="\${debian_chroot:+(\$debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\] \[$txtcyn\]\$git_branch\[$txtred\]\$git_dirty\[$txtrst\]\$ "

na końcu tego samego pliku, do którego wcześniej wkleiłeś kod instalacyjny. To da Ci pokolorowane wyjście:wprowadź opis zdjęcia tutaj


10

Następujące polecenie powłoki informuje gałąź, w której aktualnie się znajdujesz.

git branch | grep ^\*

Jeśli nie chcesz wpisywać tego długiego polecenia za każdym razem, gdy chcesz poznać gałąź i używasz Bash, nadaj temu poleceniu krótki alias, na przykład alias cb.

alias cb='git branch | grep ^\*'

Gdy jesteś w oddziale głównym i pojawia się monit $, otrzymasz * masternastępujące informacje.

$ cb
* master

To nie daje odpowiedzi na pytanie. Aby skrytykować lub poprosić autora o wyjaśnienia, zostaw komentarz pod postem. - Z recenzji
Rashwan L

1
Dlaczego tak myślisz?
mrrusof

powinieneś skomentować i opisać swój post dla PO, w ten sposób łatwiej będzie zrozumieć Twój post.
Rashwan L

1
Ma sens.
mrrusof

1
jeśli używasz zsh, musisz zawrzeć wyrażenie grep w pojedynczych cudzysłowach:git branch | grep '^\*'
aaaarrgh

9

Zwraca nazwę gałęzi lub SHA1 po odłączeniu głowy:

git rev-parse --abbrev-ref HEAD | grep -v ^HEAD$ || git rev-parse HEAD

To jest krótka wersja odpowiedzi @ dmaestro12 i bez obsługi tagów.


8
lepiej:git symbolic-ref --quiet --short HEAD || git rev-parse --short HEAD
niebiesko

8

Jeśli naprawdę chcesz, aby ostatnia gałąź / tag została wypisana również w stanie odłączonym HEAD.

git reflog HEAD | grep 'checkout:' | head -1 | rev | cut -d' ' -f1 | rev

Aktualizacja Jest to przyjemniejsze, jeśli masz i nie boisz się awk.

git reflog HEAD | grep 'checkout:' | head -1 | awk '{print $NF}'

rev | cut -d' ' -f1| revmożna uprościćawk '{print $NF}'
Steve Buzonas

1
Chociaż nie jest to również niezawodne, ponieważ można sprawdzić konkretną wersję za pomocą skrótu, dzięki czemu dziennik po prostu pokazuje, checkout: moving from ba7571b7fc5b8f31b8d0625821269afaa655577e to f68be8cf7bea917a5a0562b619e50368de0068a9że nadal jest to przydatna sztuczka, która może pomóc w jednoznacznym rozwiązaniu niektórych przypadków.
Alex Dupuy

1
Dalej skróć dogit reflog | awk '$3=="checkout:" {print $NF; exit}'
jthill

6

Wiem, że jest późno, ale na Linuksie / Macu z terminala można użyć następujących.

git status | sed -n 1p

Wyjaśnienie:

git status -> pobiera status działającego drzewa
sed -n 1p -> pobiera pierwszą linię z treści statusu

Odpowiedź na powyższe polecenie będzie wyglądać następująco:

"On branch your_branch_name"

2
head -1zrobiłby to w zwykły sposób
bukzor

5

możesz również użyć zmiennej GIT_BRANCH, jak pokazano tutaj: https://wiki.jenkins-ci.org/display/JENKINS/Git+Plugin

Wtyczka git ustawia kilka zmiennych środowiskowych, których możesz używać w swoich skryptach:

GIT_COMMIT - SHA prądu

GIT_BRANCH - nazwa aktualnie używanego oddziału, np. „Master” lub „origin / foo”

GIT_PREVIOUS_COMMIT - SHA poprzedniej wbudowanej zmiany z tej samej gałęzi (bieżąca SHA przy pierwszej kompilacji w gałęzi)

GIT_URL - zdalny adres URL repozytorium

GIT_URL_N - Zdalne adresy URL repozytorium, gdy jest więcej niż 1 piloty, np. GIT_URL_1, GIT_URL_2

GIT_AUTHOR_EMAIL - Adres e-mail osoby odpowiedzialnej / autora

GIT_COMMITTER_EMAIL - Adres e-mail osoby odpowiedzialnej / autora


5

Dodaj go do PS1komputera Mac:

PS1='\W@\u >`[ -d .git ] && git branch | grep  ^*|cut -d" " -f2`> $ '

Przed uruchomieniem powyższego polecenia:

wprowadź opis zdjęcia tutaj

Po uruchomieniu tego polecenia:

wprowadź opis zdjęcia tutaj

Nie martw się, jeśli nie jest to repozytorium GIT, nie wyświetli błędu, z powodu [-d .git]którego sprawdza, czy .gitfolder istnieje, czy nie.

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.