Controle de versão com Git

Uma equipe deseja trabalhar em um grande projeto. O que fazer???

Compartilhar os arquivos na nuvem?

Passar os arquivos por pendrive?

Fazer o projeto em reunião com sua equipe?

problemas de colaboração

Bom, outras pessoas já passaram por isso...

linus

Linus Torvalds

Um dos criadores do linux

git

Git

Controlador de versão distribuido

Controle de versão distribuído

controle de versão
## Inicializando o git Inicialize seu projeto ``` $ mkdir choose-your-adventure $ cd choose-your-adventure $ git init ``` Configure o seu usuário do git ``` $ git config user.name "John Doe" $ git config user.email johnd@infojr.com.br ```

Exercício

Objetivo

Configurar e inicializar um repositório e adicionar alguns arquivos

Método

Iniciar um repositório

Configurar seu usuário

Escrever um arquivo adventure.md

Fluxo Git

fluxo de trabalho no git

A analogia da fotografia

Arquivo = Modelo

Git add = posicionar o modelo (arquivo) no palco (staging area)

Git commit = Tirar foto

Git Status

Certifica o status corrente do diretório


$git status
# On branch master
#
# Initial commit
# Untracked files:(use "git add ..." to include in what will be committed)
#
# adventure.md
                    

Adicionando ao palco

Devemos começar a rastrear as mudanças


$git add adventure.md
$git status
# On branch master
#
# Initial commit
# Changes to be commited:
#    (use "git rm --cached <"file">..." to unstage)
#
#   new file: adventure.md
                    

Armazenando uma foto

Guardando uma foto no repositório local


$git commit -m "Initial commit"
$git status
# On branch master
nothing to commit (working directory clean)
                    

Exercício

Objetivo

Armazenar os arquivos no repositório local através dos commits

Método

Adicionar arquivos para a staging area (dica: git add);

Salvar alterações no repositório local (dica: git commit);

Criar uma cena e mais 3 cenas que possam ser desencadeadas pela primeira (dungeons);

Realizar mesmo processo para salvar alterações no repositório local;

Bônus: Adicionar css à página.

Histórico

É possível ver quais alterações feitas


$ git log
commit  19dd00d4913497107ef6de07e0ee00a9b9315304
Author: John Doe   <"johnd@infojr.com.br">
Date:           Sun Oct 12  02:51:03    2014    -0300
                Creating    index   and modifying README.md
commit  a44995e61542e54aa88e55908cf09133578a43f6
Author: John Doe    <"johnd@infojr.com.br">
Date:           Sun Oct 12  02:37:13    2014    -0300
                Initial commit
                    

Diferenças entre commits

Podemos ver o que modificamos em relação ao repositório local


$   git diff
diff    --git   a/README.md b/README.md
index   9d1d09d..61f26f8    100644
--- a/README.md
+++ b/README.md
@@  -1,2    +1,4    @@
    Minha aventura
    ===================
+
+Andando pela rua, você vê ao longe um gnomo carregando uma sacola cheia de ouro
+a) Você segue o gnomo [(vá para 2)](2.md)
$   git add adventure.md
$   git diff
                    

Add acidental

Como fazer para remover arquivos adicionados acidentalmente?


$   git status
#   On  branch  master
#   Changes to  be  committed:
#           (use    "git    reset   HEAD    ..."  to  unstage)
#
# modified:         adventure.md
#
$   git reset   HEAD    adventure.md
Unstaged    changes after   reset:
M adventure.md
                    

Descartando modificações

E se eu quiser voltar como estava antes?


$   git status
#   On  branch  master
#   Changes not staged  for commit:
#           (use    "git    add ..."  to  update  what    will    be  committed)
#           (use    "git    checkout    --  ..."  to  discard changes in  working
directory)
#
# modified:         adventure.md
#
no  changes added   to  commit  (use    "git    add"    and/or  "git    commit  -a")
$   git checkout    --  adventure.md
$   git status
                    

