Há várias respostas aqui com um equívoco sobre git reset --soft. Embora exista uma condição específica na qual git reset --softapenas 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 --softque 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 resetalterar 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 mastercheck-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 resetcomando.
Mude também o seu índice
git reset --mixed <ref>
ou equivalente
git reset <ref>:
Faz o --softque AND também redefine o índice para corresponder à confirmação na referência especificada. Enquanto git reset --soft HEADnão faz nada (porque diz mover a ramificação com check-out para a ramificação com check-out), git reset --mixed HEADou 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 --mixedque 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 resetmovimento para as quais a referência do ramo HEADestá 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.