Há várias respostas aqui com um equívoco sobre git reset --soft
. Embora exista uma condição específica na qual git reset --soft
apenas será alterada HEAD
(a partir de um estado principal desanexado), normalmente (e para o uso pretendido), ela move a referência de ramificação que você efetuou check-out no momento. Obviamente, isso não pode ser feito se você não tiver uma ramificação com check-out (daí a condição específica em git reset --soft
que apenas será alterada HEAD
).
Eu descobri que essa é a melhor maneira de pensar git reset
. Você não está apenas se movendo HEAD
( tudo faz isso ), você também está se movendo no ramo ref , por exemplo master
,. Isso é semelhante ao que acontece quando você executa git commit
(o ramo atual se move junto HEAD
), exceto que, em vez de criar (e passar para) um novo commit, você passa para um commit anterior .
Esse é o objetivo de reset
alterar uma ramificação para algo diferente de um novo commit, não mudar HEAD
. Você pode ver isso no exemplo da documentação:
Desfazer uma confirmação, tornando-a uma ramificação de tópico
$ git branch topic/wip (1)
$ git reset --hard HEAD~3 (2)
$ git checkout topic/wip (3)
- Você fez alguns commits, mas percebe que eles eram prematuros para estar no ramo "master". Você deseja continuar polindo-os em uma ramificação de tópico, portanto, crie uma ramificação "topic / wip" fora do HEAD atual.
- Rebobine o ramo principal para se livrar desses três commits.
- Mude para a seção "topic / wip" e continue trabalhando.
Qual é o objetivo dessa série de comandos? Você deseja mover uma ramificação para cá master
, enquanto faz o master
check-out, executa git reset
.
A resposta mais votada aqui geralmente é boa, mas pensei em acrescentar isso para corrigir as várias respostas com conceitos errôneos.
Mude sua filial
git reset --soft <ref>
: redefine o ponteiro da ramificação atualmente registrada para o commit na referência especificada <ref>
. Os arquivos no diretório e índice de trabalho não são alterados. A confirmação desse estágio o levará de volta para onde você estava antes do git reset
comando.
Mude também o seu índice
git reset --mixed <ref>
ou equivalente
git reset <ref>
:
Faz o --soft
que AND também redefine o índice para corresponder à confirmação na referência especificada. Enquanto git reset --soft HEAD
não faz nada (porque diz mover a ramificação com check-out para a ramificação com check-out), git reset --mixed HEAD
ou equivalente git reset HEAD
, é um comando comum e útil, pois redefine o índice para o estado do seu último commit.
Mude também o seu diretório de trabalho
git reset --hard <ref>
: faz o --mixed
que AND também substitui seu diretório de trabalho. Este comando é semelhante a git checkout <ref>
, exceto que (e este é o ponto crucial sobre reset
) todas as formas de git reset
movimento para as quais a referência do ramo HEAD
está apontando.
Uma observação sobre "tal e tal comando move o HEAD":
Não é útil dizer que um comando move o HEAD
. Qualquer comando que muda onde você está no seu histórico de consolidação move o HEAD
. Isso é o que HEAD
é , um ponteiro para onde você estiver. HEAD
é você , e assim se moverá sempre que você o fizer.