¿Por qué el "estado de git" muestra que estoy en la rama maestra y que "la rama de git" no aparece en un repositorio recién creado?
(5)
Estoy tratando de automatizar un proceso y emitir el comando
git branch
para averiguar en qué rama estoy.
Todo funciona bien, excepto por un repositorio recién inicializado donde
git branch
no devuelve nada.
Dado que no he hecho nada con el repositorio, ni siquiera el compromiso inicial, puedo aceptar la respuesta.
Sin embargo, si ejecuto un
git status
, me dice que estoy en la rama
master
, como se ve aquí:
$ mkdir todelete
$ cd todelete
$ git init
Initialized empty Git repository in /u/u70021a/todelete/.git
$ git status
On branch master
No commits yet
nothing to commit (create/copy files and use "git add" to track)
$ git branch
$
¿Estoy haciendo algo mal? ¿Hay algún ajuste que no haya establecido correctamente?
También tengo varias personas nuevas en Git y no puedo explicarles por qué el comando para mostrar en qué rama están no muestra nada, pero el comando de estado sí lo hace.
La rama aún no ha nacido.
Por lo tanto,
git branch
no lo muestra (
git symbolic-ref HEAD
indica que su HEAD está apuntando al maestro de rama predeterminado y que no ha nacido ya que
git branch
no lo muestra, es decir, puede estar en una rama que no lo muestra. existen aún).
Sin embargo, cometer algo creará la rama.
Este es también el caso si compra una sucursal
orphan
.
Supongo que el
git status
muestra el nombre de la rama, ya que esta es la rama que se creará.
Para las secuencias de comandos, consulte Cómo determinar mediante programación la sucursal de Git actual
Las respuestas existentes abordan la pregunta literal de por qué el resultado es lo que es, pero creo que han pasado por alto el problema real ...
Usted dijo que está automatizando algo, por lo que sugeriría que ni
git status
ni
git branch
son la mejor herramienta en un contexto de scripting.
Se pueden encontrar algunas alternativas en esta discusión: Cómo determinar mediante programación la rama de Git que está actualmente en servicio.
Sin conocer sus necesidades (o cómo querría que se comportara una rama no nacida) no necesariamente puedo hacer una recomendación, pero el punto al que me refiero es que algunos comandos son para interacción humana (porcelana) y otros para guiones ( plomería)
Subí por votación otras dos respuestas, pero creo que la forma de pensar esto es simple: puedes estar en una rama que no existe. Eso también es normal en un nuevo repositorio vacío, porque para que exista un nombre de rama, ese nombre de rama debe identificar el ID de hash de un compromiso existente y válido. Un nuevo repositorio vacío no tiene confirmaciones, por lo que aún no se permite que existan nombres de rama.
Sin embargo, inicialmente, estás en
alguna
rama.
La sucursal en la que se encuentra es aquella cuyo nombre está almacenado en el nombre especial
HEAD
.
En un nuevo repositorio vacío, Git almacena el nombre
master
(más precisamente,
refs/heads/master
—el nombre completo de la rama) en
HEAD
, por lo que está en
master
, mientras que
master
no existe.
Puede cambiar la rama no existente en la que está utilizando
git checkout -b
:
$ git init
Initialized empty Git repository in [path]
$ git checkout -b asdf
Switched to a new branch ''asdf''
$ git checkout -b hello
Switched to a new branch ''hello''
Siempre que esté en una rama que no existe, el próximo compromiso que realice
creará
la rama.
Así es también como funciona
git checkout --orphan
.
git branch
no muestra nada porque no hay rama.
Pero, como puedes leer en
man git init
:
Este comando crea un repositorio Git vacío, básicamente un directorio .git con subdirectorios para objetos, refs / heads, refs / tags y archivos de plantilla. También se crea un archivo HEAD inicial que hace referencia a la HEAD de la rama maestra.
Puse en negrita la parte que creo que es relevante. Parece que, aunque todavía no hay una rama maestra, ya existe una referencia a la misma y es por eso que se muestra en el
git status
.
Se creará una rama adecuada al cometer.