Cosa significa il carattere accento circonflesso (^)?


125

Ho visto una risposta a una domanda qui che aiuta a ripristinare un file eliminato in git.

La soluzione era

git checkout <deleting_commit>^ -- <deleted_file_path>

Cosa fa il carattere accento circonflesso ( ^)? L'ho visto altrove fare cose molto utili in git. È magico. Qualcuno, per favore, me lo rovini e mi dica cosa fa?


9
FYI su Windows: ^ non funziona come previsto nella shell DOS. Usa git bash shell e poi funziona.
Cincinnati Joe,

5
Non mi è nemmeno venuto in mente quando ho tentato di usarlo (indovinando cosa significa). L'accento circonflesso ( ^) è il carattere di escape in cmd.exe. Ogni volta che ho provato a usarlo per vedere se sarebbe stato utile, in realtà non stavo passando nulla, il che spiega perché i risultati non sono mai stati diversi. > _> Stupido cmd.exe. Puoi sfuggirgli raddoppiandolo o citandolo: git log master^^oppuregit log "master^"
bambams

Risposte:


138

HEAD^ significa il primo genitore della punta del ramo corrente.

Ricorda che git commit può avere più di un genitore. HEAD^è l'abbreviazione di HEAD^1, e puoi anche indirizzare HEAD^2e così via come appropriato.

Puoi raggiungere i genitori di qualsiasi impegno, non solo HEAD. Puoi anche tornare indietro di generazioni: ad esempio, master~2significa il nonno della punta del ramo principale, favorendo il primo genitore nei casi di ambiguità. Questi committenti possono essere concatenati arbitrariamente, ad esempio , topic~3^2. Vedi la risposta correlata a Qual è la differenza tra HEAD^e HEAD~in Git?

Per i dettagli completi, vedere la sezione "Specifica delle revisioni" di git rev-parse --help.


1
Ma allora, nella cronologia lineare, perché HEAD^^^restituisce il terzo commit più vecchio, ovvero è equivalente a HEAD~~~?
Vorac

1
@Vorac Per la storia lineare, sì.
Greg Bacon

21

Significa "genitore di". Quindi HEAD^significa "il genitore dell'attuale HEAD". Puoi anche concatenarli insieme: HEAD^^significa "il genitore del genitore dell'attuale HEAD" (cioè, il nonno dell'attuale HEAD), HEAD^^^significa "il genitore del genitore del genitore dell'attuale HEAD", e così via.


16

Il ^(caret) può essere utilizzato anche quando si specificano gli intervalli .

Per escludere i commit raggiungibili da un commit, viene utilizzata una notazione del prefisso ^ . Ad esempio ^ r1 r2 significa commit raggiungibili da r2 ma esclude quelli raggiungibili da r1.

<Rev>

Includere commit raggiungibili da (cioè antenati di).

^ <Rev>

Escludi commit che sono raggiungibili da (cioè antenati di).


10

Ecco una spiegazione visiva. Supponi di avere una storia come questa:

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

Quando la funzionalità è stata fusa in master, è Cstata creata con due antenati. Git assegna i numeri a questi antenati. All'antenato della linea principale Bviene assegnato 1 e all'antenato della funzione Fviene assegnato 2.

Così si C^1riferisce Be si C^2riferisce a F. C^è un alias per C^1.

Useresti sempre e solo <rev>^3. se avessi eseguito una fusione di tre rami.


7

Il cursore si riferisce al genitore di un particolare commit. Ad esempio, si HEAD^riferisce al genitore dell'attuale HEAD commmit. (inoltre, si HEAD^^riferisce ai nonni).


4

Il carato rappresenta un offset di commit (genitore). Quindi, ad esempio, HEAD^significa "un commit da HEAD" e HEAD^^^significa "tre commit da HEAD".


4

Il (^) ottiene la sorgente genitore del comando, cioè HEAD ^ otterrà il genitore di HEAD.


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.