web-dev-qa-db-fra.com

Comment obtenir le nom de la branche actuelle dans Git?

Je viens de Subversion et, quand j'avais une branche, je savais sur quoi je travaillais avec "Ces fichiers de travail pointent vers cette branche".

Mais avec Git, je ne suis pas sûr d’éditer un fichier dans NetBeans ou Notepad ++, qu’il soit lié au maître ou à une autre branche.

Il n'y a aucun problème avec git dans bash, cela me dit ce que je fais.

1927
mike628
git branch

devrait montrer toutes les branches locales de votre repo. La branche étoilée est votre branche actuelle.

Si vous voulez récupérer uniquement le nom de la branche sur laquelle vous vous trouvez, vous pouvez faire:

git branch | grep \* | cut -d ' ' -f2
1530
roberttdev

Pour afficher la branche en cours sur laquelle vous vous trouvez, sans les autres branches répertoriées, vous pouvez procéder comme suit:

git rev-parse --abbrev-ref HEAD

Référence:

4006
Jistanidiot

Vous avez également git symbolic-ref HEAD qui affiche le refspec complet.

Pour afficher uniquement le nom de la branche dans Git v1.8 et ultérieur (merci à Greg de l'avoir signalé):

$ git symbolic-ref --short HEAD

Sur Git v1.7 +, vous pouvez aussi faire:

$ git rev-parse --abbrev-ref HEAD

Les deux doivent donner le même nom de branche si vous êtes sur une branche. Si vous êtes détaché, les réponses sont différentes.

Remarque:

Sur un client antérieur, cela semble fonctionner:

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

- Darien 26. mars 2014

444
Wernight

Pour ma propre référence (mais cela pourrait être utile à d'autres), j'ai présenté une vue d'ensemble de la plupart des techniques (en ligne de commande de base) mentionnées dans ce fil, chacune appliquée à plusieurs cas d'utilisation: HEAD

  • succursale locale (maître)
  • branche de suivi à distance, synchronisée avec la branche locale (Origin/master au même commit que le maître)
  • branche de suivi à distance, non synchronisée avec une branche locale (Origin/feature-foo)
  • balise (v1.2.3)
  • sous-module (exécuté dans le répertoire du sous-module)
  • tête détachée générale (aucune de ces réponses)

Résultats:

  • git branch | sed -n '/\* /s///p'
    • branche locale: master
    • branche de suivi à distance (en synchronisation): (detached from Origin/master)
    • branche de suivi à distance (non synchronisée): (detached from Origin/feature-foo)
    • tag: (detached from v1.2.3)
    • sous-module: `(HEAD détaché à 285f294)
    • tête détachée générale: (detached from 285f294)
  • git status | head -1
    • agence locale: # On branch master
    • branche de suivi à distance (en synchronisation): # HEAD detached at Origin/master
    • branche de suivi à distance (non synchronisée): # HEAD detached at Origin/feature-foo
    • tag: # HEAD detached at v1.2.3
    • sous-module: # HEAD detached at 285f294
    • tête détachée générale: # HEAD detached at 285f294
  • git describe --all
    • agence locale: heads/master
    • branche de suivi à distance (en synchronisation): heads/master (remarque: pas remotes/Origin/master)
    • branche de suivi à distance (non synchronisée): remotes/Origin/feature-foo
    • tag: v1.2.3
    • sous-module: remotes/Origin/HEAD
    • tête détachée générale: v1.0.6-5-g2393761
  • cat .git/HEAD:
    • agence locale: ref: refs/heads/master
    • sous-module: cat: .git/HEAD: Not a directory
    • tous les autres cas d'utilisation: SHA du commit correspondant
  • git rev-parse --abbrev-ref HEAD
    • branche locale: master
    • tous les autres cas d'utilisation: HEAD
  • git symbolic-ref --short HEAD
    • branche locale: master
    • tous les autres cas d'utilisation: fatal: ref HEAD is not a symbolic ref

(Pour votre information, cela a été fait avec la version 1.8.3.1 de Git)

198
Stefaan

Une autre alternative:

git name-rev --name-only HEAD
126
Filip Spiridonov

Bien assez simple, je l'ai eu dans un one liner (bash)

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

(crédit: Expiation limitée)

Et pendant que je suis là, le seul support pour obtenir la branche de suivi à distance (le cas échéant)

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

Vous pouvez simplement taper en ligne de commande (console) sous Linux, dans le répertoire du référentiel:

$ git status

et vous verrez un texte, parmi lequel quelque chose de similaire à:

...
On branch master
...

ce qui signifie que vous êtes actuellement sur une branche master. Si vous modifiez actuellement un fichier et qu'il se trouve dans le même référentiel local (répertoire local contenant les fichiers sous Git version control), vous modifiez un fichier dans cette branche.

59
Tadeck
git symbolic-ref -q --short HEAD

J'utilise ceci dans les scripts qui ont besoin du nom de la branche actuelle. Il vous montrera la courte référence symbolique actuelle à HEAD, qui sera le nom de votre branche actuelle.

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

montrera seulement le nom de la branche

24
ungalcrys

Trouvé une solution en ligne de commande de la même longueur que Oliver Refalo , en utilisant good ol 'awk:

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

awk lit cela comme "faire les choses dans {} sur les lignes correspondant à la regex". Par défaut, les champs sont délimités par des espaces et vous imprimez le second. Si vous pouvez supposer que seule la ligne avec votre branche a le *, vous pouvez supprimer le ^. Ah, bash golf!

21
Silas Barta

git branch affiche uniquement le nom de la branche actuelle.

Bien que git branch vous montrera toutes les branches et mettra en surbrillance la dernière avec un astérisque, cela peut être trop fastidieux de travailler avec beaucoup de branches.

Pour afficher uniquement la branche sur laquelle vous vous trouvez, utilisez:

git rev-parse --abbrev-ref HEAD
20
Lawrence Paje
#!/bin/bash
function git.branch {
  br=`git branch | grep "*"`
  echo ${br/* /}
}
git.branch
17
Dziamid

Pourquoi ne pas utiliser l'invite du shell git-aware, qui indiquerait le nom de la branche actuelle? git status aide également.


Comment git-Prompt.sh from contrib/ le fait (git version 2.3.0), comme défini dans la fonction d'assistance __git_ps1:

  1. Premièrement, il y a un cas spécial si rebase en cours est détecté. Git utilise une branche non nommée (HEAD détachée) pendant le processus de rebase pour la rendre atomique, et la branche originale est sauvegardée ailleurs.

  2. Si le fichier .git/HEAD est un lien symbolique (un cas très rare, issu de l'histoire ancienne de Git), il utilise git symbolic-ref HEAD 2>/dev/null

  3. Sinon, il lit le fichier .git/HEAD. Les prochaines étapes dépendent de son contenu:

    • Si ce fichier n'existe pas, alors il n'y a pas de branche actuelle. Cela se produit généralement si le référentiel est nu.

    • S'il commence par le préfixe 'ref: ', alors .git/HEAD est symref (référence symbolique) et nous sommes sur une branche normale. Supprimez ce préfixe pour obtenir le nom complet, puis supprimez refs/heads/ pour obtenir le nom abrégé de la branche actuelle:

      b="${head#ref: }"
      # ...
      b=${b##refs/heads/}
      
    • S'il ne commence pas par 'ref: ', il est alors détaché HEAD (branche anonyme), ce qui pointe directement vers un commit. Utilisez git describe ... pour écrire le commit actuel sous une forme lisible par l'homme.

J'espère que ça aide.

15
Jakub Narębski

vous pouvez utiliser git bash sur le répertoire de travail commande est la suivante

git status -b

il vous indiquera sur quelle branche vous vous trouvez il y a beaucoup de commandes utiles, dont certaines sont 

-s

--short Donne le résultat au format court.

-b--branchAfficher les informations de branche et de suivi, même au format court.

--porcelain [=] Donne le résultat dans un format facile à analyser pour les scripts. Ceci est similaire à la sortie courte, mais restera stable à travers les versions de Git et quelle que soit la configuration de l'utilisateur. Voir ci-dessous pour plus de détails.

Le paramètre version est utilisé pour spécifier la version du format. Ceci est facultatif et utilise par défaut le format de la version 1 d'origine.

--longue__. Donne le résultat au format long. C'est la valeur par défaut.

-v--verboseEn plus des noms de fichiers qui ont été modifiés, affichez également les modifications textuelles qui doivent être validées (c'est-à-dire, comme la sortie de git diff --cached). Si -v est spécifié deux fois, montrez également les modifications dans l’arborescence de travail qui n’ont pas encore été effectuées (c’est-à-dire comme la sortie de git diff).

14
Prateek Gangwal

Je recommande d'utiliser l'une de ces deux commandes.

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

OR

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

OU (plus commenté)

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

12
jackotonye

Avec le temps, nous pourrions avoir une très longue liste de branches.

Alors que certaines des autres solutions sont géniales, voici ce que je fais (simplifié à partir de la réponse de Jacob):

git branch | grep \*

À présent,

git status

fonctionne, mais seulement S'il y a des changements locaux

12
karthikr

Désolé, ceci est une autre réponse en ligne de commande, mais c'est ce que je cherchais quand j'ai trouvé cette question et beaucoup de ces réponses ont été utiles. Ma solution est la fonction shell bash suivante:

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

Cela devrait toujours me donner quelque chose à la fois lisible par l'homme et directement utilisable comme argument pour git checkout.

  • sur une branche locale: feature/HS-0001
  • sur un commit étiqueté (détaché): v3.29.5
  • sur une branche distante (détachée, non étiquetée): SHA1
  • sur tout autre commit détaché: SHA1
12
dmaestro12

Une version moins bruyante pour le statut git ferait l'affaire

git status -bsuno

Il imprime

## branch-name
11
dgolovin

Dans Netbeans, assurez-vous que les annotations de gestion des versions sont activées (Affichage -> Afficher le gestion des versions Vous pouvez alors voir le nom de la branche en regard du nom du projet.

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

11
Saroj

J'ai un script simple appelé git-cbr ( branche actuelle ) qui affiche le nom de la branche actuelle.

#!/bin/bash

git branch | grep -e "^*"

Je mets ce script dans un dossier personnalisé (~/.bin). Le dossier est dans $PATH.

Alors maintenant, quand je suis dans un dépôt Git, je tape simplement git cbr pour imprimer le nom de la branche actuelle.

$ git cbr
* master

Cela fonctionne parce que la commande git prend son premier argument et tente d'exécuter un script portant le nom de git-arg1. Par exemple, git branch tente d’exécuter un script appelé git-branch, etc.

10
Diego Pino

Et ça?

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

La commande Shell suivante vous indique la branche dans laquelle vous vous trouvez.

git branch | grep ^\*

Si vous ne voulez pas taper cette longue commande à chaque fois que vous voulez connaître la branche et que vous utilisez Bash, attribuez-lui un alias court, par exemple alias cb, comme suit.

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

Lorsque vous êtes dans la branche maîtresse et que votre invite est $, vous obtenez * master comme suit.

$ cb
* master
9
mrrusof

Vous pouvez configurer de manière permanente votre sortie bash pour qu'elle affiche le nom de votre branche git. C'est très pratique lorsque vous travaillez avec différentes branches, inutile de taper $ git status tout le temps. Github repo git-aware-Prompt .

Ouvrez votre terminal (ctrl-alt-t) et entrez les commandes

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

Modifiez votre commande .bashrc avec Sudo nano ~/.bashrc (pour Ubuntu) et ajoutez ce qui suit au sommet:

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

Puis collez le code 

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\]\$ "

à la fin du même fichier, vous avez précédemment collé le code d'installation. Cela vous donnera la sortie colorisée:  enter image description here

8
Kirill Zhuravlov

Si vous voulez vraiment que la dernière branche/balise soit extraite dans l’état détaché HEAD également.

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

Mise à jour C’est plus agréable si vous avez et n’avez pas peur de awk.

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

donnera également le nom de la branche avec les modifications.

par exemple.

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

Retourne le nom de la branche ou SHA1 lorsque la tête est détachée:

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

Ceci est une version courte de la réponse de @ dmaestro12 et sans support de balises.

6
user

Je sais que c'est tard, mais sur linux/mac, depuis le terminal, vous pouvez utiliser ce qui suit.

git status | sed -n 1p

Explication:

git status -> obtient le statut de l'arbre de travail
sed -n 1p -> obtient la première ligne du corps de statut 

La réponse à la commande ci-dessus se présentera comme suit: 

"On branch your_branch_name"
5
skippy

Ajoutez-le à PS1 sous Mac: 

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

Avant d'exécuter la commande ci-dessus: 

 enter image description here

Après avoir exécuté cette commande: 

 enter image description here

Ne vous inquiétez pas, s'il ne s'agit pas d'un référentiel GIT, il n'y aura pas d'erreur en raison de [-d .git] qui vérifie si le dossier .git existe ou non. 

4
Abdennour TOUMI

vous pouvez également utiliser la variable GIT_BRANCH telle qu'elle apparaît ici: https://wiki.jenkins-ci.org/display/JENKINS/Git+Plugin

Le plugin git définit plusieurs variables d'environnement que vous pouvez utiliser dans vos scripts:

GIT_COMMIT - SHA du courant

GIT_BRANCH - Nom de la branche en cours d'utilisation, par exemple. "maître" ou "origine/foo"

GIT_PREVIOUS_COMMIT - SHA de la précédente validation construite de la même branche (l'actuel SHA dans la première branche de la branche)

GIT_URL - URL distante du référentiel

GIT_URL_N - URL distantes du référentiel lorsqu'il y a plus de 1 télécommandes, par exemple. GIT_URL_1, GIT_URL_2

GIT_AUTHOR_EMAIL - Email de l'auteur/de l'auteur

GIT_COMMITTER_EMAIL - Email de l'auteur/de l'auteur

4
user3405314

À partir de la version 2.22 de git, vous pouvez simplement utiliser:

git branch --show-current
4
Max
git branch | grep "*" | sed "s/* //" | awk '{printf $0}' | pbcopy

Pour copier directement le résultat dans le presse-papier. Merci à @ olivier-refalo pour le début…

2
SushiGrass Jacob

Utiliser des idées antérieures; en supposant que sha1 est 40 caractères; et chasser les références (oui, devrait supprimer les lignes d’impression de débogage

git reflog | awk '
$3 == "checkout:" && (sha == "" || sha == $1 ) {
  from=$(NF - 2)
  to=$NF
  print from, to, length(from) > "/dev/stderr"
  if (length(from) != 40) { print from ; exit; }
  sha=substr(from, 1, 7)
  print sha > "/dev/stderr"
}
'

donne la sortie brute:

$ git status
HEAD detached at 147049c
[...]
$ ./gime-branch.sh
a47be8d2167641088b66bf8f5c2bf7d3da0c642c HEAD^ 40
a47be8d
master HEAD^ 6
master
2
cagney

Ajoutez simplement les lignes suivantes à votre ~/.bash_profile:

branch_show() {
     git branch 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/ (\1)/'
}
export PS1="\u@\h \[\033[32m\]\w\[\033[33m\]\$(branch_show)\[\033[00m\] $ "

De cette façon, vous pouvez avoir le nom de la branche actuelle dans Terminal

Gracieuseté de Coderwall.com

1
SHi ON

Vous pouvez le faire avec une seule instruction grep, en utilisant le mode Perl et \K pour réinitialiser le tampon de correspondance afin que vous n'obteniez que le nom de la branche.

$ git branch | grep -oP "^\*\s+\K\S+$"
master
0
Joseph Lust

Utilisez git branch --contains HEAD | tail -1 | xargs, cela fonctionne également pour l'état "détaché HEAD".

0
glisu

Obtenir le nom de la succursale locale uniquement:

git status -b -u no | awk 'NR==1{print $3;}'

Obtenir le nom de la branche distante uniquement:

git status -b -u no | awk 'NR==2{print $6;}'

et git status -b -u no | awk 'NR==2{print $6;}' | tr -d "[.']" pour supprimer les caractères spéciaux de la sortie

0
v.babak

Je sais que la réponse à cette question a déjà été donnée, mais dans la version la plus récente de Git, la commande git branch ouvre la liste de vos branches dans une sorte d’invite que vous devez quitter. Ce qui m'énerve sans fin!

Voici mon correctif: Ouvrez votre profil bash et tapez ceci dans:

#!/bin/bash
git() {
  if [[ $@ == "branch" ]] then
    command git branch -a | grep -v 'remotes'
  else
    command git "$@"
  fi
}

Ouvrez maintenant Terminal et testez-le en tapant les commandes suivantes dans un dépôt Git:

source ~/.zshrc
git branch 

Et le tour est joué! Une liste de vos succursales locales est imprimée dans votre terminal.

Le code que vous écrivez dans votre fichier bashrc écrase la fonction par défaut pour git branch et la remplace par une commande beaucoup plus longue qui répertorie toutes les branches locales via l'argument -a. Ensuite, nous grep pour extraire l’activité supplémentaire non nécessaire et l’imprimer. Si vous excluez la commande grep, vous obtiendrez toujours l’invite ennuyeuse. Si vous n'êtes pas familier avec l'écriture de commandes bash, vérifiez cette explication: À propos de .bash_profile, .bashrc et où un alias devrait-il être écrit?

0
okTalk