REFAZENDO COMMITS

E se eu esqueci de adicionar alguma coisa?


$   git reset   --soft  HEAD^
$   git status
#   On  branch  master
#   Changes to  be  committed:
#           (use    "git    reset   HEAD    ..."  to  unstage)
#
# modified:         adventure.md
# new   file:           2.md
#
                    

Adicionando a um commit

E se eu esqueci de adicionar alguma coisa?


$   git add dungeon_new.html
$   git commit  --amend -m  "Adding new option"
                    

Para que as pessoas peguem as modificações do repositório remoto


$   git pull
                    

Para que as pessoas peguem o repositório remoto


$   git clone   https://github.com/<"user">/<"project">.git [<"folder">]
                    

Compartilhando repositórios

github

Github

Adicionando servidor remoto

Precisamos definir quem vai ser o nosso servidor central


$   git remote  add origin  https://github.com/<"user">/<"project">.git
$   git push    -u  origin  master
                    

Exercício

Objetivo

Crie um repositório remoto e colabore com o do colega

Método

Crie o seu repositório no github e envie o seu código (dica: git remote e git push);

Adicione o colega do seu lado como colaborador como colaborador;

Crie uma cópia do repositório do seu colega (dica: git clone);

Sem contar o que está fazendo, faça as alterações que desejar no projeto dele;

Envie as suas alterações para o github (dica: git push);

Volte para o diretório do seu projeto e pegue as alterações feitas pelo seu colega (dica: git pull);

Identifique as alterações feitas sem perguntar para o colega que as modificou.

Mais colaboração!

branches

Branches

Criar branch


$ git branch aventura
                    

Acessar branch


$ git checkout aventura
Switched to branch 'aventura'
                    

Atalho para criar e acessar branch em um só comando


$ git checkout -b aventura
                    

Listar branches


$ git branch
 aventura
* master
                    

Baixar branch


git checkout -t origin/<"branch">
                    

Exercício

Objetivo

Crie uma branch e nessa branch crie mais cenas para sua história

Método

Crie uma branch (dica: git branch);

Vá para a branch (dica: git checkout);

Crie um formulário para salvar personagens;

Faça o commit dessa funcionalidade;

Volte para a branch master.

O que foi que aconteceu?

Merge Branches

Terminamos de criar as outras cenas da nossa história. É hora de fundir as branches


$ git checkout master
$ git merge char
Updating c8541d6..a226599
Fast-forward
 0 files changed, 0 insertions(+),
0 deletions(-)
 create mode 100644 chars_new.html
                    

Remover branch


$ git branch -d char
                    

Resolvendo conflitos

E quando duas pessoas mechem no mesmo arquivo?


$ git push
! [rejected]        master  ->
master (non-fast-forward)
                    

IMPORTANTE! REALIZAR GIT PULL ANTES DE GIT PUSH!

Resolvendo conflitos

Arquivo com conflito


<<<<<<< HEAD
        DungeonCrawlers Generations
=======
        Dungeon  Crawlers
>>>>>>> 7a61a9b596cdd07120e36f4f916ee65036d5c179
                        

Natureza do Conflito

  • Desatenção ao git fetch **evitável**
  • Mesmo arquivo modificado em paralelo **Quase inevitável (necessário)**

Integrar uma ferramenta ao git

  • Meld Merge meld-merge
  • Faz essa mágina toda de forma lindamente linda!!

Instalação


$ apt-get install meld
                        

Configuração


$ git config --global merge.tool meld
$ git config --global diff.guitool meld
                        

Ferramenta para merge e diff

Execução para merge


$ git mergetool
                        

Ou para Diff


$ git difftool
                        

Powered By:

  • Rafael Coelho
    • Pós Júnior
    • Ciência da Computação
  • Marino Hohenheim
    • Gerente de Provisão
    • Ciência da Computação