# Trabalhando com Git ## Diretório de trabalho, índice, status Ao trabalhar com Git, os arquivos estarão em um diretório de trabalho. O Git é capaz de identificar os arquivos que estão sob seu controle, suas mudanças, arquivos novos e removidos. Um dos comandos para obter essas informações é git status. Ao remover um arquivo, adicionar um segundo arquivo, e modificar um terceiro, a saída de git status é a seguinte: ~/project$ git status On branch master Changes not staged for commit: (use "git add/rm ..." to update what will be committed) (use "git checkout -- ..." to discard changes in working directory) deleted: INSTALL modified: README Untracked files: (use "git add ..." to include in what will be committed) AUTHORS no changes added to commit (use "git add" and/or "git commit -a") ~/project$ Note que há uma lista de alterações que não estão prontas para o commit, e uma lista de arquivos não rastreados. O comando git commit apenas grava as alterações que foram adicionadas para o commit. No caso da remoção de um arquivo, o comando git rm deve ser utilizado. ~/project$ git rm INSTALL rm 'INSTALL' ~/project$ git status On branch master Changes to be committed: (use "git reset HEAD ..." to unstage) deleted: INSTALL ~/project$ Com a utilização de git rm, a remoção do arquivo não só é refletida no diretório de trabalho, como também se reflete no índice, também chamado de index. O índice é uma área em que são registradas as mudanças a serem realizadas em um próximo commit. A distinção da área de trabalho e do índice permite que modificações sejam postergadas, como novos arquivos criados antes de estarem prontos para um commit. Para adicionar alterações ou novos arquivos ao índice, o comando git add deve ser utilizado. ~/project$ git add AUTHORS ~/project$ git status On branch master Changes to be committed: (use "git reset HEAD ..." to unstage) new file: AUTHORS ~/project$ A opção -a do comando git commit adiciona as alterações e remoções ao índice para o commit, mas não adiciona novos arquivos, que devem ser adicionados com o comando git add. ## Diferenças entre diretório de trabalho, índice e HEAD Para exibir a diferença entre o diretório de trabalho e o índice, pode ser utilizado o comando git diff. ~/project$ git diff diff --git a/INSTALL b/INSTALL index e69de29..3924362 100644 --- a/INSTALL +++ b/INSTALL @@ -0,0 +1 @@ +# Instruções de instalação ~/project$ Ao adicionar as alterações ao índice, git diff não mostrará nenhuma diferença. ~/project$ git add INSTALL ~/project$ git diff ~/project$ Note que as alterações ainda não foram gravadas com um commit. Para verificar as diferenças entre o índice e o último commit, também chamado HEAD, use a opção --cached de git diff. ~/project$ git diff --cached diff --git a/INSTALL b/INSTALL index e69de29..3924362 100644 --- a/INSTALL +++ b/INSTALL @@ -0,0 +1 @@ +# Instruções de instalação ~/project$ Algumas vezes, a intenção ao utilizar git diff é comparar o diretório de trabalho com o último commit, independente das alterações presentes no índice. Para tanto, deve ser especificado o parâmetro HEAD para o comando git diff. ~/project$ git diff HEAD diff --git a/INSTALL b/INSTALL index e69de29..3924362 100644 --- a/INSTALL +++ b/INSTALL @@ -0,0 +1 @@ +# Instruções de instalação ~/project$ ## Ignorando arquivos Em muitas situações, arquivos são gerados a partir de outros, como no caso de programas compilados ou minificados. Como boa prática, tais arquivos não são mantidos em controle de versão, mas devem ser gerados de forma automática e reprodutível. No entanto, tais arquivos, assim como outros arquivos temporários ou gerados pelo sistema operacional podem aparecer constantemente na saída de git status e outros comandos. Isso dificulta a leitura da saída destes comandos e pode ser evitado com o uso de git ignore. Seja através do comando git ignore ou editando diretamente o arquivo .gitignore, é possível instruir o git a ignorar arquivos que correspondam a um padrão. O padrão *.html, por exemplo, faz com que todos os arquivos com nome terminado em .html sejam ignorados. Veja o exemplo abaixo, em que arquivos compilados aparecem quando git status é utilizado, e como ignorá-los usando o comando git ignore. O comando escreve em um arquivo .gitignore, que também será considerado pelo Git. É uma boa prática manter este arquivo sob controle de versão e, portanto, ele é adicionado e um novo commit criado. ~/project$ git status On branch master Untracked files: (use "git add ..." to include in what will be committed) hello hello.o nothing added to commit but untracked files present (use "git add" to track) ~/project$ git ignore '*.o' hello Adding pattern(s) to: .gitignore ... adding '*.o' ... adding 'hello' ~/project$ git status On branch master Untracked files: (use "git add ..." to include in what will be committed) .gitignore nothing added to commit but untracked files present (use "git add" to track) ~/project$ git add .gitignore ~/project$ git status On branch master Changes to be committed: (use "git reset HEAD ..." to unstage) new file: .gitignore ~/project$ git commit -m "Acrescenta lista de arquivos a serem ignorados." [master 8ba73db] Acrescenta lista de arquivos a serem ignorados. 1 file changed, 2 insertions(+) create mode 100644 .gitignore ~/project$ git status On branch master nothing to commit, working directory clean ~/project$