Introdução ao Git: Controle de Versões
Introdução ao Git: Controle de Versões
conteúdo
1. Introdução
2. Noções Básicas do Git
3. Efetivando Mudanças
4. Etiquetagem
5. Revertendo Mudanças
6. Repositórios Remotos
1
Git
Introdução
O QUE É GIT?
• Usado principalmente no
desenvolvimento de software;
2
O QUE É GIT?
3
UMA BREVE HISTÓRIA DO GIT
4
UMA BREVE HISTÓRIA DO GIT
OBJETIVOS DO GIT
• Velocidade;
• Design simples;
• Totalmente distribuído;
10
10
5
GIT
• Desde 2005, o Git evoluiu para ser fácil
de usar;
11
11
12
12
6
FORMA DE ARMAZENAR DADOS – OUTROS VCS
13
13
ARQUIVO A Δ 1A Δ 2A
ARQUIVO B Δ 1B Δ 2B
ARQUIVO C Δ 1C Δ 2C Δ 3C
14
14
7
CONTROLE DE VERSÃO BASEADO EM DELTAS
CHECK-INS AO LONGO DO TEMPO
Versão Inicial
ARQUIVO A
ARQUIVO C
15
15
16
16
8
CONTROLE DE VERSÃO BASEADO EM DELTAS
Recuperações
CHECK-INS AO LONGO DO TEMPO
17
17
18
18
9
VANTAGENS - CONTROLE DE VERSÃO BASEADO EM DELTAS
CHECK-INS AO LONGO DO TEMPO
Facilidade de Comparação
simples;
deltas.
ARQUIVO C Δ 1C Δ 2C Δ 3C
19
19
desejada.
ARQUIVO C Δ 1C Δ 2C Δ 3C
20
20
10
DESVANTAGENS - CONTROLE DE VERSÃO BASEADO EM DELTAS
CHECK-INS AO LONGO DO TEMPO
Possibilidade de Erros
ARQUIVO A Δ 1A Δ 2A
• Se houver erros nos deltas;
ARQUIVO C Δ 1C Δ 2C Δ 3C
21
21
22
22
11
CONTROLE DE VERSÃO BASEADO EM SNAPSHOTS
CHECK-INS AO LONGO DO TEMPO
ARQUIVO A A1 A1 A2 A2
ARQUIVO C C1 C2 C2 C3
23
23
ARQUIVO C C1 C2 C2 C3
24
24
12
CONTROLE DE VERSÃO BASEADO EM SNAPSHOTS
CHECK-INS AO LONGO DO TEMPO
novamente;
25
25
OBJETOS DO GIT
CHECK-INS AO LONGO DO TEMPO
ARQUIVO C C1 C2 C2 C3
26
26
13
OBJETOS DO GIT
CHECK-INS AO LONGO DO TEMPO
diretório.
incluindo:
27
27
OBJETOS DO GIT
• Commits: é um objeto que armazena CHECK-INS AO LONGO DO TEMPO
repositório, incluindo:
• O autor da alteração;
ARQUIVO B ARQUIVO B ARQUIVO B B1 B2
• Uma mensagem de commit;
28
28
14
EFICIÊNCIA - CONTROLE DE VERSÃO BASEADO EM SNAPSHOTS
CHECK-INS AO LONGO DO TEMPO
ARQUIVO C C1 C2 C2 C3
29
29
30
30
15
DELTAS X SNAPSHOTS
Controle de Versão Baseado em Deltas Controle de Versão Baseado em Snapshots
CHECK-INS AO LONGO DO TEMPO CHECK-INS AO LONGO DO TEMPO
Versão 1 Versão 2 Versão 3 Versão 4 Versão 5 Versão 1 Versão 2 Versão 3 Versão 4 Versão 5
ARQUIVO A Δ 1A Δ 2A ARQUIVO A A1 A1 A2 A2
ARQUIVO C Δ 1C Δ 2C Δ 3C ARQUIVO C C1 C2 C2 C3
31
31
DELTAS X SNAPSHOTS
Controle de Versão Baseado em Deltas
CHECK-INS AO LONGO DO TEMPO
ARQUIVO A Δ 1A Δ 2A
• O que significa que é necessário aplicar
as mudanças de uma versão anterior;
ARQUIVO B Δ 1B Δ 2B
• Para reconstruir uma versão específica.
ARQUIVO C Δ 1C Δ 2C Δ 3C
32
32
16
DELTAS X SNAPSHOTS
• Armazenam o estado completo ou quase
Controle de Versão Baseado em Snapshots completo, de cada arquivo no momento do
CHECK-INS AO LONGO DO TEMPO commit.
Versão 1 Versão 2 Versão 3 Versão 4 Versão 5
• Mesmo que internamente o Git use alguns
métodos de compressão para reduzir
ARQUIVO A A1 A1 A2 A2 redundâncias;
33
OPERAÇÕES LOCAIS
34
34
17
INTEGRIDADE NO GIT
35
35
CHECKSUM
• Checksums ou somas de verificação são valores
numéricos gerados a partir de um conjunto de
dados, por exemplo:
• Arquivo;
• Mensagem;
• Qualquer sequência de bits.
e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
• Eles são usados para verificar a integridade dos
dados;
36
36
18
CHECKSUMS NO GIT
• Checksum SHA-1:
e69de29bb2d1d6434b8b29ae775ad8c2e48c53
91
37
37
INTEGRIDADE NO GIT
• O Git pega o conteúdo do objeto;
38
38
19
IMPORTÂNCIA DO CHECKSUM NO GIT
• O checksum no Git garante a integridade dos
dados.
39
39
ADIÇÃO DE DADOS
• A maioria das ações no Git apenas adiciona
dados ao banco de dados;
40
40
20
STATUS DO GIT
Modificado
Preparado ou Indexado
(Staged)
Confirmado ou Comitado
(committed)
41
41
STATUS MODIFICADO
• O item de configuração foi alterado na área
de trabalho (working tree) do seu projeto;
Modificado
• Mas essas mudanças ainda não foram
registradas no controle de versão, ou seja, Preparado ou Indexado
(Staged)
não foram preparadas ou confirmadas;
42
42
21
STATUS PREPARADO OU INDEXADO (STAGED)
43
43
44
44
22
STATUS CONFIRMADO OU COMITADO
45
45
46
46
23
AS 3 PRINCIPAIS SEÇÕES DE UM PROJETO GIT
Área de Preparação Diretório Git
Área de Trabalho
(Staging) (Repositório)
47
47
48
48
24
EXEMPLO - WORKING TREE
49
49
50
50
25
EXEMPLO - STAGING AREA
51
51
52
52
26
EXEMPLO - GIT DIRECTORY
53
53
Checkout do Projeto
Preparar as Alterações
commit
54
54
27
WORKING TREE
55
55
56
56
28
ETAPA 2 - ADICIONE AS CORREÇÕES NA ÁREA DE PREPARAÇÃO
57
57
58
58
29
ETAPA 3 – VERIFIQUE O STATUS
59
59
60
60
30
LINHA DE COMANDO
61
61
LINHA DE COMANDO
62
62
31
LINHA DE COMANDO
63
63
NOÇÕES BÁSICAS
Do GIT
64
64
32
REPOSITÓRIO GIT
65
65
66
66
33
1. INICIALIZAR UM NOVO REPOSITÓRIO
REPOSITÓRIO
Transformar
Diretório Diretório
Local Git
67
67
$ cd /home/user/meu-projeto
$ cd C:/Users/user/meu-projeto
68
68
34
1. INICIALIZAR UM NOVO REPOSITÓRIO
Use o comando: git init
69
69
mkdir meu-projeto
cd meu-projeto
git init
70
70
35
2. CLONAR UM NOVO REPOSITÓRIO
REPOSITÓRIO
Clonar
Diretório Diretório
Local Git
71
71
• Bitbucket
• GitHub
• GitLab
72
72
36
2. CLONAR UM NOVO REPOSITÓRIO
73
73
74
74
37
EXEMPLO - CLONAR UM NOVO REPOSITÓRIO
75
75
76
76
38
NÃO RASTREADO (UNTRACKED)
Não Rastreado Não Modificado Modificado Preparado (Staged)
77
77
78
78
39
NÃO MODIFICADO (UNMODIFIED)
Não Rastreado Não Modificado Modificado Preparado (Staged)
commit
79
79
Editar o Arquivo
80
80
40
NÃO MODIFICADO (UNMODIFIED)
Não Rastreado Não Modificado Modificado Preparado (Staged)
Remover o
Arquivo
81
81
MODIFICADO (MODIFIED)
Não Rastreado Não Modificado Modificado Preparado (Staged)
82
82
41
MODIFICADO (MODIFIED)
Não Rastreado Não Modificado Modificado Preparado (Staged)
83
83
PREPARADO (STAGED)
Não Rastreado Não Modificado Modificado Preparado (Staged)
84
84
42
RASTREAR NOVOS ARQUIVOS
85
85
86
86
43
REMOVENDO ARQUIVOS
87
87
REMOVENDO ARQUIVOS
88
88
44
VERIFICAR O STATUS DOS ARQUIVOS
89
89
90
90
45
EXEMPLO - VERIFICAR O STATUS DOS ARQUIVOS
git status
On branch main
Changes to be committed:
(use "git restore --staged <file>..." to unstage)
new file: [Link]
Untracked files:
(use "git add <file>..." to include in what will be committed)
[Link]
91
91
Untracked files:
• Está pronto para ser confirmado (use "git add <file>..." to include in what will be committed)
[Link]
(commit)
92
92
46
EXEMPLO - VERIFICAR O STATUS DOS ARQUIVOS
git status
On branch main
Changes to be committed:
Arquivos Modificados, mas não (use "git restore --staged <file>..." to unstage)
new file: [Link]
preparados Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git restore <file>..." to discard changes in working directory)
• [Link] modified: [Link]
modified: [Link]
• [Link]
Untracked files:
(use "git add <file>..." to include in what will be committed)
[Link]
93
93
git status
• Esses dois arquivos foram On branch main
Changes to be committed:
modificados na árvore de (use "git restore --staged <file>..." to unstage)
new file: [Link]
trabalho (working tree), Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git restore <file>..." to discard changes in working directory)
• Mas as mudanças ainda não modified: [Link]
modified: [Link]
foram adicionadas à área de
Untracked files:
(use "git add <file>..." to include in what will be committed)
preparação. [Link]
94
94
47
EXEMPLO - VERIFICAR O STATUS DOS ARQUIVOS
Untracked files:
mudanças à área de (use "git add <file>..." to include in what will be committed)
[Link]
preparação, use git add
95
95
git status
Untracked files:
controle de versão do Git. (use "git add <file>..." to include in what will be committed)
[Link]
96
96
48
EXEMPLO - VERIFICAR O STATUS DOS ARQUIVOS
git status
• O Git não está rastreando este
On branch main
arquivo, Changes to be committed:
(use "git restore --staged <file>..." to unstage)
new file: [Link]
• O que significa que ele não será Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
incluído em um commit (use "git restore <file>..." to discard changes in working directory)
modified: [Link]
modified: [Link]
• Até que seja adicionado à área de Untracked files:
(use "git add <file>..." to include in what will be committed)
preparação com o git add [Link]
97
97
98
98
49
VERSÃO ABREVIADA DO COMANDO VERIFICAR O STATUS
99
99
100
100
50
EXEMPLO
• ' ' = não modificado
• M = modificado
• T = tipo de arquivo alterado (arquivo regular,
link simbólico ou submódulo) git status -s
• A = adicionado
M [Link]
• D = excluído AM [Link]
• R = renomeado ?? [Link]
• C = copiado (se a opção de configuração
[Link] estiver definida como "cópias")
• U = atualizado, mas não mesclado
101
101
EXEMPLO
102
102
51
EXEMPLO
• Coluna 1 (A): o arquivo [Link] foi
adicionado à área de preparação (staged)
como um novo arquivo.
git status -s
• Coluna 2 (M): após o arquivo [Link]
ter sido adicionado à área de preparação, ele M [Link]
AM [Link]
foi modificado novamente na árvore de
?? [Link]
trabalho (working tree). As modificações mais
recentes ainda não foram adicionadas à área
de preparação.
103
103
EXEMPLO
104
104
52
IGNORANDO ARQUIVOS NO GIT
105
105
106
106
53
EXEMPLO - .GITIGNORE
# Ignore todos os arquivos .a
*.a
# Mas rastreie lib.a, mesmo que você esteja ignorando os arquivos .a acima
!lib.a
107
107
108
108
54
VISUALIZAR MUDANÇAS NOS ARQUIVOS DA ÁRVORE DE TRABALHO
• Para ver as diferenças entre:
109
109
rastreamento do git;
110
110
55
EXEMPLO – GIT DIFF
git diff
111
111
112
112
56
EXEMPLO – GIT DIFF
git diff
• Mostra os hashes dos commits (ou dos diff --git a/[Link] b/[Link]
index e69de29..73f1ab0 100644
estados do arquivo) que estão sendo --- a/[Link]
+++ b/[Link]
comparados;
@@ -0,0 +1,10 @@
+<!DOCTYPE html>
• e69de29 refere-se à versão anterior do +<html lang="pt-BR">
+<head>
arquivo; + <meta charset="UTF-8">
+ <title>Home</title>
• 73f1ab0 refere-se à nova versão; +</head>
+<body>
• 100644 refere-se às permissões do +
+</body>
arquivo (arquivo regular). +</html>
\ No newline at end of file
113
113
114
114
57
EXEMPLO – GIT DIFF
git diff
• Esta linha é um “chunk header" que mostra diff --git a/[Link] b/[Link]
o contexto das mudanças; index e69de29..73f1ab0 100644
--- a/[Link]
+++ b/[Link]
• Ela significa que, na versão original @@ -0,0 +1,10 @@
+<!DOCTYPE html>
(a/[Link]), não havia conteúdo (o +<html lang="pt-BR">
+<head>
arquivo estava vazio ou não existia); + <meta charset="UTF-8">
+ <title>Home</title>
• enquanto na nova versão (b/[Link]), 10 +</head>
+<body>
linhas foram adicionadas começando na +
+</body>
linha 1. +</html>
\ No newline at end of file
115
115
116
116
58
VISUALIZAR MUDANÇAS NOS ARQUIVOS DA ÁREA DE PREPARAÇÃO
117
117
118
118
59
COMPARANDO ARQUIVOS DE 2 COMMITS DIFERENTES
119
119
120
120
60
efetivando
As Mudanças
121
121
COMMIT
• Um commit no Git é um instantâneo do
estado do seu projeto em um dado
momento.
122
122
61
REALIZANDO O COMMIT DAS SUAS MUDANÇAS
• Após configurar a área de preparação
(staging)
123
123
EXEMPLO 1 - COMMIT
git commit
# Please enter the commit message for your changes. Lines starting
# with '#' will be ignored, and an empty message aborts the commit.
# On branch master
# Your branch is up-to-date with 'origin/master'.
#
# Changes to be committed:
# new file: README
# modified: [Link]
#
~
~
~
".git/COMMIT_EDITMSG" 9L, 283C
124
124
62
EXEMPLO 1 - COMMIT
125
125
EXEMPLO 1 - COMMIT
126
126
63
REALIZANDO O COMMIT DAS SUAS MUDANÇAS
127
127
EXEMPLO 2 - COMMIT
128
128
64
COMMIT SEM GIT ADD
129
129
130
130
65
ESPECIFICAÇÃO DO CONVENTIONAL COMMITS
131
131
132
132
66
ESPECIFICAÇÃO DO CONVENTIONAL COMMITS
• Rodapé.
133
133
[corpo opcional]
[rodapé opcional]
134
134
67
CABEÇALHO - CONVENTIONAL COMMITS
135
135
136
136
68
TIPO DE COMMIT - CONVENTIONAL COMMITS
137
137
138
138
69
ESCOPO - CONVENTIONAL COMMITS
139
139
• core
• lang
140
140
70
DESCRIÇÃO - CONVENTIONAL COMMITS
141
141
142
142
71
RODAPÉ - CONVENTIONAL COMMITS
• Informações sobre alterações significativas e
descontinuações
143
143
144
144
72
EXEMPLOS - CONVENTIONAL COMMITS
145
145
146
146
73
EXEMPLOS - CONVENTIONAL COMMITS
147
147
148
148
74
CONVENTIONAL COMMITS X VERSIONAMENTO SEMÂNTICO
4.2.1
Major Minor Patch
[Link]
[Link]
149
149
VERSIONAMENTO SEMÂNTICO
150
150
75
VERSIONAMENTO SEMÂNTICO
151
151
152
152
76
VERSIONAMENTO SEMÂNTICO
Quando há adição de
funcionalidade compatível com
4.2.1
Major Minor Patch
versões anteriores
153
153
154
154
77
VERSIONAMENTO SEMÂNTICO
155
155
156
156
78
PORQUE USAR O CONVENTIONAL COMMITS?
157
157
158
158
79
VISUALIZANDO O HISTÓRICO DE COMMITS
159
159
• Quem as fez;
git log
• Quando foram feitas;
160
160
80
VISUALIZANDO O HISTÓRICO DE COMMITS
commit ca82a6dff817ec66f44342007202690a93763949 (HEAD -> master, origin/master, origin/HEAD)
Author: Scott Chacon <schacon@[Link]>
Date: Mon Mar 17 21:52:11 2008 -0700
commit 085bb3bcb608e1e8451d4b2432f8ecbe6306e7e7
Author: Scott Chacon <schacon@[Link]>
Date: Sat Mar 15 16:40:33 2008 -0700
git log
removed unnecessary test code
commit a11bef06a3f659402fe7563abf99ad00de2209e6
Author: Scott Chacon <schacon@[Link]>
Date: Sat Mar 15 10:31:28 2008 -0700
161
161
162
162
81
VISUALIZANDO O HISTÓRICO DE COMMITS
163
163
164
164
82
VISUALIZANDO O HISTÓRICO DE COMMITS
165
165
Rakefile | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
commit 085bb3bcb608e1e8451d4b2432f8ecbe6306e7e7
Author: Scott Chacon <schacon@[Link]>
Date: Sat Mar 15 16:40:33 2008 -0700
commit a11bef06a3f659402fe7563abf99ad00de2209e6
Author: Scott Chacon <schacon@[Link]>
Date: Sat Mar 15 10:31:28 2008 -0700
first commit
README | 6 ++++++
Rakefile | 23 +++++++++++++++++++++++
lib/[Link] | 25 +++++++++++++++++++++++++
3 files changed, 54 insertions(+)
166
166
83
VISUALIZANDO O HISTÓRICO DE COMMITS
167
167
168
168
84
VISUALIZANDO O HISTÓRICO DE COMMITS
169
169
170
170
85
PERSONALIZANDO A SAÍDA DO GIT LOG
• É útil quando você está gerando saída para processamento por máquina.
171
171
%H Hash do commit
%T Hash da árvore
172
172
86
FILTRAGEM DE COMMITS NO GIT LOG
• Autor Específico
• Intervalo de Tempo
• Palavra-chave
173
173
etiquetagem
No Git
174
174
87
TAGS NO GIT
• O Git permite que você crie etiquetas
(tags);
175
175
git tag
Para ver todas as tags no git tag
v1.0
v2.0
repositório, use:
176
176
88
LISTAR TAGS COM DETERMINADO PADRÃO
177
177
178
178
89
TAGS NO GIT
179
179
como:
• A data da tag
• O nome do criador
180
180
90
CRIAR TAGS LEVES (LIGHTWEIGHT TAGS)
181
181
182
182
91
CRIAR TAGS ANOTADAS (ANNOTATED TAGS)
183
183
tag v1.4
Tagger: Ben Straub <ben@[Link]>
Date: Sat May 3 20:19:12 2014 -0700
Para ver os detalhes de
Versão 1.4
uma tag anotada, use:
commit ca82a6dff817ec66f44342007202690a93763949
Author: Scott Chacon <schacon@[Link]>
Date: Mon Mar 17 21:52:11 2008 -0700
Número de versão alterada
184
184
92
CRIANDO TAGS RETROATIVAS
185
185
186
186
93
COMPARTILHANDO TAGS
187
187
COMPARTILHANDO TAGS
188
188
94
REMOVENDO TAGS
189
189
REMOVENDO TAGS
190
190
95
Desfazendo operações
No Git
191
191
Adicionar o
Arquivo
192
192
96
DESFAZENDO A PREPARAÇÃO DE UM ARQUIVO
193
193
On branch main
Changes to be committed:
(use "git restore --staged <file>..." to unstage)
new file: [Link]
deleted: [Link]
Untracked files:
(use "git add <file>..." to include in what will be committed)
[Link]
194
194
97
EXEMPLO - DESFAZENDO A PREPARAÇÃO DE UM ARQUIVO
git status
On branch main
Changes to be committed:
(use "git restore --staged <file>..." to unstage)
deleted: [Link]
Untracked files:
(use "git add <file>..." to include in what will be committed)
[Link]
[Link]
195
195
196
196
98
DESFAZENDO A MODIFICAÇÃO DE UM ARQUIVO
197
197
198
198
99
DESFAZENDO A PREPARAÇÃO DE UM ARQUIVO COM GIT RESTORE
199
199
On branch main
Changes to be committed:
(use "git restore --staged <file>..." to unstage)
new file: [Link]
deleted: [Link]
Untracked files:
(use "git add <file>..." to include in what will be committed)
[Link]
200
200
100
repositórios
Remotos
201
201
REPOSITÓRIOS REMOTOS
202
202
101
REPOSITÓRIOS REMOTOS
203
203
204
204
102
EXIBINDO SERVIDORES REMOTOS
205
205
206
206
103
ADICIONANDO REPOSITÓRIOS REMOTOS
207
207
• Agora, você pode usar pb no lugar da URL completa para comandos Git
como fetch e push.
208
208
104
OBTENDO DADOS DOS SEUS REMOTOS
209
209
EXEMPLO - FETCH
$ git fetch pb
• Se você quiser buscar todas as
informações que Paulo tem; remote: Counting objects: 43, done.
remote: Compressing objects: 100% (36/36), done.
• Mas que você ainda não tem em seu remote: Total 43 (delta 10), reused 31 (delta 5)
Unpacking objects: 100% (43/43), done.
repositório;
From [Link]
* [new branch] master -> pb/master
• Você pode executar git fetch pb
* [new branch] ticgit -> pb/ticgit
210
210
105
OBTENDO DADOS DOS SEUS REMOTOS
211
211
212
212
106
ENVIANDO MUDANÇAS PARA SEUS REMOTOS
213
213
214
214
107
ENVIANDO MUDANÇAS PARA SEUS REMOTOS
215
215
• Você precisará buscar (fetch) o trabalho dessa git push origin main
pessoa
216
216
108
INSPECIONANDO UM REPOSITÓRIO REMOTO
217
217
* remote origin
Fetch URL: [Link]
Push URL: [Link]
218
218
109
EXEMPLO - INSPECIONANDO UM REPOSITÓRIO REMOTO
$ git remote show origin
• Apontando para o repositório ticgit do Local branch configured for 'git pull':
master merges with remote master
usuário schacon no GitHub. Local ref configured for 'git push':
master pushes to master (up to date)
219
219
* remote origin
• Isso indica que a branch padrão do repositório Fetch URL: [Link]
220
220
110
EXEMPLO - INSPECIONANDO UM REPOSITÓRIO REMOTO
$ git remote show origin
* remote origin
• O Git está rastreando duas branches no Fetch URL: [Link]
221
221
222
222
111
EXEMPLO - INSPECIONANDO UM REPOSITÓRIO REMOTO
$ git remote show origin
* remote origin
• A branch local master está configurada para Fetch URL: [Link]
Push URL: [Link]
enviar (push) suas alterações para a branch
HEAD branch: master
master do repositório remoto Remote branches:
master tracked
• Quando o comando git push for dev-branch tracked
223
223
RENOMEANDO REMOTOS
224
224
112
RENOMEANDO REMOTOS
225
225
REMOVENDO REMOTOS
OU
Para remover um remoto use
git remote rm <nome>
226
226
113
REMOVENDO REMOTOS
227
227
EM CASO DE INCÊNCIO
228
228
114
BIBLIOGRAFIA
229
BIBLIOGRAFIA
230
115
BIBLIOGRAFIA
231
232
116