2009-12-23 22 views
88

Vi un answer to a question aquí que ayuda a restaurar un archivo eliminado en git.¿Qué significa el carácter de intercalación (^)?

La solución se

git checkout <deleting_commit>^ -- <deleted_file_path> 

¿Qué significa el carácter de intercalación (^) hacer? Lo he visto en otro lado haciendo cosas muy útiles en git. Es mágico. Alguien, por favor, cuéntamelo y dime ¿qué hace?

+7

FYI en Windows:^no funciona como se esperaba en el shell de DOS. Usa git bash shell y luego funciona. –

+5

Eso ni siquiera se me ocurrió cuando intenté usarlo (adivinando lo que significa). El símbolo de intercalación ('^') es el carácter de escape en cmd.exe. Cada vez que traté de usarlo para ver si sería útil, en realidad no estaba aprobando nada, lo que explica por qué los resultados nunca fueron diferentes. > _> Stupid cmd.exe. Puede escapar duplicando o citando: 'git log master ^^' o 'git log" master^"' – bambams

Respuesta

100

HEAD^ significa el primer elemento primario de la sugerencia de la rama actual.

Recuerde que las confirmaciones de git pueden tener más de un padre. HEAD^ es la abreviatura de HEAD^1, y también puede dirigirse a HEAD^2 y así sucesivamente según corresponda.

Puede contactar con los padres de cualquier compromiso, no solo HEAD. También puede retroceder a través de las generaciones: por ejemplo, master~2 significa el abuelo de la punta de la rama principal, favoreciendo al primer padre en caso de ambigüedad. Estos especificadores se pueden encadenar arbitrariamente , , p., topic~3^2.

Para los detalles, véase la sección de “Specifying Revisions”git rev-parse --help.

+1

Pero luego, en la historia lineal, ¿por qué 'HEAD ^^^' devuelve el tercer commit más antiguo es decir, es equivalente a 'HEAD ~~~'? – Vorac

+1

@Vorac Para la historia lineal, sí. –

7

El símbolo de intercalación se refiere al padre de una confirmación en particular. P.ej. HEAD^ se refiere al padre del comandante HEAD actual. (también, HEAD^^ se refiere a los abuelos).

19

Significa "padre de". Entonces HEAD^ significa "el padre de la CABEZA actual". Incluso puede encadenarlos juntos: HEAD^^ significa "el padre del padre de la CABEZA actual" (es decir, el abuelo de la CABEZA actual), HEAD^^^ significa "el padre del padre del padre de la CABEZA actual", y así adelante.

3

El quilate representa un desplazamiento de compromiso (principal). Así, por ejemplo, HEAD^ significa "una confirmación desde HEAD" y HEAD^^^ significa "tres confirmaciones de HEAD".

4

El (^) obtiene el origen padre del comando, es decir, HEAD^obtendrá el padre de HEAD.

1

Greg Bacon dio un gran enlace, pero es bastante denso. Los documentos introductorios Git en línea también introducen revisión y alcance especificadores:

https://git-scm.com/book/en/v2/Git-Tools-Revision-Selection

+3

Este enlace puede estar más cerca de la ubicación prevista. http://git-scm.com/book/en/v2/Git-Tools-Revision-Selection#Ancestry-References – bholben

5

El ^ (intercalación) también se puede utilizar cuando specifying ranges.

Para excluir comete accesible desde una confirmación, un prefijo^notación es utilizado. P.ej.^r1 r2 significa compromisos alcanzables desde r2 pero excluye los que están accesibles desde r1.

<rev>

Incluir commit que son accesibles a partir de (es decir antepasados ​​de).

^<rev>

Excluir commit que son accesibles a partir de (es decir antepasados ​​de).

4

Aquí hay una explicación visual. Suponga que tiene una historia de esta manera:

   master 

    A <- B <- C <- D 
     /
    E <- F 
      feature 

Cuando la función se fusionó con maestría, C fue creado con dos antepasados. Git asigna los números de estos ancestros. El antepasado de la línea principal B se le asigna 1 y el antepasado característica F se asigna 2.

Así C^1 refiere a B y C^2 se refiere a F. C^ es un alias para C^1.

Solo utilizará <rev>^3. si hubieras realizado una fusión de tres ramas.

Cuestiones relacionadas