Introdução a reescrevendo a história.
[cursogit.git] / Trabalhando_com_Git.mdwn
1 # Trabalhando com Git
2
3 ## Diretório de trabalho, índice, status
4
5 Ao trabalhar com Git, os arquivos estarão em um diretório de trabalho. O
6 Git é capaz de identificar os arquivos que estão sob seu controle, suas
7 mudanças, arquivos novos e removidos. Um dos comandos para obter essas
8 informações é git status.
9
10 Ao remover um arquivo, adicionar um segundo arquivo, e modificar um
11 terceiro, a saída de git status é a seguinte:
12
13         ~/project$ git status
14         On branch master
15         Changes not staged for commit:
16           (use "git add/rm <file>..." to update what will be committed)
17           (use "git checkout -- <file>..." to discard changes in working directory)
18
19                 deleted:    INSTALL
20                 modified:   README
21
22         Untracked files:
23           (use "git add <file>..." to include in what will be committed)
24
25                 AUTHORS
26
27         no changes added to commit (use "git add" and/or "git commit -a")
28         ~/project$ 
29
30 Note que há uma lista de alterações que não estão prontas para o commit,
31 e uma lista de arquivos não rastreados.
32
33 O comando git commit apenas grava as alterações que foram adicionadas
34 para o commit. No caso da remoção de um arquivo, o comando git rm deve
35 ser utilizado.
36
37         ~/project$ git rm INSTALL
38         rm 'INSTALL'
39         ~/project$ git status
40         On branch master
41         Changes to be committed:
42           (use "git reset HEAD <file>..." to unstage)
43
44                 deleted:    INSTALL
45         ~/project$ 
46
47 Com a utilização de git rm, a remoção do arquivo não só é refletida no
48 diretório de trabalho, como também se reflete no índice, também chamado
49 de index. O índice é uma área em que são registradas as mudanças a serem
50 realizadas em um próximo commit. A distinção da área de trabalho e do
51 índice permite que modificações sejam postergadas, como novos arquivos
52 criados antes de estarem prontos para um commit.
53
54 Para adicionar alterações ou novos arquivos ao índice, o comando git add
55 deve ser utilizado.
56
57         ~/project$ git add AUTHORS
58         ~/project$ git status
59         On branch master
60         Changes to be committed:
61           (use "git reset HEAD <file>..." to unstage)
62
63                 new file:   AUTHORS
64
65         ~/project$ 
66
67 A opção -a do comando git commit adiciona as alterações e remoções ao
68 índice para o commit, mas não adiciona novos arquivos, que devem ser
69 adicionados com o comando git add.
70
71 ## Diferenças entre diretório de trabalho, índice e HEAD
72
73 Para exibir a diferença entre o diretório de trabalho e o índice, pode
74 ser utilizado o comando git diff.
75
76         ~/project$ git diff
77         diff --git a/INSTALL b/INSTALL
78         index e69de29..3924362 100644
79         --- a/INSTALL
80         +++ b/INSTALL
81         @@ -0,0 +1 @@
82         +# Instruções de instalação
83         ~/project$ 
84
85 Ao adicionar as alterações ao índice, git diff não mostrará nenhuma
86 diferença.
87
88         ~/project$ git add INSTALL
89         ~/project$ git diff
90         ~/project$
91
92 Note que as alterações ainda não foram gravadas com um commit. Para
93 verificar as diferenças entre o índice e o último commit, também chamado
94 HEAD, use a opção --cached de git diff.
95
96         ~/project$ git diff --cached
97         diff --git a/INSTALL b/INSTALL
98         index e69de29..3924362 100644
99         --- a/INSTALL
100         +++ b/INSTALL
101         @@ -0,0 +1 @@
102         +# Instruções de instalação
103         ~/project$ 
104
105 Algumas vezes, a intenção ao utilizar git diff é comparar o diretório de
106 trabalho com o último commit, independente das alterações presentes no
107 índice. Para tanto, deve ser especificado o parâmetro HEAD para o
108 comando git diff.
109
110         ~/project$ git diff HEAD
111         diff --git a/INSTALL b/INSTALL
112         index e69de29..3924362 100644
113         --- a/INSTALL
114         +++ b/INSTALL
115         @@ -0,0 +1 @@
116         +# Instruções de instalação
117         ~/project$ 
118
119 ## Ignorando arquivos
120
121 Em muitas situações, arquivos são gerados a partir de outros, como no
122 caso de programas compilados ou minificados. Como boa prática, tais
123 arquivos não são mantidos em controle de versão, mas devem ser gerados
124 de forma automática e reprodutível.
125
126 No entanto, tais arquivos, assim como outros arquivos temporários ou
127 gerados pelo sistema operacional podem aparecer constantemente na saída
128 de git status e outros comandos. Isso dificulta a leitura da saída
129 destes comandos e pode ser evitado com o uso de git ignore.
130
131 Seja através do comando git ignore ou editando diretamente o arquivo
132 .gitignore, é possível instruir o git a ignorar arquivos que
133 correspondam a um padrão. O padrão *.html, por exemplo, faz com que
134 todos os arquivos com nome terminado em .html sejam ignorados.
135
136 Veja o exemplo abaixo, em que arquivos compilados aparecem quando git
137 status é utilizado, e como ignorá-los usando o comando git ignore. O
138 comando escreve em um arquivo .gitignore, que também será considerado
139 pelo Git. É uma boa prática manter este arquivo sob controle de versão
140 e, portanto, ele é adicionado e um novo commit criado.
141
142         ~/project$ git status
143         On branch master
144         Untracked files:
145           (use "git add <file>..." to include in what will be committed)
146
147                 hello
148                 hello.o
149
150         nothing added to commit but untracked files present (use "git add" to track)
151         ~/project$ git ignore '*.o' hello
152         Adding pattern(s) to: .gitignore
153         ... adding '*.o'
154         ... adding 'hello'
155         ~/project$ git status
156         On branch master
157         Untracked files:
158           (use "git add <file>..." to include in what will be committed)
159
160                 .gitignore
161
162         nothing added to commit but untracked files present (use "git add" to track)
163         ~/project$ git add .gitignore
164         ~/project$ git status
165         On branch master
166         Changes to be committed:
167           (use "git reset HEAD <file>..." to unstage)
168
169                 new file:   .gitignore
170         ~/project$ git commit -m "Acrescenta lista de arquivos a serem ignorados."
171         [master 8ba73db] Acrescenta lista de arquivos a serem ignorados.
172          1 file changed, 2 insertions(+)
173          create mode 100644 .gitignore
174         ~/project$ git status
175         On branch master
176         nothing to commit, working directory clean
177         ~/project$