O que significa o caractere de sinal de intercalação (^)?

124

Vi uma resposta para uma pergunta aqui que ajuda a restaurar um arquivo excluído no git.

A solução foi

git checkout <deleting_commit>^ -- <deleted_file_path>

O que o caractere de sinal de intercalação ( ^) faz? Eu já vi isso em outros lugares fazendo coisas muito úteis no git. Isso é mágico. Alguém, por favor, estrague tudo para mim e me diga o que faz?

Charles Ma
fonte
8
FYI no Windows: ^ não funciona como esperado no shell do DOS. Use git bash shell e então ele funciona.
Cincinnati Joe
5
Isso nem me ocorreu quando tentei usá-lo (adivinhando o que isso significa). O sinal de intercalação ( ^) é o caractere de escape no cmd.exe. Toda vez que tentei usá-lo para ver se seria útil, na verdade não estava passando nada, o que explica por que os resultados nunca foram diferentes. > _> Cmd.exe estúpido. Você pode fugir dela, dobrando-o ou citá-la: git log master^^ougit log "master^"
BamBams

Respostas:

138

HEAD^ significa o primeiro pai da ponta do ramo atual.

Lembre-se de que as confirmações do git podem ter mais de um pai. HEAD^é a abreviação de HEAD^1, e você também pode abordar HEAD^2e assim por diante, conforme apropriado.

Você pode chegar aos pais de qualquer confirmação, não apenas HEAD. Você também pode voltar através de gerações: por exemplo, master~2significa o avô da ponta do ramo principal, favorecendo o primeiro pai em casos de ambiguidade. Estes especificadores podem ser encadeadas arbitrariamente, por exemplo , topic~3^2. Veja a resposta relacionada a Qual é a diferença entre HEAD^e HEAD~no Git?

Para obter detalhes completos, consulte a seção "Especificando revisões" em git rev-parse --help.

Greg Bacon
fonte
1
Mas então, na história linear, por que HEAD^^^retornar o terceiro commit mais antigo, ou seja, é equivalente HEAD~~~?
Vorac
1
@Vorac Para a história linear, sim.
Greg Bacon
21

Significa "pai de". Então HEAD^significa "o pai da atual HEAD". Você pode até encadeá-los: HEAD^^significa "o pai do pai da atual HEAD" (ou seja, o avô da atual HEAD), HEAD^^^significa "o pai do pai da mãe atual" e assim por diante.

mipadi
fonte
16

O ^(sinal de intercalação) também pode ser usado ao especificar intervalos .

Para excluir confirmações acessíveis de uma confirmação, é usada uma notação de prefixo ^ . Por exemplo, ^ r1 r2 significa confirmações alcançáveis ​​a partir de r2, mas exclui as alcançáveis ​​a partir de r1.

<rev>

Inclua confirmações acessíveis a partir de (ou seja, ancestrais de).

^ <rev>

Excluir confirmações acessíveis de (ou seja, ancestrais de).

cmcginty
fonte
10

Aqui está uma explicação visual. Suponha que você tenha uma história assim:

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

Quando o recurso foi mesclado no mestre, Cfoi criado com dois ancestrais. O Git atribui esses números de ancestrais. O ancestral da linha principal Bé atribuído 1 e o ancestral do recursoF é atribuído 2.

Assim C^1se refere Be C^2se refere a F. C^é um alias para C^1.

Você só usaria <rev>^3. se você tivesse realizado uma mesclagem de três ramificações.

cdosborn
fonte
7

O sinal de intercalação refere-se ao pai de uma confirmação específica. Por exemplo, HEAD^refere-se ao pai do atual commit HEAD. (também, HEAD^^refere-se ao avô).

mopoke
fonte
4

O quilate representa um deslocamento de confirmação (pai). Por exemplo, HEAD^significa "um commit do HEAD" e HEAD^^^significa "três commits do HEAD".

Âmbar
fonte
4

O (^) obtém a fonte pai do comando, ie HEAD ^ obtém o pai de HEAD.

TALLBOY
fonte