A que esses símbolos se referem e o que eles significam?
(Não consigo encontrar nenhuma explicação na documentação oficial)
HEAD
e ORIG_HEAD
no Git são como $PWD
e $OLDPWD
no Bash. :)
A que esses símbolos se referem e o que eles significam?
(Não consigo encontrar nenhuma explicação na documentação oficial)
HEAD
e ORIG_HEAD
no Git são como $PWD
e $OLDPWD
no Bash. :)
Respostas:
HEAD
é (direta ou indireta, ie simbólica) referência ao commit atual. É uma confirmação que você verificou no diretório de trabalho (a menos que você tenha feito algumas alterações, ou equivalente), e é uma confirmação sobre a qual "git commit" criaria uma nova. Geralmente HEAD
é uma referência simbólica a algum outro ramo nomeado; este ramo está atualmente com check-out ramo ou ramo atual. HEAD
também pode apontar diretamente para um commit; esse estado é chamado "HEAD desanexado" e pode ser entendido como estando em uma ramificação anônima e sem nome.
E @
sozinho é um atalho para HEAD
, desde o Git 1.8.5
ORIG_HEAD
é o estado anterior de HEAD
, definido por comandos que possuem um comportamento possivelmente perigoso, para ser fácil revertê-los. É menos útil agora que o Git possui reflog: HEAD@{1}
é aproximadamente equivalente a ORIG_HEAD
( HEAD@{1}
é sempre o último valor de HEAD
, ORIG_HEAD
é o último valor HEAD
antes de uma operação perigosa).
Para obter mais informações, leia a página de manual do git (1) , o Manual do Usuário do Git , o Git Community Book e o Git Glossary
HEAD
e ORIG_HEAD
).
Do git reset
"puxar" ou "mesclar" sempre deixa a ponta original da ramificação atual em
ORIG_HEAD
.
git reset --hard ORIG_HEAD
A redefinição difícil traz o arquivo de índice e a árvore de trabalho de volta para esse estado e redefine a ponta do ramo para esse commit.
git reset --merge ORIG_HEAD
Após inspecionar o resultado da mesclagem, você pode achar que a alteração na outra ramificação não é satisfatória. A execução "
git reset --hard ORIG_HEAD
" permitirá que você volte para onde estava, mas descartará as alterações locais, que você não deseja. "git reset --merge
" mantém suas alterações locais.
Antes que qualquer correção seja aplicada, ORIG_HEAD é definido na ponta da ramificação atual.
Isso é útil se você tiver problemas com várias confirmações, como executar 'git am
' na ramificação errada ou um erro nas confirmações que é mais facilmente corrigido alterando a caixa de correio (por exemplo, + erros nas linhas "De:").Além disso, a mesclagem sempre define '
.git/ORIG_HEAD
' para o estado original de HEAD, para que uma mesclagem problemática possa ser removida usando 'git reset ORIG_HEAD
'.
Nota: daqui
HEAD é um ponteiro em movimento. Às vezes, significa o ramo atual, às vezes não.
Portanto, HEAD NÃO é sinônimo de "ramificação atual" em todos os lugares.
HEAD significa "atual" em todos os lugares no git, mas não significa necessariamente "ramo atual" (isto é, HEAD desanexado).
Mas quase sempre significa o "commit atual".
É o commit "git commit
" construído sobre, e "git diff --cached
" e "git status
" comparam.
Significa a ramificação atual apenas em contextos muito limitados (exatamente quando queremos que um nome de ramificação opere --- redefinindo e aumentando a ponta da ramificação via commit / rebase / etc.).O reflog é um veículo para voltar no tempo e as máquinas do tempo têm uma interação interessante com a noção de "atual".
HEAD@{5.minutes.ago}
pode significar "desreferência HEAD symref para descobrir em que ramo estamos agora e depois descobrir onde estava a ponta desse ramo 5 minutos atrás".
Como alternativa, isso poderia significar "qual é o commit que eu chamaria de HEAD 5 minutos atrás, por exemplo, se eu" git show HEAD "naquela época".
git1.8.4 (julho de 2013) introduz introduziu uma nova notação!
(na verdade, será para 1.8.5 ou 1.9, quarto trimestre de 2013: reintroduzido com o commit 9ba89f4 )
Em vez de digitar quatro letras maiúsculas "
HEAD
", você pode dizer "@
" agora,
por exemplo "git log @
".
Consulte commit cdfd948
Digitar '
HEAD
' é entediante, especialmente quando podemos usar '@
'.A razão para escolher '
@
' é que ela segue naturalmente aref@op
sintaxe (por exemplo,HEAD@{u}
), exceto que não temos ref, e nenhuma operação, e quando não as temos, faz sentido supor "HEAD
".Então agora podemos usar '
git show @~1
', e toda essa bondade.Até agora '
@
' era um nome válido, mas entra em conflito com essa ideia, então vamos torná-la inválida. Provavelmente muito poucas pessoas, se houver, usaram esse nome.
Um post no período 1.8.4-RC3 (14, agosto de 2013) anunciou que esse recurso foi revertido e atrasou (Obrigado Cupcake para o heads-up ).
Novamente, ele é apresentado novamente com o commit 9ba89f4 (setembro de 2013).
Consulte commit 2c2b664 :
@
atalho para HEAD
"Isso reverte o commit cdfd948 , pois ele não se aplica apenas a "
@
" (e se forma com modificadores como o@{u}
aplicado), mas também afeta, por exemplo, "refs/heads/@/foo
", o que não deveria.A idéia básica de fornecer uma mão abreviada pode ser boa, e o tópico pode ser tentado novamente mais tarde, mas vamos reverter para evitar afetar os casos de uso existentes por enquanto para a próxima versão.
git reset
gerará a ORIG_HEAD
. Então você precisa fazer rm
isso manualmente. Consulte stackoverflow.com/a/12418078/6309, por exemplo.
@
alias para HEAD
está sendo revertido (temporariamente?) Para a versão Git 1.8.4 ! Foi anunciado hoje!
Meu entendimento é que o HEAD aponta o ramo atual, enquanto ORIG_HEAD é usado para armazenar o HEAD anterior antes de executar operações "perigosas".
Por exemplo, git-rebase e git-am registram a ponta original da ramificação antes de aplicar qualquer alteração.
git branch foo -b
para "criar" um ramo para os órfãos que confirmam.
De man 7 gitrevisions
:
HEAD nomeia o commit no qual você baseou as alterações na árvore de trabalho. FETCH_HEAD registra a ramificação que você buscou em um repositório remoto com sua última chamada de busca git. ORIG_HEAD é criado por comandos que movem seu HEAD de maneira drástica, para registrar a posição do HEAD antes da operação, para que você possa alterar facilmente a ponta do ramo de volta ao estado antes de executá-los. MERGE_HEAD registra os commits que você está mesclando em sua ramificação quando você executa o git merge. CHERRY_PICK_HEAD registra o commit que você seleciona quando executa o git cherry-pick.
HEAD
é agora (próximo git1.8.4) '@
'! Veja minha resposta editada abaixo