Corrigir erros simples

Concluído

Às vezes, as coisas dão errado. Você pode esquecer de adicionar um novo arquivo ou talvez adicionar um arquivo por engano. Talvez você tenha cometido um erro de ortografia no último commit ou tenha confirmado algo que não pretendia. Talvez você tenha excluído acidentalmente um arquivo.

O Git permite que você faça alterações sem receios, pois sempre oferece uma maneira de voltar ao local em que estava. Você pode, até mesmo, alterar o histórico de commits do Git, desde que altere somente os commits que não foram compartilhados.

Corrigir um commit: sinalizador --amend

No exercício anterior, você atualizou o arquivo index.htm para modificar o caminho para a folha de estilos. Você deverá ter adicionado a seguinte instrução:

<link rel="stylesheet" href="CSS/site.css">

Suponha que você descubra que cometeu um erro quando inseriu a instrução. Em vez de especificar o caminho da pasta como CSS, você inseriu CS:

<link rel="stylesheet" href="CS/site.css">

Quando você atualiza a página no navegador, percebe que a folha de estilos CSS não é aplicada. Depois de investigar isso, você percebe que inseriu os valores de caminho incorretamente.

Portanto, você atualiza index.html com o caminho correto para a folha de estilos. Neste ponto, você pode simplesmente fazer commit da versão corrigida de index.html, mas, em vez disso, prefere colocá-la no mesmo commit da original. A opção --amend de git commit permite que você altere o histórico (e com que frequência uma pessoa tem a chance de alterar o histórico?).

git commit --amend --no-edit

A opção --no-edit instrui o Git a fazer a alteração sem alterar a mensagem de commit. Use também --amend para editar uma mensagem de commit, adicionar arquivos acidentalmente deixados fora do commit ou remover arquivos que foram adicionados por engano.

Observação

A capacidade de alterar o histórico é um dos recursos mais avançados do Git. Assim como a maioria das ferramentas elétricas, você deve usá-lo com cuidado. Em particular, é uma péssima ideia alterar os commits que foram compartilhados com outro desenvolvedor ou que foram publicados em um repositório compartilhado, como o GitHub.

Recuperar um arquivo excluído: git checkout

Imagine que você fez uma alteração em um arquivo de código-fonte que desfez todo o projeto e, portanto, deseja reverter esse arquivo para a versão anterior. Ou talvez tenha excluído acidentalmente um arquivo. O Git facilita a recuperação de uma versão anterior, mesmo que a versão atual não exista mais. Seu melhor amigo nessa situação é o comando git checkout.

git checkout tem vários usos, mas no próximo exercício, vamos usá-lo para recuperar um arquivo excluído. git checkout atualiza os arquivos na árvore de trabalho para que correspondam à versão no índice ou na árvore especificada.

Se você excluiu acidentalmente um arquivo, recupere-o trazendo a versão do índice de volta à árvore de trabalho com este comando:

git checkout -- <file_name>

Você também pode fazer check-out de um arquivo de um commit anterior (normalmente, o principal de outro branch), mas o padrão é obter o arquivo do índice. O -- na lista de argumentos serve para separar o commit da lista de caminhos de arquivos. Isso não é estritamente necessário nesse caso, mas se você tiver um branch chamado <> (talvez porque esse é o nome do arquivo que está sendo trabalhado nesse branch), -- impedirá que o Git fique confuso.

Posteriormente, você aprenderá também a usar checkout para alternar os branches.

Recuperar arquivos: git reset

Você também pode excluir um arquivo usando git rm. Esse comando exclui o arquivo em disco e faz com que o Git registre a exclusão do arquivo no índice.

Portanto, se você executou este comando:

git rm index.html
git checkout -- index.html

O Git não restaurará index.html. Em vez disso, você receberá um erro como este exemplo:

error: pathspec 'index.html' did not match any file(s) known to git.

Para recuperar index.html, precisaremos usar uma técnica diferente: git reset. Você pode usar git reset para remover o preparo das alterações.

Recupere o index.html com estes dois comandos:

git reset HEAD index.html
git checkout -- index.html

Aqui, git reset remove o preparo da exclusão de arquivo do Git. Esse comando traz o arquivo de volta ao índice, mas o arquivo ainda está excluído em disco. Em seguida, você pode restaurá-lo no disco por meio do índice usando git checkout.

Aqui está outro momento "Aha!" para novos usuários do Git. Muitos VCSs tornam os arquivos somente leitura para garantir que apenas uma pessoa por vez possa fazer alterações. Os usuários usam um comando checkout não relacionado para obter uma versão gravável do arquivo. Eles também usam checkin para uma operação semelhante ao que o Git faz com uma combinação de add, commit e push. Esse fato ocasionalmente causa confusão quando as pessoas começam a usar o Git.

Reverter um commit: git revert

O último comando importante a ser conhecido para corrigir erros com o Git é git revert. git checkout só funciona em situações em que as alterações a serem desfeitas estão no índice. Depois de fazer commit das alterações, você precisará usar outra estratégia para desfazê-las. Nesse caso, podemos usar git revert para reverter o commit anterior. Ele funciona fazendo outro commit que cancela o primeiro.

Podemos usar git revert HEAD para fazer um commit exatamente oposto ao último commit, desfazendo o commit anterior, mas deixando todo o histórico intacto. A parte HEAD do comando apenas informa o Git de que só queremos "desfazer" o último commit.

Além disso, você pode remover o commit mais recente usando o comando git reset:

git reset --hard HEAD^

O Git oferece vários tipos de redefinições. O padrão é --mixed, que redefine o índice, mas não a árvore de trabalho; também moverá HEAD se você especificar outro commit. A opção --soft só move HEAD e mantém o índice e a árvore de trabalho inalterados. Essa opção mantém todas as alterações como "alterações a serem confirmadas", como indicado em git status. Uma redefinição --hard altera o índice e a árvore de trabalho para que correspondam ao commit especificado. As alterações feitas nos arquivos com controle de alterações são descartadas.