Corrigir erros simples

Concluído

Por vezes, as coisas correm mal. Você pode esquecer de adicionar um novo arquivo, ou talvez você adicionar um arquivo por engano. Talvez tenha cometido um erro ortográfico no seu último compromisso ou tenha cometido algo que não pretendia. Pode ter eliminado acidentalmente um ficheiro.

O Git permite-lhe fazer alterações sem receios, pois oferece sempre uma forma de voltar ao ponto onde estava. Pode até alterar o histórico de consolidação do Git desde que altere apenas as consolidações que não foram partilhadas.

Alterar um compromisso: --Alterar bandeira

No exercício anterior, você atualizou o arquivo de index.html para modificar o caminho para a folha de estilos. Você deveria ter adicionado a seguinte declaração:

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

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

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

Quando atualizar a página no browser, repara que não foi aplicada a folha de estilos CSS. Depois de investigar, você percebe que inseriu os valores de caminho incorretamente.

Assim, você atualiza index.html com o caminho correto para a folha de estilos. Neste ponto, você pode simplesmente confirmar a versão corrigida do index.html, mas em vez disso, você prefere colocá-lo no mesmo commit que o original. A --amend opção para git commit permitir que você altere o histórico (e com que frequência alguém tem a chance de mudar o histórico?).

git commit --amend --no-edit

A opção --no-edit indica ao Git para fazer a alteração sem alterar a mensagem de consolidação. Você também pode usar --amend para editar uma mensagem de confirmação, para adicionar arquivos que foram acidentalmente deixados de fora da confirmação ou para remover arquivos que foram adicionados por engano.

Nota

A capacidade de alterar o histórico é uma das funcionalidades mais avançadas do Git. Tal como acontece com a maioria das ferramentas elétricas, deve usá-lo com cuidado. Em particular, é uma má ideia alterar quaisquer commits que tenham sido compartilhados com outro desenvolvedor ou que tenham sido 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 quebrou todo o projeto, então você deseja reverter para a versão anterior desse arquivo. Também pode ter eliminado acidentalmente um ficheiro. O Git torna mais fácil obter uma versão anterior, mesmo que a versão atual já não exista. Seu melhor amigo nesta 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 corresponder à versão no índice ou na árvore especificada.

Se você excluiu acidentalmente um arquivo, pode recuperá-lo trazendo a versão do índice de volta para a árvore de trabalho usando este comando:

git checkout -- <file_name>

Você também pode fazer check-out de um arquivo de uma confirmação anterior (normalmente, o chefe de outra ramificação), mas o padrão é obter o arquivo do índice. -- na lista de argumentos serve para separar a consolidação da lista de caminhos de ficheiro. Não é estritamente necessário neste caso, mas se você tivesse uma ramificação chamada <file_name> (talvez porque esse é o nome do arquivo que está sendo trabalhado nessa ramificação), -- evitaria que o Git ficasse confuso.

Mais tarde, você aprenderá que também usa checkout para alternar ramificações.

Recuperar ficheiros: git reset

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

Então, se você executou este comando:

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

O Git não restaura o index.html! Em vez disso, você receberia um erro como este exemplo:

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

Para recuperar index.html, teríamos que usar uma técnica diferente: git reset. Você pode usar git reset para desorganizar alterações.

Você pode recuperá index.html usando estes dois comandos:

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

Aqui, git reset anula a preparação da eliminação do ficheiro do Git. Este comando traz o arquivo de volta ao índice, mas o arquivo ainda é excluído no disco. Em seguida, você pode restaurá-lo para o disco a partir do índice usando git checkout.

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

Reverter uma confirmação: git revert

O último comando importante a conhecer para corrigir erros com o Git é git revert. git checkout funciona apenas em situações em que as alterações a desfazer estão no índice. Depois de confirmar as alterações, você precisa usar uma estratégia diferente para desfazê-las. Neste caso, podemos usar git revert para reverter nossa confirmação anterior. Ele funciona fazendo outra confirmação que cancela a primeira confirmação.

Podemos usar git revert HEAD para fazer um compromisso que é exatamente o oposto do nosso último compromisso, desfazendo o compromisso anterior enquanto deixamos toda a história intacta. A HEAD parte do comando apenas diz ao Git que queremos "desfazer" apenas o último commit.

Além disso, você também pode remover a confirmação mais recente usando o git reset comando:

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, ele também move HEAD, se você especificar uma confirmação diferente. A --soft opção se move HEAD apenas e deixa o índice e a árvore de trabalho inalterados. Esta opção deixa todas as suas alterações como "alterações a serem confirmadas", como git status se poderia dizer. Uma --hard redefinição altera o índice e a árvore de trabalho para corresponder à confirmação especificada, todas as alterações feitas nos arquivos rastreados são descartadas.