git

¿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.


En git la rama por defecto es master . Cuando cometas, git "usará" la rama actual en la que estás ahora. Ya que ha inicializado un nuevo repositorio, se encuentra en la rama "predeterminada" y es por esto que no lo ve en su lista de sucursales, se mostrará una vez que confirme los cambios.


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.