Hoe krijg ik de huidige branchnaam in Git?

Ik heb een Subversion-achtergrond en toen ik een branch had, wist ik waar ik aan werkte met “Deze werkbestanden wijzen naar deze branch”.

Maar met Git weet ik niet zeker of ik een bestand aan het bewerken ben in NetBeans of Notepad++, of het aan de master of een andere branch is gekoppeld.

Er is geen probleem met gitin bash, het vertelt me wat ik aan het doen ben.


Antwoord 1, autoriteit 100%

git branch

zou alle lokale vestigingen van uw repo moeten tonen. De vertakking met ster is je huidige vertakking.

Als u alleen de naam van het filiaal wilt ophalen, kunt u het volgende doen:

git rev-parse --abbrev-ref HEAD

of met Git 2.22 en hoger:

git branch --show-current

Antwoord 2, autoriteit 92%

Als u de huidige vestiging waarin u zich bevindt wilt weergeven, zonder dat de andere vestigingen worden vermeld, kunt u het volgende doen:

git rev-parse --abbrev-ref HEAD

Referentie:


Antwoord 3, autoriteit 18%

Je hebt ook git symbolic-ref HEADdie de volledige refspec weergeeft.

Om alleen de branchnaam in Git v1.8 en later te tonen (met dank aan Greg voor het erop wijzen):

git symbolic-ref --short HEAD

Op Git v1.7+ kun je ook het volgende doen:

git rev-parse --abbrev-ref HEAD

Beide zouden dezelfde branchnaam moeten hebben als je in een branch zit. Als je een afstandelijk hoofd hebt, verschillen de antwoorden.

Opmerking:

Op een eerdere client lijkt dit te werken:

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

Darien 26. maart 2014


Antwoord 4, autoriteit 9%

Voor mijn eigen referentie (maar het kan nuttig zijn voor anderen) heb ik een overzicht gemaakt van de meeste (basisopdrachtregel) technieken die in deze thread worden genoemd, elk toegepast op verschillende gebruiksgevallen: HEAD is (wijzend naar):

  • lokale branch (master)
  • remote tracking branch, synchroon met lokale branch (oorsprong/master op dezelfde commit als master)
  • vertakking voor volgen op afstand, niet synchroon met een lokale vertakking (origin/feature-foo)
  • tag (v1.2.3)
  • submodule (wordt uitgevoerd in de submodule-directory)
  • algemeen vrijstaand hoofd (geen van bovenstaande)

Resultaten:

  • git branch | sed -n '/\* /s///p'
    • lokale tak: master
    • vertakking voor externe tracking (gesynchroniseerd): (detached from origin/master)
    • vertakking voor externe tracking (niet synchroon): (detached from origin/feature-foo)
    • tag: (detached from v1.2.3)
    • submodule: (HEAD detached at 285f294)
    • algemeen vrijstaand hoofd: (detached from 285f294)
  • git status | head -1
    • lokale vertakking: # On branch master
    • vertakking voor externe tracking (gesynchroniseerd): # HEAD detached at origin/master
    • vertakking voor volgen op afstand (niet synchroon): # HEAD detached at origin/feature-foo
    • tag: # HEAD detached at v1.2.3
    • submodule: # HEAD detached at 285f294
    • algemeen losgemaakt hoofd: # HEAD detached at 285f294
  • git describe --all
    • lokale tak: heads/master
    • remote tracking branch (synchroon): heads/master(opmerking: nietremotes/origin/master)
    • Remote Tracking Branch (niet in synchronisatie): remotes/origin/feature-foo
    • TAG: v1.2.3
    • Submodule: remotes/origin/HEAD
    • Algemeen Vrijstaand hoofd: v1.0.6-5-g2393761
  • cat .git/HEAD:
    • Lokale branche: ref: refs/heads/master
    • Submodule: cat: .git/HEAD: Not a directory
    • Alle andere gebruiksgevallen: SHA van de overeenkomstige commit
  • git rev-parse --abbrev-ref HEAD
    • Lokale branch: master
    • alle andere gebruiksgevallen: HEAD
  • git symbolic-ref --short HEAD
    • Lokale branch: master
    • Alle andere gebruiksgevallen: fatal: ref HEAD is not a symbolic ref

(FYI Dit is gedaan met GIT-versie 1.8.3.1)


Antwoord 5, Autoriteit 7%

Vanaf versie 2.22 van GIT kunt u gewoon gebruiken:

git branch --show-current

Per man-pagina:

Druk de naam van de huidige tak af. In de vrijstaande kopstaat wordt er niets afgedrukt.


Antwoord 6, Autoriteit 4%

Nog een ander alternatief:

git name-rev --name-only HEAD

Antwoord 7, Autoriteit 3%

Goed genoeg, ik heb het in een voering (bash)

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

(tegoed: beperkte verzoening)

En terwijl ik daar ben, de ene voering om de afstandsbediening (indien aanwezig)

te krijgen

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

Antwoord 8, Autoriteit 2%

U kunt gewoon in opdrachtregel (console) typen op Linux, in de repository-directory:

