Controle de versão com Git&Github

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

linus

Linus Torvalds

Um dos criadores do linux

git

Git

Controlador de versão distribuido

Controle de versão centralizado

controle de versão

Controle de versão distribuído

controle de versão

Exercício


Configurar e inicializar um repositório e adicionar alguns arquivos

Método

Iniciar um repositório

Configurar seu usuário

Escrever um arquivo nomeDoPlayer.md

## Inicializando o git Inicialize seu projeto ``` $ git init ``` Configure o seu usuário do git ```lisp $ git config user.name "John Doe" $ git config user.email johnd@infojr.com.br ``` Conferindo ```lisp $ git config -l ```

Fluxo Git

fluxo de trabalho no git
fluxo de trabalho no git

Arquivo = Agente


git add = Posiciona o Agente para uma foto

git commit = Tira a foto para o crachá

fluxo de trabalho no git

Arquivo = Agente

git commit = Tira a foto para o crachá

git push = Envia o cadastro (commit) para a unidade do porta aviões da SHIELD (repositório remoto)

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)
#
# nomeDoPlayer.md
                    

Posicionando para a Foto

Devemos começar a rastrear as mudanças


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

Criando o crachá

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

Alterar o arquivo commitado

Adicionar um arquivo README.md

Método

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

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

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

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   deadc001..c0ffeee    100644
--- a/README.md
+++ b/README.md
@@  -1,2    +1,4    @@
    Minha aventura
    ===================
+
+John Doe
+ * __age:__ 22
+ * __role:__ Agent Shield
$   git add nomeDoplayer.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:         nomeDoplayer.md
#
$   git reset   HEAD    nomeDoplayer.md
Unstaged    changes after   reset:
M nomeDoplayer.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:         nomeDoplayer.md
#
no  changes added   to  commit  (use    "git    add"    and/or  "git    commit  -a")
$   git checkout    --  nomeDoplayer.md
$   git status
                    

REFAZENDO COMMITS

E se não era a hora daquele commit??


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

Adicionando a um commit

E se eu esqueci de adicionar alguma coisa?


$   git add partnerShield.md
$   git commit  --amend -m  "appending partner"
                    

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 push    -u  origin  master
                    

Para que seja possível pegar as modificações do repositório remoto


$   git pull origin nomeDaBranch
                    

Ou ...


$   git fetch origin
                    

Para que as pessoas peguem o repositório remoto


$   git clone https://github.com/usuario/projeto [folder]
                    

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
                    

Enviar branch específica


$ git push origin nomeDaBranch
                    

Baixar branch específica


$ git checkout -t origin/nomeDaBranch
                    

Atualizar Branch específica e mover a HEAD


$ git pull origin nomeDaBranch
                    

Baixar o que há de novo (não move a HEAD)


$ git fetch origin
                    

Exercício

Objetivo

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

Método

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

Crie sua branch (dica: git branch, git checkout, nome diferente do seu colega);

Crie os asquivos main.md e teamMyName.md

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

Pegue as alterações feitas pelo seu colega (dica: git fetch, git pull);

Merge Branches

Terminamos de criar diferentes pontos de vista da nossa história. É hora de fundir as branches

Somente um dos desenvolvedores executa


$ git checkout master
$ git merge adventure
Updating deadc001.. c0ffeee
Fast-forward
 2 files changed, 45 insertions(+),
7 deletions(-)
 create mode 100644 main.md
 create mode 100644 teamHohenheim.md
                    

Remover branch


$ git branch -d adventure
                    

Merge Branches

Ainda o mesmo desenvolvedor executa

Envia as alterações locais


$ git push origin master
Counting objects: 15, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (5/5), done.
Writing objects: 100% (5/5), 1.47 KiB | 0 bytes/s, done.
Total 5 (delta 3), reused 0 (delta 0)
To https://github.com/Marinofull/war
   7725303..1d84a0e  master -> master
                    

Merge Branches

Desta vez o segundo desenvolvedor:

Pega as alterações remotas (dica: fetch, pull)

Executa o merge da sua branch na master


$ git fetch origin
$ git pull origin master
$ git checkout master
$ git merge adventure2
                    

O que aconteceu?

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
>>>>>>> c0ffeebabacac001deadbeebada55bada1aca0ff
                        

Natureza do Conflito

Natureza do Conflito

  • Desatenção ao git fetch **evitável**
    
    ! [rejected]        master  ->
    master (non-fast-forward)
                        
  • 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
                        

  • Marino Hohenheim
    • Gerente de Provisão - InfoJr UFBA
    • Ciência da Computação
  • Rafael Coelho
    • Pós Júnior
    • Ciência da Computação
  • Criado com Reveal.js