1
resposta

Git reset --hard X Git checkout --<file>

Boa tarde a todos! Espero que estejam bem. A minha dúvida é bem simples:

O professor nos mostrou que antes mesmo de darmos um git add podemos descartar as mudanças feitas no código com o git checkout --file, numa pesquisada consegui reparar que os efeitos são bem similares a outro comando que também serve para apagar um commit mesmo que já esteja no staged, ogit reset --hard. Qual a diferença entre esses dois comandos então?

1 resposta

Oiê! Tudo certo por aí?

O git checkout -- [file] desfaz modificações que ainda não foram adicionadas ao stage (etapa de preparação para commitar uma mudança), o que significa dizer que o comando git add ainda não foi executado.

Enquanto o comando visto anteriormente lida com arquivos, o git reset --hard, por outro lado, trabalha com os commits do nosso projeto. Por meio dele, retornamos a um ponto específico do nosso histórico e, consequentemente, ocorre a perda de todos os commits feitos ao longo desse caminho. Por esse motivo, git reset --hard é perigoso e, se possível, deve ser evitado.

Abaixo há um exemplo ilustrativo disso:

Desenho comparando o uso do comando “Git reset --hard”. Na parte superior, há o título “Git reset --hard”. Logo abaixo, no lado esquerdo, há o subtítulo “Antes” e o desenho de quatro círculos conectados por setas que apontam para a esquerda, representando os commits; os três primeiros círculos estão na cor cinza enquanto o último, na cor verde; abaixo do último círculo há dois retângulo: um laranja escrito “master” e outro verde, em que está escrito “HEAD”. No lado direito, há o subtítulo “Depois” e o desenho de quatro círculos, representando os commits; o primeiro círculo é cinza; o segundo é verde e contém um retângulo laranja escrito “master” e um retângulo verde escrito “HEAD”; os dois últimos círculos são vazados e possuem borda tracejada.

Note que, depois de realizar git reset --hard para o hash 8a4fc73 (número gerado aleatoriamente para servir de referência ao commit), os dois commits mais a direita estão diferentes, com um tracejado em volta e sem coloração, indicando que não existem mais.

Caso o objetivo fosse usar o comando git reset em um arquivo, o parâmetro --hard não precisaria ser adicionado e a ideia continuaria sendo a mesma: ao digitar git add, seria usado o git reset para retirar a mudança feita do stage.

Com isso, percebemos que, embora semelhantes, git checkout e git reset possuem diferenças, cuja principal é que no primeiro caso a modificação ainda não foi adicionada ao stage (através do git add), ao passo que no segundo, foi.

Espero que tenha compreendido minha explicação! Fico à disposição para te ajudar no que for preciso!

Grande abraço e até mais!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓.