Que signifie le caractère caret (^)?

125

J'ai vu une réponse à une question ici qui aide à restaurer un fichier supprimé dans git.

La solution était

git checkout <deleting_commit>^ -- <deleted_file_path>

Que fait le caractère d'insertion ( ^)? Je l'ai vu ailleurs faire des choses très utiles dans git. C'est magique. Quelqu'un, s'il vous plaît, gâche-le pour moi et dis-moi ce que ça fait?

Charles Ma
la source
9
Pour info sous Windows: ^ ne fonctionne pas comme prévu dans le shell DOS. Utilisez le shell git bash et cela fonctionne.
Cincinnati Joe
5
Cela ne m'est même pas venu à l'esprit lorsque j'ai essayé de l'utiliser (deviner ce que cela signifie). Le signe caret ( ^) est le caractère d'échappement dans cmd.exe. Chaque fois que j'ai essayé de l'utiliser pour voir si cela serait utile, je ne passais rien, ce qui explique pourquoi les résultats n'ont jamais été différents. > _> Stupid cmd.exe. Vous pouvez y échapper en le doublant ou en le citant: git log master^^ougit log "master^"
bambams

Réponses:

138

HEAD^ signifie le premier parent de la pointe de la branche courante.

N'oubliez pas que les commits git peuvent avoir plus d'un parent. HEAD^est l'abréviation de HEAD^1, et vous pouvez également adresser HEAD^2et ainsi de suite si nécessaire .

Vous pouvez contacter les parents de n'importe quel engagement, pas seulement HEAD. Vous pouvez également reculer de générations: par exemple, on master~2entend le grand-parent de la pointe de la branche maître, privilégiant le premier parent en cas d'ambiguïté. Ces spécificateurs peuvent être enchaînées de façon arbitraire, par exemple , topic~3^2. Voir la réponse associée à Quelle est la différence entre HEAD^et HEAD~dans Git?

Pour plus de détails, reportez-vous à la section «Spécification des révisions» de git rev-parse --help.

Greg Bacon
la source
1
Mais alors, sur l'histoire linéaire, pourquoi HEAD^^^retourne-t-il le troisième commit plus ancien c'est-à-dire qu'il équivaut à HEAD~~~?
Vorac
1
@Vorac Pour l'histoire linéaire, oui.
Greg Bacon
21

Cela signifie «parent de». Donc HEAD^signifie "le parent de la tête actuelle". Vous pouvez même les enchaîner: HEAD^^signifie "le parent du parent du HEAD actuel" (c'est-à-dire le grand-parent du HEAD actuel), HEAD^^^signifie "le parent du parent du parent du HEAD actuel", et ainsi de suite.

mipadi
la source
16

Le ^(caret) peut également être utilisé lors de la spécification de plages .

Pour exclure les commits accessibles à partir d'un commit, une notation préfixe ^ est utilisée. Par exemple, ^ r1 r2 signifie commits accessibles depuis r2 mais exclut ceux accessibles depuis r1.

<rev>

Inclut les commits accessibles depuis (c'est-à-dire les ancêtres de).

^ <rev>

Excluez les commits accessibles depuis (c'est-à-dire les ancêtres de).

cmcginty
la source
10

Voici une explication visuelle. Supposons que vous ayez une histoire comme celle-ci:

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

Lorsque la fonctionnalité a été fusionnée dans maître, a Cété créée avec deux ancêtres. Git attribue ces numéros d'ancêtres. L'ancêtre de la ligne principale Breçoit 1 et l'ancêtre de la fonction F2.

Ainsi se C^1réfère Bet se C^2réfère à F. C^est un alias pour C^1.

Vous ne l'utiliseriez jamais <rev>^3. si vous aviez effectué une fusion de trois branches.

cdosborn
la source
7

Le signe curseur fait référence au parent d'un commit particulier. Par exemple, HEAD^fait référence au parent de la validation HEAD actuelle. (fait également HEAD^^référence au grand-parent).

mopoke
la source
4

Le carat représente un décalage de validation (parent). Ainsi, par exemple, HEAD^signifie "un commit de HEAD" et HEAD^^^signifie "trois commits de HEAD".

ambre
la source
4

Le (^) récupère la source parent de la commande, c'est-à-dire HEAD ^ obtiendra le parent de HEAD.

GRAND GARÇON
la source