$ git status

en je zult wat tekst zien, waaronder iets dat lijkt op:

...
On branch master
...

wat betekent dat je momenteel in de masterbranch zit. Als je op dat moment een bestand aan het bewerken bent en het bevindt zich in dezelfde lokale repository (lokale map met de bestanden die onder Git versiebeheerbeheer vallen), dan ben je het bestand aan het bewerken in deze branch.


Antwoord 9

git symbolic-ref -q --short HEAD

Ik gebruik dit in scripts die de huidige branchnaam nodig hebben. Het zal je de huidige korte symbolische verwijzing naar HEAD tonen, wat je huidige filiaalnaam zal zijn.


Antwoord 10

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

geeft alleen de filiaalnaam weer


Antwoord 11

git branchlaat alleen de huidige branchnaam zien.

Hoewel git branch je alle branches laat zien en de huidige markeert met een asterisk, kan het te omslachtig zijn als je met veel branches werkt.

Om alleen het filiaal te tonen waar u zich momenteel bevindt, gebruikt u:

git rev-parse --abbrev-ref HEAD

Antwoord 12

Ik heb een opdrachtregeloplossing gevonden van dezelfde lengte als Oliver Refalo’s, met behulp van good ol’ awk:

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

awkleest dat als “doe de dingen in {}op regels die overeenkomen met de regex”. Standaard wordt uitgegaan van door witruimte gescheiden velden, dus u drukt de tweede af. Als je kunt aannemen dat alleen de regel met je branch de * heeft, kun je de ^ laten vallen. Ah, bash golf!


Antwoord 13

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

Antwoord 14

Waarom gebruik je geen git-aware shell-prompt, die je de naam van de huidige branch zou vertellen? git statushelpt ook.


