¿Qué significa el carácter de intercalación (^)?

124

Vi una respuesta a una pregunta aquí que ayuda a restaurar un archivo eliminado en git.

La solución fue

git checkout <deleting_commit>^ -- <deleted_file_path>

¿Qué hace el carácter de intercalación ( ^)? Lo he visto en otros lugares haciendo cosas muy útiles en git. Es mágico. ¿Alguien me lo estropea y me dice lo que hace?

Charles Ma
fuente
8
Para su información en Windows: ^ no funciona como se esperaba en el shell de DOS. Usa git bash shell y luego funciona.
Cincinnati Joe
55
Eso ni siquiera se me ocurrió cuando intenté usarlo (adivinando lo que significa). El caret ( ^) es el carácter de escape en cmd.exe. Cada vez que intenté usarlo para ver si sería útil, en realidad no pasaba nada, lo que explica por qué los resultados nunca fueron diferentes. > _> Estúpido cmd.exe. Puedes escapar duplicándolo o citándolo: git log master^^ogit log "master^"
bambams

Respuestas:

138

HEAD^ significa el primer padre de la punta de la rama actual.

Recuerda que git commits puede tener más de un padre. HEAD^es la abreviatura de HEAD^1, y también puede abordar, HEAD^2etc., según corresponda.

Puede llegar a los padres de cualquier compromiso, no solo HEAD. También puede retroceder de generación en generación: por ejemplo, master~2significa el abuelo de la punta de la rama maestra, favoreciendo al primer padre en casos de ambigüedad. Estos especificadores pueden encadenarse arbitrariamente, por ejemplo , topic~3^2. Ver la respuesta relacionada a ¿Cuál es la diferencia entre HEAD^y HEAD~en Git?

Para obtener todos los detalles, consulte la sección "Especificación de revisiones" de git rev-parse --help.

Greg Bacon
fuente
1
Pero entonces, en la historia lineal, ¿por qué HEAD^^^devuelve la tercera confirmación anterior, es decir, es equivalente a HEAD~~~?
Vorac
1
@Vorac Para la historia lineal, sí.
Greg Bacon
21

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

mipadi
fuente
16

El ^(caret) también se puede usar al especificar rangos .

Para excluir confirmaciones accesibles desde una confirmación, se usa una notación de prefijo ^ . Por ejemplo, ^ r1 r2 significa confirmaciones alcanzables desde r2 pero excluye las accesibles desde r1.

<rev>

Incluir confirmaciones a las que se pueda acceder (es decir, antepasados ​​de)

^ <rev>

Excluir confirmaciones a las que se pueda acceder (es decir, antepasados ​​de).

cmcginty
fuente
10

Aquí hay una explicación visual. Supongamos que tiene una historia como esta:

                      master  
  ... <- B <- C <- D
             /
... <- E <- F
              feature

Cuando la característica se fusionó en maestra, Cse creó con dos antepasados. Git asigna estos números de antepasados. Al ancestro de la línea principal Bse le asigna 1 y al ancestro de la característica Fse le asigna 2.

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

Solo lo usarías alguna vez <rev>^3. si hubieras realizado una fusión de tres ramas.

cdosborn
fuente
7

El cursor se refiere al padre de un compromiso particular. Por ejemplo, se HEAD^refiere al padre del comité HEAD actual. (también, se HEAD^^refiere al abuelo).

mopoke
fuente
4

El quilate representa un desplazamiento de confirmación (primario). Entonces, por ejemplo, HEAD^significa "una confirmación de HEAD" y HEAD^^^significa "tres confirmaciones de HEAD".

Ámbar
fuente
4

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

CHICO ALTO
fuente