git: diferencia entre "branchname" y "refs / heads / branchname"

97

Es mejor explicarlo en un ejemplo: estoy en la rama 0.58 del repositorio y así es como lo hago:

git pull origin 0.58

Cuando llamo "git pull", obtengo:

ip238:openlierox az$ git pull
You asked me to pull without telling me which branch you
want to merge with, and 'branch.0.58.merge' in
your configuration file does not tell me either.  Please
name which branch you want to merge on the command line and
try again (e.g. 'git pull <repository> <refspec>').
See git-pull(1) for details on the refspec.

If you often merge with the same branch, you may want to
configure the following variables in your configuration
file:

    branch.0.58.remote = <nickname>
    branch.0.58.merge = <remote-ref>
    remote.<nickname>.url = <url>
    remote.<nickname>.fetch = <refspec>

See git-config(1) for details.

Parece que probablemente olvidé alguna opción (¿-track?) Cuando revisé esa ramificación. De todos modos, he configurado esto ahora:

git config branch.0.58.merge 0.58
git config branch.0.58.remote origin

Y esto parece funcionar. Luego, solo por interés, eché un vistazo a otra rama sobre esta configuración:

ip238:openlierox az$ git config branch.0.57.merge
refs/heads/0.57
ip238:openlierox az$ git config branch.0.57.remote
origin

Me preguntaba ahora, ¿hay alguna diferencia entre "0.58" o debería especificar "refs / heads / 0.58"?

¿Cuál es la diferencia exactamente?

Albert
fuente
1
Solo para corregir el error tipográfico en el título (sin jugar con un título antiguo modificándolo ahora) , debería leer "refs / heads / branchname" , headscon una "s".
RomainValeri

Respuestas:

129

A refes cualquier cosa que apunte a una confirmación, por ejemplo, ramas (cabezas), etiquetas y ramas remotas. Debería ver cabezas, controles remotos y etiquetas en su .git/refsdirectorio, asumiendo que tiene los tres tipos de referencias en su repositorio.

refs/heads/0.58especifica una rama denominada 0.58. Si no especifica en qué espacio de nombres se encuentra la referencia, git buscará en los predeterminados. Esto hace que usar solo 0.58 sea concebiblemente ambiguo: podría tener tanto una rama como una etiqueta llamada 0.58.

Cascabel
fuente
3
Muchas gracias, esto lo explica muy bien. Simplemente funcionó con el simple "0.58" ya que no existe tal etiqueta con nombre.
Albert
1
Bien, esencialmente siempre estará completamente bien, pero es bueno estar seguro.
Cascabel
Esta respuesta es un tesoro. ¡Finalmente alguien explica Git y lo disfruto! Gracias.
aderchox
9
Aquí están todos para mayor claridad: refs/heads/y refs/remotes/yrefs/tags/
Jim Aho
41

Solo para alguien que tenga curiosidad git show-ref, que está disponible desde Git v1.8.2.2, le mostrará todas las referencias que tiene en su repositorio local.

Artem Dolobanko
fuente
3
También git log --decorate=fullse mostrarán los nombres completos de las referencias en la historia
galath
19

Mira, branchNamedebe resolverse por completo antes de que GIT pueda identificarlo. El nombre completamente resuelto será refs/heads/branchName.

Uno de los comandos famosos en git checkout branchNamerealidad lo resuelve automáticamente por completo para identificar dónde desea pagar. Tenga en cuenta que lo hace automáticamente, por lo tanto, nunca lo escribimos completamente por nuestra cuenta.

Como hace eso ? Miremos aquí

RefName :, por ejemplo master, heads/master,refs/heads/master

Un nombre de referencia simbólico. Por ejemplo, maestro normalmente significa el objeto de confirmación al que se hace referencia refs/heads/master. Si tiene ambos heads/mastery tags/master, puede decir explícitamente que le diga heads/mastera Git a cuál se refiere. Cuando es ambiguo, <refname>se elimina la ambigüedad tomando la primera coincidencia en las siguientes reglas:

1. Si $GIT_DIR/<refname>existe, eso es lo que quiere decir (esto suele ser útil sólo para HEAD, FETCH_HEAD, ORIG_HEAD, MERGE_HEADy CHERRY_PICK_HEAD);

2. de lo contrario, refs/<refname>si existe;

3. de lo contrario, refs/tags/<refname>si existe;

4. de lo contrario, refs/heads/<refname>si existe;

5. de lo contrario, refs/remotes/<refname>si existe;

6. De lo contrario, refs/remotes/<refname>/HEADsi existe.

Entonces, con los 6 pasos anteriores, intenta resolver qué es esto branchName. Por lo tanto, nunca necesitamos darle un branchName completamente resuelto.

Mira aquí y aquí también.

Además, vaya a su .gitdirectorio y vea dentro de la refcarpeta.

Número945
fuente