# Ferramentas do Git
## Introdução

Normalmente, um usuário comum do git não faz uso de muitas de suas funcionalidades ou não tem conhecimento do seu real poder. Vários comandos que normalmente são utilizados podem fazer muito mais do que mostrar a lista de commits, por exemplo.

## Comandos
### Comando Git Log

O comando git log é utilizado para visualizar os commits em ordem, certificar-se se o commit foi realizado, etc. Porém, esse comando permite o usuário ter acesso ao código do commit, denominado SHA. Por exemplo:
O SHA é o código que identifica o commit. Porém, procurar um commit específico dentro de um projeto grande requer muito trabalho, onde o usuário terá que ver toda essa lista, sem estar resumida ou algo do tipo. O git permite que você possa realizar um git log resumido, ou seja, ele lista todos os commits em ordem mostrando apenas sua mensagem e seu respectivo SHA, abreviando-o até que se torne único dentro dos SHAs existentes, como mostraremos adiante. O comando para tal é o --abbrev-commit, como no exemplo a seguir:
A partir disso, o usuário pode simplesmente utilizar o git show e visualizar facilmente o que foi modificado ou inserido no commit selecionado.

### Comando git Reflog

Uma outra alternativa na hora de visualizar os commits é utilizar o comando reflog, ou seja, o git mantém o log de onde suas referências de HEAD e branches estiveram nos ultimos tempos (atente-se que as informações do reflog são informações do repositório local).
Toda vez que o ponto extremo da sua branch é atualizada, o Git faz um registro disso em um histórico temporário. Caso deseje visualizar algum desses, basta observar o HEAD referente ao commit/merge/reset/rebase que queira e escrever o comando @{n}, exemplificado a seguir:
A visualização do reflog permite o usuário de realizar um possível reset na branch, caso haja a necessidade. No caso, bastaria apenas utilizar um dos comandos do reset referenciando a @{n} da HEAD desejada:
Seguindo a mesma lógica, o git permite você utilizar a mesma sintaxe para visualizar onde uma determinada branch estava em um certo período de tempo. Por exemplo, caso queira visualizar onde a master se encontrava no dia anterior, basta utilizar o comando a seguir (referência só funciona para dados que ainda se encontram no reflog).

### Intervalos de Commits

Como já sabemos como visualizar ou especificar commits individuais, podemos entrar em uma nova ferramenta que nos permite observar intervalos de commits. Você pode se perguntar "Que modificações existem nesse branch que ainda não foram mescladas (merge) no meu branch principal?".
Imagem para apresentação (erro ao tentar upar a imagem para Wikiversidade) https://git-scm.com/figures/18333fig0601-tn.png
Na imagem, podemos visualizar as diferenças entre commits de duas branches distintas. Agora, caso você queira ver o que tem na sua branch e não tem na master, por exemplo, basta fazer o seguinte:
Caso contrário, basta digitar
Isso é útil para deixar a sua branch, no caso 'experiment' atualizada em relação a branch master, e auxilia você a se posicionar ou prepara-se para o merge que será feito.

### Comando git add -i

Quando estamos trabalhando e produzimos um grande volume de alterações em vários arquivos, isso pode vir a virar uma dor de cabeça. Caso tudo seja feito em somente um commit, com a função apresentada a seguir isso pode ser solucionado de forma simples.
Na primeira parte do resultado ele traz os arquivos e seu status, no caso temos 2 arquivos não monitorados, na segunda parte os comandos. Vamos ver alguns.
1: status: traz as mesmas informações do git status, porem sem as opções;
resultado do comando status;
2: update -> traz os arquivos que não estão sendo monitorados para serem adicionados;
o shell entra no modo de update;
selecionado os arquivos eles estão com um * na frente indicando que estão sendo monitorados, e prontos para serem commitados;
4: diff -> traz as alterações feitas em um arquivo.
Arquivos monitorados;
Alterações feitas na tag p.
3: revert -> listas os arquivos monitorados para serem excluídos (altera para não monitorados);
entrou no modo de Reverter
mostra que o arquivo 2 foi removido, indicado pelo *;
vendo como estão os arquivos com o comando status;

### Comando git commit --amend

este comando tem por função alterar o último commit feito.
imagina que a mensagem do commit não saiu boa, então você precisa alterá-la afim de proporcionar uma melhor compreensão para aqueles que terão de entender o que foi feito.
para isso você pode usar o comando:
tela para alteração da mensagem do commit, faça as alterações e salve, pronto a mensagem foi alterada;
Agora em vez de querer alterar a mensagem você quer alterar o commit, pois faltou anexar alterações feitas em um arquivo. veja o commit a segui:
último commit; veja essa alteração que precisa ser adicionada no commit acima.
agora adicione o arquivo para submeter
adicionando no último commit
$ git commit --amend
o arquivo testeradiobutton.html já aparece nas mudanças a serem submetidas e a mensagem pode ser alterada e/ou não depende do seu caso, aqui foi acrescentado “e radio button”.
salve o arquivo e pronto, vejamos o git log do commit alterado:

### Alterando commit com pixup+rebase -i

Imagina que por algum motivo você precise alterar um commit anterior, que por algum motivo as alterações que você tem que submeter devem pertencer ao mesmo. vejamos alguns commits
veja o commit 072b9f8765620109399a72f5d91e0f8d175e79d8 vamos ver as alterações que foram submetidas nele.
agora vamos enviar este arquivo com suas alterações.
vamos adicionar para submeter.
mesclando os commits
substituir pick por f e colocar o arquivo logo abaixo do que você está fazendo a mescla.
salva as alterações e feche!
Pronto agora vamos verificar!