¿Cómo obtener el nombre actual de la sucursal en Git?


2595

Soy de un fondo de Subversion y, cuando tenía una rama, sabía en qué estaba trabajando con "Estos archivos de trabajo apuntan a esta rama".

Pero con Git no estoy seguro cuando estoy editando un archivo en NetBeans o Notepad ++, si está vinculado al maestro u otra rama.

No hay problema con gitbash, me dice lo que estoy haciendo.


11
Deje que su IDE visualizar el archivo .git/HEAD, posiblemente en un directorio padre
Tino

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



99
Con Git 2,22 (Q2 2019), tendrá un enfoque más simple: git branch --show-current. Mira mi respuesta aquí .
VonC

Respuestas:


2305
git branch

debería mostrar todas las sucursales locales de su repositorio. La rama destacada es tu rama actual.

Si desea recuperar solo el nombre de la sucursal en la que se encuentra, puede hacer lo siguiente:

git rev-parse --abbrev-ref HEAD

Pero eso no me ayuda con Notepad ++ y Netbeans. Solo git bash (y Probobly Vim) y lo mencioné. Estoy tratando de trabajar con otros Ide's y editores de texto que no son línea de comando.
mike628

@ mike628 En realidad te están ayudando, excepto que quieres algo accesible a través de la GUI. ¿Correcto?
Tadeck

2
Si está dispuesto a trabajar en Eclipse, hay un programa llamado "eGit" que tiene una GUI que le indicará la rama actual para todos los repositorios. De lo contrario, no sé ... estarías a merced del creador de cualquier complemento que quieras usar que sea compatible con el programa que elijas (si hay alguno).
roberttdev 05 de

2
después de hacer una git checkout --orphan foocontinuación, git branchno pudieron demostrar la rama foo. Mientras que git symbolic-ref HEADcomo se sugirió otra respuesta funcionó.
Marcus Junius Brutus

2
voto negativo, solo queremos la rama actual como estándar, no todas las ramas
Alexander Mills

4657

Para mostrar la rama actual en la que se encuentra, sin las otras ramas enumeradas, puede hacer lo siguiente:

git rev-parse --abbrev-ref HEAD

Referencia:


132
@ChrisNelson, porque muestra solo la rama actual, en lugar de una larga lista de todas las ramas.
avakar

73
Buena, lamentablemente no funciona si está en un estado 'HEAD separado' (solo genera 'HEAD', que es totalmente inútil).
Carlos Campderrós

34
Supongo que, por lo interno de git, si estás en un estado de 'CABEZA separada' no hay seguimiento de la rama a la que pertenece, porque git branchmuestra * (no branch), lo que también es inútil ...
Carlos Campderrós

76
"git symbolic-ref --short HEAD" también funciona para este mismo propósito
dusktreader

22
git rev-parse --abbrev-ref HEAD 2>/dev/null La parte / dev / null evita que vea un error si acaba de crear un nuevo repositorio que aún no tiene HEAD.
Paradiesstaub

523

También tiene git symbolic-ref HEADque muestra la especificación de referencia completa.

Para mostrar solo el nombre de la rama en Git v1.8 y posterior (gracias a Greg por señalarlo):

git symbolic-ref --short HEAD

En Git v1.7 + también puedes hacer:

git rev-parse --abbrev-ref HEAD

Ambos deben dar el mismo nombre de rama si estás en una rama. Si estás en una cabeza separada, las respuestas son diferentes.

Nota:

En un cliente anterior, esto parece funcionar:

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

- Darien 26. mar 2014


77
Como todas las otras respuestas, esto no funciona cuando estás en un estado de 'CABEZA separada'
Carlos Campderrós

51
@ CarlosCampderrós: ​​si estás en estado HEAD separado, no existe una rama actual. Después de todo, la confirmación en la que se encuentra puede ser accesible por cero, una o más ramas.
Flimm

