Git - consertar erros
Errar é humano. Portanto, todo VCS oferece um recurso para corrigir erros até certo ponto. O Git fornece um recurso que podemos usar para desfazer as modificações feitas no repositório local.
Suponha que o usuário acidentalmente faça algumas alterações em seu repositório local e então queira desfazer essas alterações. Nesses casos, orevert operação desempenha um papel importante.
Reverter alterações não confirmadas
Suponhamos que Jerry modifique acidentalmente um arquivo de seu repositório local. Mas ele quer desfazer sua modificação. Para lidar com essa situação, podemos usar ogit checkoutcomando. Podemos usar este comando para reverter o conteúdo de um arquivo.
[[email protected] src]$ pwd
/home/jerry/jerry_repo/project/src
[[email protected] src]$ git status -s
M string_operations.c
[[email protected] src]$ git checkout string_operations.c
[[email protected] src]$ git status –s
Além disso, podemos usar o git checkoutcomando para obter um arquivo excluído do repositório local. Vamos supor que Tom exclua um arquivo do repositório local e que estejamos de volta. Podemos conseguir isso usando o mesmo comando.
[[email protected] src]$ pwd
/home/tom/top_repo/project/src
[[email protected] src]$ ls -1
Makefile
string_operations.c
[[email protected] src]$ rm string_operations.c
[[email protected] src]$ ls -1
Makefile
[[email protected] src]$ git status -s
D string_operations.c
Git está mostrando a carta Dantes do nome do arquivo. Isso indica que o arquivo foi excluído do repositório local.
[[email protected] src]$ git checkout string_operations.c
[[email protected] src]$ ls -1
Makefile
string_operations.c
[[email protected] src]$ git status -s
Note - Podemos realizar todas essas operações antes do commit.
Remover alterações da área de teste
Vimos que quando realizamos uma operação de adição, os arquivos são movidos do repositório local para a área de confirmação. Se um usuário modificar acidentalmente um arquivo e adicioná-lo à área de teste, ele pode reverter suas alterações, usando ogit checkout comando.
No Git, há um ponteiro HEAD que sempre aponta para o commit mais recente. Se você quiser desfazer uma alteração da área de teste, você pode usar o comando git checkout, mas com o comando checkout, você deve fornecer um parâmetro adicional, isto é, o ponteiro HEAD. O parâmetro adicional do ponteiro de confirmação instrui o comando git checkout a redefinir a árvore de trabalho e também a remover as alterações em estágios.
Vamos supor que Tom modifique um arquivo de seu repositório local. Se visualizarmos o status deste arquivo, ele mostrará que o arquivo foi modificado, mas não adicionado à área de teste.
[email protected] src]$ pwd
/home/tom/top_repo/project/src
# Unmodified file
[[email protected] src]$ git status -s
# Modify file and view it’s status.
[[email protected] src]$ git status -s
M string_operations.c
[[email protected] src]$ git add string_operations.c
O status do Git mostra que o arquivo está presente na área de teste, agora reverta-o usando o comando git checkout e visualize o status do arquivo revertido.
[[email protected] src]$ git checkout HEAD -- string_operations.c
[[email protected] src]$ git status -s
Move HEAD Pointer com Git Reset
Depois de fazer algumas alterações, você pode decidir removê-las. O comando reset do Git é usado para redefinir ou reverter alterações. Podemos realizar três tipos diferentes de operações de reinicialização.
O diagrama abaixo mostra a representação pictórica do comando reset do Git.
Suave
Cada branch possui um ponteiro HEAD, que aponta para o último commit. Se usarmos o comando reset do Git com a opção --soft seguida pelo ID do commit, ele irá resetar o ponteiro HEAD apenas sem destruir nada.
.git/refs/heads/masterarquivo armazena o ID de confirmação do ponteiro HEAD. Podemos verificar isso usando ogit log -1 comando.
[[email protected] project]$ cat .git/refs/heads/master
577647211ed44fe2ae479427a0668a4f12ed71a1
Agora, visualize o ID de confirmação mais recente, que corresponderá ao ID de confirmação acima.
[[email protected] project]$ git log -2
O comando acima produzirá o seguinte resultado.
commit 577647211ed44fe2ae479427a0668a4f12ed71a1
Author: Tom Cat <[email protected]>
Date: Wed Sep 11 10:21:20 2013 +0530
Removed executable binary
commit 29af9d45947dc044e33d69b9141d8d2dad37cc62
Author: Jerry Mouse <[email protected]>
Date: Wed Sep 11 10:16:25 2013 +0530
Added compiled binary
Vamos redefinir o ponteiro HEAD.
[[email protected] project]$ git reset --soft HEAD~
Agora, apenas zeramos o ponteiro HEAD em uma posição. Vamos verificar o conteúdo de.git/refs/heads/master file.
[[email protected] project]$ cat .git/refs/heads/master
29af9d45947dc044e33d69b9141d8d2dad37cc62
O ID de confirmação do arquivo foi alterado, agora verifique-o visualizando as mensagens de confirmação.
[email protected] project]$ git log -2
O comando acima produzirá o seguinte resultado.
commit 29af9d45947dc044e33d69b9141d8d2dad37cc62
Author: Jerry Mouse <[email protected]>
Date: Wed Sep 11 10:16:25 2013 +0530
Added compiled binary
commit 94f7b26005f856f1a1b733ad438e97a0cd509c1a
Author: Jerry Mouse <[email protected]>
Date: Wed Sep 11 10:08:01 2013 +0530
Added Makefile and renamed strings.c to string_operations.c
misturado
Git reset com a opção --mixed reverte aquelas mudanças da área de teste que ainda não foram confirmadas. Ele reverte as alterações da área de teste apenas. As mudanças reais feitas na cópia de trabalho do arquivo não são afetadas. O reset Git padrão é equivalente ao git reset - mixed.
Difícil
Se você usar a opção --hard com o comando reset do Git, ele limpará a área de teste; ele irá reconfigurar o ponteiro HEAD para o commit mais recente do ID de commit específico e excluir as alterações do arquivo local também.
Vamos verificar o ID do commit.
[[email protected] src]$ pwd
/home/jerry/jerry_repo/project/src
[[email protected] src]$ git log -1
O comando acima produzirá o seguinte resultado.
commit 577647211ed44fe2ae479427a0668a4f12ed71a1
Author: Tom Cat <[email protected]>
Date: Wed Sep 11 10:21:20 2013 +0530
Removed executable binary
Jerry modificou um arquivo adicionando um comentário de linha única no início do arquivo.
[[email protected] src]$ head -2 string_operations.c
/* This line be removed by git reset operation */
#include <stdio.h>
Ele verificou isso usando o comando git status.
[[email protected] src]$ git status -s
M string_operations.c
Jerry adiciona o arquivo modificado à área de teste e o verifica com o comando git status.
[[email protected] src]$ git add string_operations.c
[[email protected] src]$ git status
O comando acima produzirá o seguinte resultado.
# On branch master
# Changes to be committed:
# (use "git reset HEAD <file>..." to unstage)
#
#
modified: string_operations.c
#
O status do Git mostra que o arquivo está presente na área de teste. Agora, redefina o HEAD com a opção - difícil.
[[email protected] src]$ git reset --hard 577647211ed44fe2ae479427a0668a4f12ed71a1
HEAD is now at 5776472 Removed executable binary
O comando de reset do Git foi bem-sucedido, o que reverterá o arquivo da área de teste e também removerá quaisquer alterações locais feitas no arquivo.
[[email protected] src]$ git status -s
O status do Git está mostrando que o arquivo foi revertido da área de teste.
[[email protected] src]$ head -2 string_operations.c
#include <stdio.h>
O comando head também mostra que a operação de reset também removeu as alterações locais.