Descomplicando o controle 
de versão com Git 
Humberto Streb
2 
Humberto Streb 
Bel. Sistemas de Informação 
Desenvolvedor Java 
Entusiasta Linux 
Curioso 
github.com/hstreb 
hstreb@gmail.com
3 
Controle de versão 
“É um software com a finalidade de gerenciar 
diferentes versões no desenvolvimento de um 
documento qualquer.” 
[Wikipédia]
4 
Projetos pequenos
5 
Projetos grandes
6 
Vantagens 
Histórico de alterações 
Facilidade de reverter alterações 
Facilidade de ramificar o projeto 
Facilidade de marcar (tag) dados 
Backup do código fonte
7 
Git 
“É um sistema de controle de versão 
distribuido gratuito e open source desenhado 
para lidar com tudo, desde pequenos até 
grandes projetos com rapidez e eficiência.” 
[git-scm.com]
8 
Git 
Foco em velocidade 
Foco no design simples 
Suporte robusto a desenvolvimento não linear 
(milhares de branches paralelos) 
Totalmente distribuído 
Capaz de lidar eficientemente com grandes 
projetos como o kernel do Linux
9 
Empresas que utilizam Git
10 
Configuração 
$ git config --global user.name "Humberto 
Streb" 
$ git config --global user.email 
"hstreb@gmail.com"
11 
Entendendo os estados
12 
Área de trabalho 
É onde são carregados os arquivos vindo de um 
repositório (checkout). Nela estão os arquivos 
vigentes.
13 
Área de preparação 
É uma área temporária, que contem as 
informações do próximo commit.
14 
Diretório do Git 
É onde são armazenados as informações sobre 
o último commit.
15 
Mãos na massa
16 
init 
Esse comando irá inciar um repositório local na 
pasta onde foi executado
17 
init 
$ mkdir tutorial-git 
$ cd tutorial-git 
$ git init 
Initialized empty Git repository in .../tutorial-git/. 
git/
18 
status 
Mostra o estado atual do projeto
19 
status 
$ git status 
# On branch master 
# 
# Initial commit 
# 
nothing to commit (create/copy files and use 
"git add" to track)
20 
Criamos a classe App.java
21 
status 
$ git status 
# On branch master 
# 
# Initial commit 
# 
# Untracked files: 
# (use "git add <file>..." to include in what will be committed) 
# 
# App.java 
nothing added to commit but untracked files present (use "git add" 
to track)
22 
add 
Adiciona os arquivos para o índice do git.
23 
add 
$ git add . 
$ git status 
# On branch master 
# 
# Initial commit 
# 
# Changes to be committed: 
# (use "git rm --cached <file>..." to unstage) 
# 
# new file: App.java 
#
24 
commit 
Salva as alterações contidas no índice para o 
repositório do git
25 
commit 
$ git commit -m "Iniciando o projeto" 
[master (root-commit) aab8232] Iniciando o 
projeto 
1 file changed, 7 insertions(+) 
create mode 100644 App.java
26 
commit 
$ git commit -m "Iniciando o projeto" 
[master (root-commit) aab8232] Iniciando o 
projeto 
1 file changed, 7 insertions(+) 
create mode 100644 App.java 
$ git status 
# On branch master 
nothing to commit, working directory clean
27 
Criando teste com valores 
fixos
28 
commit 
git add . 
$ git commit -m "Teste com valores fixos" 
[master 0dc82d0] Teste com valores fixos 
1 file changed, 5 insertions(+), 1 deletion(-)
29 
log 
Mostra o histórico de commits
30 
log 
$ git log 
commit 0dc82d02b8552dea278a1dfa118d3d722a33f380 
Author: Humberto Streb <hstreb@gmail.com> 
Date: Thu Sep 12 10:52:29 2013 -0300 
Teste com valores fixos 
commit aab8232b734b7dbd133f07d13afc2fbf642183d1 
Author: Humberto Streb <hstreb@gmail.com> 
Date: Thu Sep 12 10:48:48 2013 -0300 
Iniciando o projeto
31 
Adicionando leitura do 
teclado
32 
add e commit no mesmo 
comando 
git commit -a -m "Ler do teclado" 
1 file changed, 6 insertions(+), 1 deletion(-)
33 
tag 
Serve como marcação para um determinado 
momento do projeto
34 
tag 
$ git tag v-1 
$ git tag 
v-1
35 
branch 
Esse comando cria uma ramificação do projeto
36 
branch 
$ git branch 
* master 
$ git branch tratarExcecao 
$ git checkout tratarExcecao 
Switched to branch 'tratarExcecao' 
$ git branch 
master 
* tratarExcecao
37 
branch 
$ git checkout -b tratarExcecao
38 
Adicionando o tratamento 
de exceções no branch
39 
Adicionando o tratamento 
de exceções no branch 
$ git commit -a -m "Tratamento exceção" 
[tratarExcecao ecf16a9] Tratamento exceção 
1 file changed, 9 insertions(+), 3 deletions(-)
40 
checkout 
É o comando responsável por “atualizar” para 
o branch que deseja ir.
41 
checkout para o master 
$ git checkout master 
Switched to branch 'master'
42 
O arquivo App.java voltou 
para o formato anterior
43 
Adição do método 
processaResposta
44 
Adição do método 
processaResposta 
$ git commit -a -m "Adicção método 
processaResposta" 
[master 4c163d6] Adicção método 
processaResposta 
1 file changed, 4 insertions(+)
Corrigindo o último commit 
$ git log 
... 
45 
Adicção método processaResposta 
$ git commit --amend -m "Adição método processaResposta" 
[master 9deaa21] Adição método processaResposta 
1 file changed, 4 insertions(+) 
$ git log 
... 
Adição método processaResposta
46 
dif 
Mostra as diferenças entre o branch atual e o 
destinatário
47 
dif 
$ git checkout tratarExcecao 
Switched to branch 'tratarExcecao'
$ git diff master 
diff --git a/App.java b/App.java 
index 3edc65f..15b4da3 100644 
--- a/App.java 
+++ b/App.java 
@@ -4,14 +4,16 @@ public class App { 
48 
public static void main(String[] args) { 
Scanner scanner = new Scanner(System.in); 
- 
- System.out.println("Digite um numero:"); 
- int numero = scanner.nextInt(); 
- processaResultado(numero); 
- } 
- 
- private static void processaResultado(int numero) { 
+ int numero; 
+ try { 
+ System.out.println("Digite um número:"); 
+ numero = scanner.nextInt(); 
+ } catch (Exception e) { 
+ System.out.println("Não foi possível ler o valor digitado! O valor será 0."); 
+ numero = 0; 
+ } 
+ 
int dobro = numero * numero; 
System.out.println("O dobro: " + dobro);
49 
merge 
Responsável por fazer a concatenação das 
diferenças entre os branches
50 
Fazendo merge com o 
master 
$ git merge master 
Auto-merging App.java 
Merge made by the 'recursive' strategy. 
App.java | 4 ++++ 
1 file changed, 4 insertions(+)
51 
Adicionando o método 
lerInteiro
52 
Adicionando o método 
lerInteiro 
$ git checkout master 
Switched to branch 'master' 
$ git commit -a -m "Adição método lerInteiro" 
[master e41e17b] Adição método lerInteiro 
1 file changed, 9 insertions(+), 4 deletions(-)
53 
Fazendo merge com o 
master (2) 
$ git checkout tratarExcecao 
Switched to branch 'tratarExcecao' 
$ git merge master 
Auto-merging App.java 
CONFLICT (content): Merge conflict in 
App.java 
Automatic merge failed; fix conflicts and then 
commit the result.
54
55 
Consertar o método 
lerInteiro
56 
Fazer o merge do branch 
para o master 
$ git commit -a -m "Tratar exceção no método lerInteiro" 
[tratarExcecao c7053bb] Tratar exceção no método lerInteiro 
$ git checkout master 
Switched to branch 'master' 
$ git merge tratarExcecao 
Updating e41e17b..c7053bb 
Fast-forward 
App.java | 10 +++++++--- 
1 file changed, 7 insertions(+), 3 deletions(-)
57 
Colaborando
58 
remote 
É utilizado para adicionar um repositório 
remoto ao projeto
59 
remote 
$ git remote add origin 
git@github.com:hstreb/tutorial-git.git
60 
clone 
É utilizado para “clonar” um repositório.
61 
clone 
$ git clone git@github.com:hstreb/tutorial-git.git 
Cloning into 'projeto'... 
remote: Counting objects: 27, done. 
remote: Compressing objects: 100% (10/10), 
done. 
remote: Total 27 (delta 9), reused 24 (delta 9) 
Receiving objects: 100% (27/27), done. 
Resolving deltas: 100% (9/9), done.
62 
push 
Este comando envia as alterações contidas no 
repositório local para o repositório remoto
63 
push 
$ git push origin master 
Warning: Permanently added the RSA host key for IP address 
'192.30.252.131' to the list of known hosts. 
Counting objects: 24, done. 
Delta compression using up to 2 threads. 
Compressing objects: 100% (16/16), done. 
Writing objects: 100% (24/24), 2.26 KiB, done. 
Total 24 (delta 9), reused 0 (delta 0) 
To git@github.com:hstreb/tutorial-git.git 
* [new branch] master -> master
64 
push branches 
$ git push origin tratarExcecao 
Warning: Permanently added the RSA host key 
for IP address '192.30.252.130' to the list of 
known hosts. 
Total 0 (delta 0), reused 0 (delta 0) 
To git@github.com:hstreb/tutorial-git.git 
* [new branch] tratarExcecao -> 
tratarExcecao
65 
pull 
É utilizado para baixar as alterações contidas 
no repositório remoto
66 
pull 
$ git pull origin master 
From github.com:hstreb/tutorial-git 
* branch master -> FETCH_HEAD 
Updating c7053bb..85cde87 
Fast-forward 
README.md | 9 +++++++++ 
1 file changed, 9 insertions(+) 
create mode 100644 README.md
67 
stash 
Stash é utilizado para adicionar várias 
alterações em uma pilha, que é armazenada 
localmente
68 
stash Adicionar alterações 
$ git stash 
Saved working directory and index state  
"WIP on master: 049d078 added the index 
file" 
HEAD is now at 049d078 added the index file 
(To restore them type "git stash apply")
69 
stash listar alterações já 
realizadas 
$ git stash list 
stash@{0}: WIP on master: 049d078 added the 
index file 
stash@{1}: WIP on master: c264051... Revert 
"added file_size" 
stash@{2}: WIP on master: 21d80a5... added 
number to log
70 
stash aplicar alterações 
$ git stash apply 
# On branch master 
# Changes not staged for commit: 
# (use "git add <file>..." to update what will 
be committed) 
# 
# modified: App.java 
#
71 
stash aplicar e retirar da 
lista as alterações 
$ git stash pop 
# On branch master 
# Changes not staged for commit: 
# (use "git add <file>..." to update what will 
be committed) 
# 
# modified: App.java 
#
72 
stash aplicar alterações 
mais antigas 
$ git stash apply@{2} 
# On branch master 
# Changes not staged for commit: 
# (use "git add <file>..." to update what will 
be committed) 
# 
# modified: App.java 
#
73 
stash aplicar alterações 
mais antigas 
{0} representa o último stash que você fez; 
{1} representa penúltimo, e assim por diante. 
Essa sintaxe também aparece em outros 
lugares (show, por exemplo).
74 
projeto
75 
Links 
http://git-scm.com 
https://github.com/hstreb/tutorial-git
76 
Muito obrigado!