Hoe git-prompt.shvan contrib/doet het (git versie 2.3.0), zoals gedefinieerd in __git_ps1helperfunctie:

  1. Ten eerste is er een speciaal geval als rebasein uitvoering wordt gedetecteerd. Git gebruikt een niet nader genoemde branch (detached HEAD) tijdens het rebase proces om het atomair te maken, en de originele branch wordt ergens anders opgeslagen.

  2. Als het .git/HEADbestand een symbolische link is (een zeer zeldzaam geval, uit de oude geschiedenis van Git), gebruikt het git symbolic-ref HEAD 2>/dev/null

  3. Anders wordt het bestand .git/HEADgelezen. De volgende stappen zijn afhankelijk van de inhoud:

    • Als dit bestand niet bestaat, is er geen huidige branch. Dit gebeurt meestal als de repository leeg is.

    • Als het begint met het voorvoegsel 'ref: ', dan is .git/HEADsymref (symbolische verwijzing), en zitten we op de normale tak. Verwijder dit voorvoegsel om de volledige naam te krijgen, en verwijder refs/heads/om de korte naam van de huidige tak te krijgen:

      b="${head#ref: }"
      # ...
      b=${b##refs/heads/}
      
    • Als het niet begint met 'ref: ', dan is het detached HEAD (anonieme branch), die direct naar een commit verwijst. Gebruik git describe ...om de huidige commit in voor mensen leesbare vorm te schrijven.

Ik hoop dat dat helpt.


Antwoord 15

Een minder luidruchtige versie voor git-status zou voldoende zijn

git status -bsuno

Het wordt afgedrukt

## branch-name

Antwoord 16

Sorry, dit is weer een antwoord via de opdrachtregel, maar daar was ik naar op zoek toen ik deze vraag vond en veel van deze antwoorden waren nuttig. Mijn oplossing is de volgende bash shell-functie:

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

Dit zou me altijd iets moeten geven dat zowel voor mensen leesbaar als direct bruikbaar is als argument voor git checkout.

  • op een lokaal filiaal: feature/HS-0001
  • op een getagde commit (losgemaakt): v3.29.5
  • op een externe tak (vrijstaand, niet getagd): SHA1
  • op elke andere losgemaakte commit: SHA1

Antwoord 17

je kunt git bash gebruiken in de werkmap
commando is als volgt

git status -b

het zal u vertellen op welk filiaal u zich bevindt
er zijn veel commando’s die nuttig zijn, sommige zijn

-s

–kort
Geef de uitvoer in het korte formaat.

-b
–tak
Toon de filiaal- en trackinginformatie, zelfs in kort formaat.

–porselein[=]
Geef de uitvoer in een gemakkelijk te ontleden formaat voor scripts. Dit is vergelijkbaar met de korte uitvoer, maar blijft stabiel in Git-versies en ongeacht de gebruikersconfiguratie. Zie hieronder voor details.

De versieparameter wordt gebruikt om de formaatversie op te geven. Dit is optioneel en standaard ingesteld op de oorspronkelijke versie v1-indeling.

–lang
Geef de uitvoer in het lange formaat. Dit is de standaardinstelling.

-v
–uitgebreid
Naast de namen van bestanden die zijn gewijzigd, tonen ook de tekstuele wijzigingen die worden geënsceneerd om te worden gepleegd (d.w.z., zoals de uitvoer van Git Diff-Cached). Als -V wordt twee keer gespecificeerd, toont dan ook de wijzigingen in de werkboom die nog niet zijn geënsceneerd (d.w.z., zoals de uitvoer van Git Diff).


Antwoord 18

In de loop van de tijd hebben we misschien een echt lange lijst met takken.

Hoewel sommige van de andere oplossingen geweldig zijn, is hier wat ik doe (vereenvoudigd van het antwoord van Jacob):

git branch | grep \*

Nu,

git status

Works, maar alleen als er lokale wijzigingen zijn


Antwoord 19

git status

geeft ook de filiaalnaam samen met wijzigingen.

b.g

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

Antwoord 20

Ik raad aan om een ​​van deze twee opdrachten te gebruiken.

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

of

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

of (meer uitgebreid)

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


Antwoord 21

Zorg ervoor dat de versiebehoefingen zijn ingeschakeld (weergave – & gt;
Labels). U kunt vervolgens de filiaalnaam naast de projectnaam zien.

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


Antwoord 22

Hoe zit het?

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

Antwoord 23

Ik heb een eenvoudig script genaamd git-cbr(Huidige tak ) die de huidige filiaalnaam afdrukken.

#!/bin/bash
git branch | grep -e "^*"

Ik heb dit script in een aangepaste map geplaatst (~/.bin). De map bevindt zich in $PATH.

Dus als ik me nu in een git repo bevindt, typ ik gewoon git cbrom de huidige branchnaam af te drukken.

$ git cbr
* master

Dit werkt omdat het gitcommando zijn eerste argument neemt en een script probeert uit te voeren met de naam git-arg1. Bijvoorbeeld, git branchprobeert een script uit te voeren met de naam git-branch, enz.


Antwoord 24

Het volgende shell-commando vertelt je de branch waarin je je momenteel bevindt.

git branch | grep ^\*

Als je niet elke keer dat lange commando wilt typen als je de branch wilt weten en je Bash gebruikt, geef het commando dan een korte alias, bijvoorbeeld alias cb, zoals zo.

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

Als je in branch master bent en je prompt is $, dan krijg je * masterals volgt.

$ cb
* master

Antwoord 25

Je kunt je bash-uitvoer permanent instellen om je git-branch-naam weer te geven. Het is erg handig als je met verschillende branches werkt, het is niet nodig om de hele tijd $ git statuste typen.
Github repo git-aware-prompt
.

Open je terminal (ctrl-alt-t) en voer de commando’s in

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

Bewerk je .bashrc met de opdracht sudo nano ~/.bashrc(voor Ubuntu) en voeg het volgende toe bovenaan:

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

Plak dan de code

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

aan het einde van hetzelfde bestand waarin u eerder de installatiecode hebt geplakt. Dit geeft je de gekleurde uitvoer:


Antwoord 26

Retourneert de naam van de filiaal of SHA1 wanneer op de losse kop:

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

Dit is een korte versie van het antwoord van @dmaestro12 en zonder tagondersteuning.


Antwoord 27

Als je echt wilt dat de laatste branch/tag ook wordt uitgecheckt in de vrijstaande HEAD-status.

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

Bijwerken
Dit is fijner als je awk hebt en er niet bang voor bent.

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

Antwoord 28

Ik weet dat dit laat is, maar op een linux/mac kun je vanaf de terminal het volgende gebruiken.

git status | sed -n 1p

Uitleg:

git-status -> krijgt de status van de werkende boom
sed -n 1p -> haalt de eerste regel uit de statustekst

De reactie op het bovenstaande commando ziet er als volgt uit:

"On branch your_branch_name"

Antwoord 29

Voeg het toe aan PS1met Mac :

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

Voordat u het bovenstaande commando uitvoert:

Na het uitvoeren van dat commando:

Maak je geen zorgen, als het geen GIT-repository is, zal het geen fout weergeven vanwege [-d .git]die controleert of de map .gitbestaat of niet.


Antwoord 30

als je in Jenkins draait, kun je de variabele GIT_BRANCH gebruiken zoals hier wordt weergegeven:
https://wiki.jenkins-ci.org/display/JENKINS/Git+ Plug-in

De git-plug-in stelt verschillende omgevingsvariabelen in die je in je scripts kunt gebruiken:

GIT_COMMIT – SHA van de huidige

GIT_BRANCH – Naam van de tak die momenteel wordt gebruikt, b.v. “master” of “origin/foo”

GIT_PREVIOUS_COMMIT – SHA van de vorige gebouwde commit van dezelfde branch (de huidige SHA op de eerste ingebouwde branch)

GIT_URL – Externe URL van opslagplaats

GIT_URL_N – Repository externe URL’s wanneer er meer dan 1 remotes zijn, b.v. GIT_URL_1, GIT_URL_2

GIT_AUTHOR_EMAIL – E-mail van de verantwoordelijke/auteur

GIT_COMMITTER_EMAIL – E-mail van de verantwoordelijke/auteur

Other episodes