2
esto genera problemas en los repositorios vacíos de git cuando no hay HEAD
Arne

8
Con git la versión 2.4.4 git rev-parse --abbrev-ref HEADmuestra HEADcuando estás en la cabeza separada.
peterhil

La mejor respuesta sigue siendo, git symbolic-ref HEAD | sed -e "s/^refs\/heads\///" ya que mostrará una cadena como HEAD detached at a63917fcuando está en un estado separado, a diferencia de las otras respuestas que no muestran nada o HEAD. Esto es importante.
Bernard

265

Para mi propia referencia (pero podría ser útil para otros), hice una descripción general de la mayoría de las técnicas (línea de comando básica) mencionadas en este hilo, cada una aplicada a varios casos de uso: HEAD es (señalando):

  • sucursal local (maestro)
  • rama de seguimiento remoto, en sincronización con la rama local (origen / maestro en el mismo compromiso que el maestro)
  • rama de seguimiento remoto, no sincronizada con una rama local (origin / feature-foo)
  • etiqueta (v1.2.3)
  • submódulo (se ejecuta dentro del directorio de submódulos)
  • cabeza separada general (ninguna de las anteriores)

Resultados:

  • git branch | sed -n '/\* /s///p'
    • sucursal local: master
    • rama de seguimiento remoto (en sincronización): (detached from origin/master)
    • rama de seguimiento remoto (no sincronizada): (detached from origin/feature-foo)
    • etiqueta: (detached from v1.2.3)
    • submódulo: (HEAD detached at 285f294)
    • cabeza separada general: (detached from 285f294)
  • git status | head -1
    • sucursal local: # On branch master
    • rama de seguimiento remoto (en sincronización): # HEAD detached at origin/master
    • rama de seguimiento remoto (no sincronizada): # HEAD detached at origin/feature-foo
    • etiqueta: # HEAD detached at v1.2.3
    • submódulo: # HEAD detached at 285f294
    • cabeza separada general: # HEAD detached at 285f294
  • git describe --all
    • sucursal local: heads/master
    • rama de seguimiento remoto (en sincronización): heads/master(nota: no remotes/origin/master )
    • rama de seguimiento remoto (no sincronizada): remotes/origin/feature-foo
    • etiqueta: v1.2.3
    • submódulo: remotes/origin/HEAD
    • cabeza separada general: v1.0.6-5-g2393761
  • cat .git/HEAD:
    • sucursal local: ref: refs/heads/master
    • submódulo: cat: .git/HEAD: Not a directory
    • todos los demás casos de uso: SHA de la confirmación correspondiente
  • git rev-parse --abbrev-ref HEAD
    • sucursal local: master
    • todos los demás casos de uso: HEAD
  • git symbolic-ref --short HEAD
    • sucursal local: master
    • todos los demás casos de uso: fatal: ref HEAD is not a symbolic ref

(FYI esto se hizo con git versión 1.8.3.1)


66
En resumen, ninguno parece hacer exactamente lo que yo haría a mano.
bukzor