Descomplicando o controle de versão com git

  • 1.
    Descomplicando o controle de versão com Git Humberto Streb
  • 2.
    2 Humberto Streb Bel. Sistemas de Informação Desenvolvedor Java Entusiasta Linux Curioso github.com/hstreb hstreb@gmail.com
  • 3.
    3 Controle deversão “É um software com a finalidade de gerenciar diferentes versões no desenvolvimento de um documento qualquer.” [Wikipédia]
  • 4.
  • 5.
  • 6.
    6 Vantagens Históricode alterações Facilidade de reverter alterações Facilidade de ramificar o projeto Facilidade de marcar (tag) dados Backup do código fonte
  • 7.
    7 Git “Éum sistema de controle de versão distribuido gratuito e open source desenhado para lidar com tudo, desde pequenos até grandes projetos com rapidez e eficiência.” [git-scm.com]
  • 8.
    8 Git Focoem velocidade Foco no design simples Suporte robusto a desenvolvimento não linear (milhares de branches paralelos) Totalmente distribuído Capaz de lidar eficientemente com grandes projetos como o kernel do Linux
  • 9.
    9 Empresas queutilizam Git
  • 10.
    10 Configuração $git config --global user.name "Humberto Streb" $ git config --global user.email "hstreb@gmail.com"
  • 11.
  • 12.
    12 Área detrabalho É onde são carregados os arquivos vindo de um repositório (checkout). Nela estão os arquivos vigentes.
  • 13.
    13 Área depreparação É uma área temporária, que contem as informações do próximo commit.
  • 14.
    14 Diretório doGit É onde são armazenados as informações sobre o último commit.
  • 15.
  • 16.
    16 init Essecomando irá inciar um repositório local na pasta onde foi executado
  • 17.
    17 init $mkdir tutorial-git $ cd tutorial-git $ git init Initialized empty Git repository in .../tutorial-git/. git/
  • 18.
    18 status Mostrao estado atual do projeto
  • 19.
    19 status $git status # On branch master # # Initial commit # nothing to commit (create/copy files and use "git add" to track)
  • 20.
    20 Criamos aclasse App.java
  • 21.
    21 status $git status # On branch master # # Initial commit # # Untracked files: # (use "git add <file>..." to include in what will be committed) # # App.java nothing added to commit but untracked files present (use "git add" to track)
  • 22.
    22 add Adicionaos arquivos para o índice do git.
  • 23.
    23 add $git add . $ git status # On branch master # # Initial commit # # Changes to be committed: # (use "git rm --cached <file>..." to unstage) # # new file: App.java #
  • 24.
    24 commit Salvaas alterações contidas no índice para o repositório do git
  • 25.
    25 commit $git commit -m "Iniciando o projeto" [master (root-commit) aab8232] Iniciando o projeto 1 file changed, 7 insertions(+) create mode 100644 App.java
  • 26.
    26 commit $git commit -m "Iniciando o projeto" [master (root-commit) aab8232] Iniciando o projeto 1 file changed, 7 insertions(+) create mode 100644 App.java $ git status # On branch master nothing to commit, working directory clean
  • 27.
    27 Criando testecom valores fixos
  • 28.
    28 commit gitadd . $ git commit -m "Teste com valores fixos" [master 0dc82d0] Teste com valores fixos 1 file changed, 5 insertions(+), 1 deletion(-)
  • 29.
    29 log Mostrao histórico de commits
  • 30.
    30 log $git log commit 0dc82d02b8552dea278a1dfa118d3d722a33f380 Author: Humberto Streb <hstreb@gmail.com> Date: Thu Sep 12 10:52:29 2013 -0300 Teste com valores fixos commit aab8232b734b7dbd133f07d13afc2fbf642183d1 Author: Humberto Streb <hstreb@gmail.com> Date: Thu Sep 12 10:48:48 2013 -0300 Iniciando o projeto
  • 31.
  • 32.
    32 add ecommit no mesmo comando git commit -a -m "Ler do teclado" 1 file changed, 6 insertions(+), 1 deletion(-)
  • 33.
    33 tag Servecomo marcação para um determinado momento do projeto
  • 34.
    34 tag $git tag v-1 $ git tag v-1
  • 35.
    35 branch Essecomando cria uma ramificação do projeto
  • 36.
    36 branch $git branch * master $ git branch tratarExcecao $ git checkout tratarExcecao Switched to branch 'tratarExcecao' $ git branch master * tratarExcecao
  • 37.
    37 branch $git checkout -b tratarExcecao
  • 38.
    38 Adicionando otratamento de exceções no branch
  • 39.
    39 Adicionando otratamento de exceções no branch $ git commit -a -m "Tratamento exceção" [tratarExcecao ecf16a9] Tratamento exceção 1 file changed, 9 insertions(+), 3 deletions(-)
  • 40.
    40 checkout Éo comando responsável por “atualizar” para o branch que deseja ir.
  • 41.
    41 checkout parao master $ git checkout master Switched to branch 'master'
  • 42.
    42 O arquivoApp.java voltou para o formato anterior
  • 43.
    43 Adição dométodo processaResposta
  • 44.
    44 Adição dométodo processaResposta $ git commit -a -m "Adicção método processaResposta" [master 4c163d6] Adicção método processaResposta 1 file changed, 4 insertions(+)
  • 45.
    Corrigindo o últimocommit $ git log ... 45 Adicção método processaResposta $ git commit --amend -m "Adição método processaResposta" [master 9deaa21] Adição método processaResposta 1 file changed, 4 insertions(+) $ git log ... Adição método processaResposta
  • 46.
    46 dif Mostraas diferenças entre o branch atual e o destinatário
  • 47.
    47 dif $git checkout tratarExcecao Switched to branch 'tratarExcecao'
  • 48.
    $ git diffmaster diff --git a/App.java b/App.java index 3edc65f..15b4da3 100644 --- a/App.java +++ b/App.java @@ -4,14 +4,16 @@ public class App { 48 public static void main(String[] args) { Scanner scanner = new Scanner(System.in); - - System.out.println("Digite um numero:"); - int numero = scanner.nextInt(); - processaResultado(numero); - } - - private static void processaResultado(int numero) { + int numero; + try { + System.out.println("Digite um número:"); + numero = scanner.nextInt(); + } catch (Exception e) { + System.out.println("Não foi possível ler o valor digitado! O valor será 0."); + numero = 0; + } + int dobro = numero * numero; System.out.println("O dobro: " + dobro);
  • 49.
    49 merge Responsávelpor fazer a concatenação das diferenças entre os branches
  • 50.
    50 Fazendo mergecom o master $ git merge master Auto-merging App.java Merge made by the 'recursive' strategy. App.java | 4 ++++ 1 file changed, 4 insertions(+)
  • 51.
    51 Adicionando ométodo lerInteiro
  • 52.
    52 Adicionando ométodo lerInteiro $ git checkout master Switched to branch 'master' $ git commit -a -m "Adição método lerInteiro" [master e41e17b] Adição método lerInteiro 1 file changed, 9 insertions(+), 4 deletions(-)
  • 53.
    53 Fazendo mergecom o master (2) $ git checkout tratarExcecao Switched to branch 'tratarExcecao' $ git merge master Auto-merging App.java CONFLICT (content): Merge conflict in App.java Automatic merge failed; fix conflicts and then commit the result.
  • 54.
  • 55.
    55 Consertar ométodo lerInteiro
  • 56.
    56 Fazer omerge do branch para o master $ git commit -a -m "Tratar exceção no método lerInteiro" [tratarExcecao c7053bb] Tratar exceção no método lerInteiro $ git checkout master Switched to branch 'master' $ git merge tratarExcecao Updating e41e17b..c7053bb Fast-forward App.java | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-)
  • 57.
  • 58.
    58 remote Éutilizado para adicionar um repositório remoto ao projeto
  • 59.
    59 remote $git remote add origin git@github.com:hstreb/tutorial-git.git
  • 60.
    60 clone Éutilizado para “clonar” um repositório.
  • 61.
    61 clone $git clone git@github.com:hstreb/tutorial-git.git Cloning into 'projeto'... remote: Counting objects: 27, done. remote: Compressing objects: 100% (10/10), done. remote: Total 27 (delta 9), reused 24 (delta 9) Receiving objects: 100% (27/27), done. Resolving deltas: 100% (9/9), done.
  • 62.
    62 push Estecomando envia as alterações contidas no repositório local para o repositório remoto
  • 63.
    63 push $git push origin master Warning: Permanently added the RSA host key for IP address '192.30.252.131' to the list of known hosts. Counting objects: 24, done. Delta compression using up to 2 threads. Compressing objects: 100% (16/16), done. Writing objects: 100% (24/24), 2.26 KiB, done. Total 24 (delta 9), reused 0 (delta 0) To git@github.com:hstreb/tutorial-git.git * [new branch] master -> master
  • 64.
    64 push branches $ git push origin tratarExcecao Warning: Permanently added the RSA host key for IP address '192.30.252.130' to the list of known hosts. Total 0 (delta 0), reused 0 (delta 0) To git@github.com:hstreb/tutorial-git.git * [new branch] tratarExcecao -> tratarExcecao
  • 65.
    65 pull Éutilizado para baixar as alterações contidas no repositório remoto
  • 66.
    66 pull $git pull origin master From github.com:hstreb/tutorial-git * branch master -> FETCH_HEAD Updating c7053bb..85cde87 Fast-forward README.md | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 README.md
  • 67.
    67 stash Stashé utilizado para adicionar várias alterações em uma pilha, que é armazenada localmente
  • 68.
    68 stash Adicionaralterações $ git stash Saved working directory and index state "WIP on master: 049d078 added the index file" HEAD is now at 049d078 added the index file (To restore them type "git stash apply")
  • 69.
    69 stash listaralterações já realizadas $ git stash list stash@{0}: WIP on master: 049d078 added the index file stash@{1}: WIP on master: c264051... Revert "added file_size" stash@{2}: WIP on master: 21d80a5... added number to log
  • 70.
    70 stash aplicaralterações $ git stash apply # On branch master # Changes not staged for commit: # (use "git add <file>..." to update what will be committed) # # modified: App.java #
  • 71.
    71 stash aplicare retirar da lista as alterações $ git stash pop # On branch master # Changes not staged for commit: # (use "git add <file>..." to update what will be committed) # # modified: App.java #
  • 72.
    72 stash aplicaralterações mais antigas $ git stash apply@{2} # On branch master # Changes not staged for commit: # (use "git add <file>..." to update what will be committed) # # modified: App.java #
  • 73.
    73 stash aplicaralterações mais antigas {0} representa o último stash que você fez; {1} representa penúltimo, e assim por diante. Essa sintaxe também aparece em outros lugares (show, por exemplo).
  • 74.
  • 75.
    75 Links http://git-scm.com https://github.com/hstreb/tutorial-git
  • 76.