66
Esto fue bastante útil para mí: git describe --all --exact-match 2>/dev/null | sed 's=.*/=='fue la mejor solución para mí (buenos nombres para etiquetas y cabezales de rama, sin salida para cabezas separadas al azar.
Alex Dupuy

1
Sin embargo, acabo de descubrir que el uso git describetiene una falla grave cuando hay varias ramas que hacen referencia a la misma confirmación, por ejemplo, justo después git checkout -b foo: usa una de ellas arbitrariamente (parece que tal vez sea la más reciente). Cambiaré mi estrategia para usar la salida filtrada git branchy solo la usaré git describesi el resultado es algo sobre un cabezal separado.
Alex Dupuy

En realidad, necesito usar git branch --no-colorpara asegurarme de que el nombre del archivo no tenga códigos de escape de terminal molestos.
Alex Dupuy

2
Esto me ha sido muy útil más de una vez, ¡gracias por ser tan minucioso!
Alice Purcell el

154

A partir de la versión 2.22 de git, podría usar:

git branch --show-current

Según la página del manual:

Imprime el nombre de la rama actual. En el estado HEAD separado, no se imprime nada.


2
Sí, lo mencioné en marzo pasado en los comentarios de esa página: stackoverflow.com/questions/6245570/… . Y en stackoverflow.com/a/55088865/6309 .
VonC

55
Al menos mencione que esto no funciona en estado HEAD separado. Acabo de perder horas obteniendo git 2.22 para compilar por nada ...
David Deprost

136

Una alternativa más:

git name-rev --name-only HEAD

también se puede recuperar conecho ${$(git symbolic-ref --quiet HEAD)#refs/heads/}
Antoine

12
No funciona si HEAD es igual para el maestro y la rama de características (por ejemplo, durante la fusión). Devuelve 'maestro' incluso si se ejecuta en la rama de características.
Orest Hera

1
git checkout master && git name-rev --name-only HEAD # ac-187No funciona como se esperaba
Alexander Abashkin

Guardo esto en una variable justo antes de fusionar y también en caso de que mi HEAD se desacople si compro una confirmación en particular. En estos casos esto funciona bien.
Ishaan Sejwal

44
Estoy haciendo esto desde una tubería de Jenkins. Así que esta parece ser por el momento la mejor respuesta para mí. Hacer git branch --listsolo dice * (HEAD detached at 7127db5). Hacer git rev-parse --abbrev-ref HEADsolo dice HEADy así sucesivamente.
Mig82

91

Bueno, lo suficientemente simple, lo obtuve en una línea (bash)

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

(crédito: Expiación limitada)

Y mientras estoy allí, el único revestimiento para obtener la rama de seguimiento remoto (si corresponde)

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

8
Demasiadas barras! :) sed -n 's/\* //p'hace el truco. Aunque tiendo hacia lo paranoico, entonces lo anclaría sed -n 's/^\* //p'.
Mark Reed

65

Simplemente puede escribir en la línea de comandos (consola) en Linux, en el directorio del repositorio:

$ git status

y verá un texto, entre los cuales hay algo similar a:

...
On branch master
...

lo que significa que actualmente estás en una mastersucursal. Si está editando algún archivo en ese momento y está ubicado en el mismo repositorio local (directorio local que contiene los archivos que están bajo la administración del control de versiones de Git), está editando el archivo en esta rama.


2
De acuerdo con lo que desea hacer, puede usar git statusy obtener solo la primera línea de salida con la git status | head -1que se obtiene algo así # On branch master. Estoy seguro de que las diferencias de versión también deberán tenerse en cuenta.
Joshua Pinter

@JoshPinter: También puede usar git status | grep 'On branch', lo que debería tener el mismo efecto (debería, no significa que lo hará si su versión de Git lo muestra de manera diferente). O bien git branch | grep '*', que mostrará el nombre de la rama con una estrella al comienzo.
Tadeck

Sí, eso también funciona y podría ser más flexible. Mi resultado final para mostrar solo el nombre de la sucursal en una aplicación dev Rails fue:<tick>git status | head -1<tick>.gsub('# On branch ', '')
Joshua Pinter el

1
git statuspuede llevar mucho tiempo devolver un valor si se gestionan muchos archivos.
The Tin Man,

Sí, si desea imprimir la rama en una página web, por ejemplo, git statuspuede acumular el tiempo de generación de toda la página.
Artem Russakovskii

36
git symbolic-ref -q --short HEAD

Lo uso en scripts que necesitan el nombre de la rama actual. Le mostrará la referencia simbólica corta actual a HEAD, que será su nombre de rama actual.


1
Gracias, funciona muy bien! - También estoy agregando "-C path_to_folder" en mi script con esto.
Tony

1
Esta es una buena solución porque con la opción -q devuelve un código de error en el estado "HEAD separado" pero no imprime nada en stderr.
hallidave

esta es la única solución que funcionó para mí en un nuevo repositorio sin compromisos
kundasaba

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

solo mostrará el nombre de la sucursal


Si su rama muestra algo así como "* (CABEZA separada en SUM_BRANCH_01)", intente con esto "git branch | grep -e" ^ * "| cut -d '' -f 5 | cut -d ')' -f 1 "
Dylan Kapp

Acabo de crear exactamente este mismo script para obtener el nombre de la rama actual. Pensé que podría ayudar con las diferencias.
tggagne

25

git branch mostrar solo el nombre de la sucursal actual.

Si bien git branch le mostrará todas las ramas y resaltará la actual con un asterisco, puede ser demasiado engorroso cuando se trabaja con muchas ramas.

Para mostrar solo la rama en la que se encuentra actualmente, use:

git rev-parse --abbrev-ref HEAD

¡Esto es genial para ci y otras herramientas de construcción!
phouse512

mejor respuesta para usarlo en un script
Ben Keil

1
@DylanNicholson a git branch --containsveces enumera más de una rama.
Joe Chacko

22

Encontré una solución de línea de comando de la misma longitud que la de Oliver Refalo , usando buena ol 'awk:

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

awklee eso como "hacer las cosas en {}líneas que coinciden con la expresión regular". Por defecto, asume campos delimitados por espacios en blanco, por lo que imprime el segundo. Si puede suponer que solo la línea con su rama tiene el *, puede soltar el ^. Ah, bash golf!


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

18

¿Por qué no usar el indicador de shell de git-aware, que le dirá el nombre de la rama actual? git statusTambién ayuda.


Cómo git-prompt.sh desde contrib/lo hace (GIT versión 2.3.0), como se define en __git_ps1función de ayuda:

  1. Primero, hay un caso especial si se detecta rebase en progreso. Git usa una rama sin nombre (HEAD separada) durante el proceso de rebase para hacerlo atómico, y la rama original se guarda en otro lugar.

  2. Si el .git/HEADarchivo es un enlace simbólico (un caso muy raro, de la historia antigua de Git), utilizagit symbolic-ref HEAD 2>/dev/null

  3. De lo contrario, lee el .git/HEADarchivo. Los siguientes pasos dependen de su contenido:

    • Si este archivo no existe, entonces no hay una rama actual. Esto suele suceder si el repositorio está vacío.

    • Si comienza con el 'ref: 'prefijo, entonces .git/HEADes symref (referencia simbólica), y estamos en la rama normal. Elimine este prefijo para obtener el nombre completo, y elimine refs/heads/para obtener el nombre corto de la rama actual:

      b="${head#ref: }"
      # ...
      b=${b##refs/heads/}
      
    • Si no comienza con 'ref: ', entonces se separa HEAD (rama anónima), apuntando directamente a alguna confirmación. Se usa git describe ...para escribir el commit actual en forma legible para humanos.

Espero que eso ayude.


3
Y si está desarrollando un indicador de shell compatible con git, ¿cuál de las respuestas debe usar aquí? Tortugas hasta el fondo.
tripleee


44
Lo que para el registro parece estar haciendo, git describe --contains --all HEADlo que actualmente no veo en ninguna otra parte de esta página. Como estoy seguro de que sabe, las respuestas de solo enlace no se recomiendan en StackOverflow.
tripleee

2
@tripleee: He agregado una explicación de cómo git-prompt.sh(aka __git_ps1) lo hace ...
Jakub Narębski

17

Una versión menos ruidosa para el estado de git haría el truco

git status -bsuno

Se imprime

## branch-name

1
## desarrollo ... origen / desarrollo
Kalpesh Soni

16

Lo siento, esta es otra respuesta de la línea de comandos, pero eso es lo que estaba buscando cuando encontré esta pregunta y muchas de estas respuestas fueron útiles. Mi solución es la siguiente función bash shell:

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

Esto siempre debería darme algo que sea legible para los humanos y directamente utilizable como argumento git checkout.

  • en una sucursal local: feature/HS-0001
  • en un commit etiquetado (separado): v3.29.5
  • en una rama remota (separada, no etiquetada): SHA1
  • en cualquier otra confirmación separada: SHA1

1
Gracias por publicar esto, ninguna de las otras respuestas parecía preocuparse por producir siempre algo útil como argumento para git checkout.
zwol

15

puede usar git bash en el comando del directorio de trabajo es el siguiente

git status -b

le dirá en qué rama se encuentra hay muchos comandos que son útiles, algunos de ellos son

-s

--short Proporciona la salida en formato corto.

-b --branch Muestra la rama y la información de seguimiento incluso en formato corto.

--porcelain [=] Proporcione la salida en un formato fácil de analizar para los scripts. Esto es similar a la salida corta, pero se mantendrá estable en todas las versiones de Git e independientemente de la configuración del usuario. Ver abajo para más detalles.

El parámetro versión se usa para especificar la versión del formato. Esto es opcional y el formato predeterminado es la versión original v1.

--long Proporciona la salida en formato largo. Este es el valor predeterminado.

-v --verbose Además de los nombres de los archivos que se han cambiado, también se muestran los cambios de texto que se realizarán por etapas (es decir, como la salida de git diff --cached). Si -v se especifica dos veces, también muestra los cambios en el árbol de trabajo que aún no se han organizado (es decir, como la salida de git diff).


14
git status 

también le dará el nombre de la sucursal junto con los cambios.

p.ej

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

13

Con el tiempo, podríamos tener una lista muy larga de sucursales.

Si bien algunas de las otras soluciones son excelentes, esto es lo que hago (simplificado de la respuesta de Jacob):

git branch | grep \*

Ahora,

git status

funciona, pero solo si hay algún cambio local


13

Recomiendo usar cualquiera de estos dos comandos.

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

O

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

O (más detallado)

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


12

En Netbeans, asegúrese de que las anotaciones de versiones estén habilitadas (Ver -> Mostrar etiquetas de versiones). Luego puede ver el nombre de la sucursal junto al nombre del proyecto.

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


Con las anotaciones de versiones habilitadas, todo lo que necesita hacer es pasar el mouse sobre la carpeta Proyecto (o Archivo, o Favorito) para ver la rama actual.
idclaar

12

¿Qué hay de esto?

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

1
Respuesta mucho mejor porque maneja bien el caso HEAD separado.
Pat

2
Parece que deberías usar () no {} para ajustar los comandos git
Pat

@Pat No hay necesidad de generar una subshell separada para esto, como haría (). {} está bien, excepto que necesita agregar un; o nueva línea antes del}. En realidad, puede dejar el {} completamente a menos que necesite agrupar los comandos.
aij

¿La symbolic-refparte también necesita --shortevitar prefijar el nombre de la rama refs/heads/?
rjp

11

Tengo un script simple llamado git-cbr( rama actual ) que imprime el nombre de la rama actual.

#!/bin/bash

git branch | grep -e "^*"

Puse este script en una carpeta personalizada ( ~/.bin). La carpeta está adentro $PATH.

Entonces, cuando estoy en un repositorio de git, simplemente escribo git cbrpara imprimir el nombre de la rama actual.

$ git cbr
* master

Esto funciona porque el gitcomando toma su primer argumento e intenta ejecutar un script que se conoce con el nombre de git-arg1. Por ejemplo, git branchintenta ejecutar un script llamado git-branch, etc.


11

Puede configurar permanentemente su salida de bash para mostrar su nombre de git-branch. Es muy útil cuando trabajas con diferentes ramas, no necesitas escribir $ git statustodo el tiempo. Github repo git-aware-prompt .

Abra su terminal (ctrl-alt-t) e ingrese los comandos

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

Edite su .bashrc con el sudo nano ~/.bashrccomando (para Ubuntu) y agregue lo siguiente en la parte superior:

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

Luego pegue el código

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

al final del mismo archivo en el que pegó el código de instalación anteriormente. Esto le dará la salida coloreada:ingrese la descripción de la imagen aquí


10

El siguiente comando de shell te dice en qué rama estás actualmente.

git branch | grep ^\*

Cuando no desee escribir ese comando largo cada vez que desee conocer la rama y esté usando Bash, asigne al comando un alias corto, por ejemplo cb, alias , de esta manera.

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

Cuando esté en la rama maestra y su solicitud sea $, obtendrá * masterlo siguiente.

$ cb
* master

Esto no proporciona una respuesta a la pregunta. Para criticar o solicitar una aclaración de un autor, deje un comentario debajo de su publicación. - De la opinión
Rashwan L

1
¿Por qué piensas eso?
mrrusof

debe comentar y describir su publicación para el OP, de esa manera será más fácil entender su publicación.
Rashwan L

1
Tiene mucho sentido.
mrrusof

1
si usa zsh, deberá envolver la expresión regular grep entre comillas simples:git branch | grep '^\*'
aaaarrgh

9

Devuelve el nombre de la rama o SHA1 cuando está en la cabeza separada:

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

Esta es una versión corta de la respuesta de @ dmaestro12 y sin soporte de etiquetas.


8
mejor:git symbolic-ref --quiet --short HEAD || git rev-parse --short HEAD
azulado

8

Si realmente desea que la última rama / etiqueta se desproteja también en estado HEAD separado.

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

Actualización Esto es mejor si tienes y no tienes miedo de awk.

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

el rev | cut -d' ' -f1| revse puede simplificar conawk '{print $NF}'
Steve Buzonas

1
Si bien esto tampoco es infalible, ya que puede verificar una revisión particular por hash, por lo que el registro de nuevo solo muestra checkout: moving from ba7571b7fc5b8f31b8d0625821269afaa655577e to f68be8cf7bea917a5a0562b619e50368de0068a9que sigue siendo un truco útil que podría ayudar a desambiguar algunos casos.
Alex Dupuy

1
git reflog | awk '$3=="checkout:" {print $NF; exit}'
Acortar

6

Sé que esto es tarde, pero en un linux / mac, desde la terminal puedes usar lo siguiente.

git status | sed -n 1p

Explicación:

git status -> obtiene el estado del árbol de trabajo
sed -n 1p -> obtiene la primera línea del cuerpo del estado

La respuesta al comando anterior se verá de la siguiente manera:

"On branch your_branch_name"

2
head -1sería la forma habitual
bukzor

5

También puede usar la variable GIT_BRANCH como aparece aquí: https://wiki.jenkins-ci.org/display/JENKINS/Git+Plugin

El complemento git establece varias variables de entorno que puede usar en sus scripts:

GIT_COMMIT - SHA del actual

GIT_BRANCH - Nombre de la rama que se está utilizando actualmente, por ejemplo, "maestro" u "origen / foo"

GIT_PREVIOUS_COMMIT - SHA de la confirmación compilada anterior de la misma rama (el SHA actual en la primera compilación en la rama)

GIT_URL: URL remota del repositorio

GIT_URL_N: URL remotas del repositorio cuando hay más de 1 control remoto, por ejemplo, GIT_URL_1, GIT_URL_2

GIT_AUTHOR_EMAIL - Correo electrónico del autor / autor

GIT_COMMITTER_EMAIL - Correo electrónico del autor / autor


5

Agréguelo al PS1uso de Mac:

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

Antes de ejecutar el comando anterior:

ingrese la descripción de la imagen aquí

Después de ejecutar ese comando:

ingrese la descripción de la imagen aquí

No se preocupe, si no es un repositorio GIT, no mostrará un error debido a [-d .git]que comprueba si la .gitcarpeta existe o no.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.