Git: Controlo de Versões
        @botequilha
Agenda

1. O que é isso?
2. Layout dos repositórios
3. Uma introdução pragmática
    1. Criar / clonar repositórios
    2. Ignorar ficheiros
    3. Adicionar ficheiros e submeter alterações
    4. Branching / merging
    5. Comparar commits e consultar a história
    6. Partilhar alterações
    7. Stashing
    8. Remote branches
    9. "Desfazer" alterações
O que é:

● desenvolvido por Linus Torvalds;

● um sistema de controlo de versões (VCS);

● distribuído vs centralizado;
 (rep. privados && rep. públicos)

● commit ID's vs revision numbers;

● metodologia de desenvolvimento ramificada (branches);
Layout dos repositórios

                                  Uma configuração típica,
                                  com repositórios locais
                                  privados e repositórios
                                  públicos.

                                  Os layouts podem ser
                                  uma mistura entre as
                                  configurações
                                  centralizada e distribuída.



Fonte: Pragmatic Guide to Git -
   2010 Swicegood, Travis
Criar/clonar Repositórios

 ● criar uma nova directoria .git na directoria actual
 ● inicializar o repositório Git
$> cd /path/to/project/
$> git init

 ● o repositório é inicializado uma única vez
 ● pode ser apagado da mesma forma que qualquer outra directoria
Criar/clonar Repositórios
$> cd /path/to/project/
$> git clone some-repository

 ● URI's válidos p/ o comando git clone:
    user@ssh_host:path_to_repo
    git://some_domain/path_to_repo
    http://some_domain/path_to_repo
    https://some_domain/path_to_repo

$> git clone --depth <x> some-repository

 ● shallow copies
 ● copia apenas os últimos x commits do repositório
 ● não pode ser clonado
Ignorar ficheiros
● criar ficheiro .gitignore na raíz da directoria do projecto
● e.g.:
# this is a comment
# ignore foo.txt file
foo.txt

# ignore generated pyc files
*.pyc

# but do not ignore bar.pyc
!bar.pyc

# ignore all directories
*.[a]

● ignorar ficheiros relativamente a um repositório: .
  git/info/exclude
Adicionar Ficheiros e Submeter
                   Alterações
  ● adicionar ficheiros ao index do repositório
$> git add <some-file>

  ● os ficheiros ficam staged e prontos para integrarem um
    commit

  ● consultar o estado do index
$> git status

  ● apresenta também info. sobre a relação entre o repositório
    e os restantes ficheiros

  ● submeter as alterações
$> git commit -m "<message>"
Branching / Merging
  ● um repositório pode conter múltiplos branches de
    desenvolvimento
$> git branch <branchname>

  ● o nome do branch pode ser definido como uma path
$> git branch author/dev-type/what_to_do

  ● listar branches locais
$> git branch
$> *master
$> author/dev-type/what_to_do

  ● listar todos os branches (locais e remotos)
$> git branch -a
$> *master
$> author/dev-type/what_to_do
$> remotes/origin/master
Branching / Merging

 ● mudar de branch
$> git checkout <branchname>

 ● as alterações só são visíveis no branch actual
 ● para aplicá-las noutro branch é necessário fazer merge
$> git checkout <other-branchname>
$> git merge <branchname>

 ● se tudo correr bem, as alterações serão incorporadas
   no branch actual
 ● caso contrário, surgirão conflitos que necessitarão de ser
   resolvidos
Comparar commits e consultar a
                   história
  ● comparar commits permite ver o que realmente foi alterado
  ● podem comparar-se quaisquer dois pontos da história do
    projecto

  ● consultar alterações feitas mas que ainda não foram staged
$> git diff

  ● consultar alterações que foram staged (mas não commited)
$> git diff --cached

  ● comparar alterações com o último commit (HEAD)
$> git diff HEAD
Comparar commits e consultar a
                   história
  ● comparar as alterações actuais com o estado (último
    commit) de outro branch
$> git diff <branchname>

  ● comparar HEAD com as alterações actuais, limitando
    apenas a 1 ficheiro
$> git diff HEAD -- ./animals/models.py

  ● comparar alterações com o último commit (HEAD)
$> git diff HEAD

  ● obter um sumário de todas as alterações actuais
$> git diff --stat
Comparar commits e consultar a
                  história
 ● finalmente, a comparação pode ser feita entre quaisquer
   dois commits...
$> git diff <commit X>..<commit Y>

 ● ...ou entre quaisquer dois commits e o seu atepassado
   comum
$> git diff <commit X>...<commit Y>
Comparar commits e consultar a
                   história
  ● consultar a história do repositório
$> git log

  ● o comando permite várias opções de consulta
  ● e. g: commits desde um branch específico
$> git log v1.0..

  ● commits desde uma data específica
$> git log --since="2 weeks ago"

  ● mostrar que ficheiros foram alterados, nº de linhas
    removidas / adicionadas, em cada commit
$> git log --stat
Partilhar alterações
 ● actualizar repositório privado
$> git fetch <remote name>

 ● não é feito merge das alterações
 ● permite comparar as alterações antes de efectuar
   um merge
$> git diff <local branch> <remote branch>

 ● em alternativa
$> git pull <remote name>

 ● combina fetch e merge num só comando
 ● é útil (tipo mágico!), mas pode dar algumas dores de
   cabeça...
Partilhar alterações
  ● enviar alterações para branch remoto
$> git push [<local name>] [<remote name>]

  ● pode-se evitar introduzir os nomes do branch local e
    remoto, configurando o ficheiro .git/config
  ● e.g.:

[remote "origin"]
fetch = +refs/heads/*:refs/remotes/origin/*
url = ssh_key:remote_repo.git
[branch "master"]
remote = origin
merge = refs/heads/master
Partilhar alterações

● commit e share são duas tarefas distintas;

● para manter os branches locais sincronizados com
  os branches remotos, é necessário efectuar um git fetch;

● depois de sincronizados, é preciso fazer
  um merge dos branches para que as alterações fiquem
  disponíveis localmente;

● alternativa: git pull;
Stashing

 ● permite "guardar" temporariamente as alterações em curso
   e voltar ao estado inicial do branch
$> git stash "coding a fix"

 ● o index deixa de ter quaisquer alterações

 ● permite uma lista de stashed items
$> git stash list

 ● as alterações podem ser recolocadas novamente no branch
$> git stash apply [<stash queue item>]

 ● é extremamente útil em situações ad-hoc
Remote Branches
 ● criar um branch local
$> git branch -b <branch name>

 ● fazer checkout para o novo branch e realizar eventuais
   alterações

 ● o novo branch é submetido com push
$> git push <remote name> <branch name>

 ● um branch remoto pode também ser apagado
$> git push <remote name> :<branch name>

 ● apaga o branch no repositório remoto; é necessário apagá--
   lo no repositório local
$> git branch -d <branch name>
Reverter alterações
 1. considerar se as alterações não foram commited
 2. considerar se as alterações já foram commited

 ● no primeiro caso, se o index estiver mesmo messed up
$> git reset --hard HEAD

 ● as alterações serão todas revertidas

 ● mas pode-se reverter as alterações de um único ficheiro
$> git reset HEAD <file name>

 ● o ficheiro voltará ao estado anterior
Reverter alterações
 ● no segundo caso, se as alterações já foram commited e
   eventualmente publicadas
$> git revert HEAD

 ● as alterações serão revertidas para um commit anterior e
   será criado um novo commit
 ● a mensagem de commit poderá ser alterada
Fontes

● http://book.git-scm.com/

● http://pragprog.com/book/pg_git/pragmatic-guide-to-git

● git man pages

Git controlo de_versoes

  • 1.
    Git: Controlo deVersões @botequilha
  • 2.
    Agenda 1. O queé isso? 2. Layout dos repositórios 3. Uma introdução pragmática 1. Criar / clonar repositórios 2. Ignorar ficheiros 3. Adicionar ficheiros e submeter alterações 4. Branching / merging 5. Comparar commits e consultar a história 6. Partilhar alterações 7. Stashing 8. Remote branches 9. "Desfazer" alterações
  • 3.
    O que é: ●desenvolvido por Linus Torvalds; ● um sistema de controlo de versões (VCS); ● distribuído vs centralizado; (rep. privados && rep. públicos) ● commit ID's vs revision numbers; ● metodologia de desenvolvimento ramificada (branches);
  • 4.
    Layout dos repositórios Uma configuração típica, com repositórios locais privados e repositórios públicos. Os layouts podem ser uma mistura entre as configurações centralizada e distribuída. Fonte: Pragmatic Guide to Git - 2010 Swicegood, Travis
  • 5.
    Criar/clonar Repositórios ●criar uma nova directoria .git na directoria actual ● inicializar o repositório Git $> cd /path/to/project/ $> git init ● o repositório é inicializado uma única vez ● pode ser apagado da mesma forma que qualquer outra directoria
  • 6.
    Criar/clonar Repositórios $> cd/path/to/project/ $> git clone some-repository ● URI's válidos p/ o comando git clone: user@ssh_host:path_to_repo git://some_domain/path_to_repo http://some_domain/path_to_repo https://some_domain/path_to_repo $> git clone --depth <x> some-repository ● shallow copies ● copia apenas os últimos x commits do repositório ● não pode ser clonado
  • 7.
    Ignorar ficheiros ● criarficheiro .gitignore na raíz da directoria do projecto ● e.g.: # this is a comment # ignore foo.txt file foo.txt # ignore generated pyc files *.pyc # but do not ignore bar.pyc !bar.pyc # ignore all directories *.[a] ● ignorar ficheiros relativamente a um repositório: . git/info/exclude
  • 8.
    Adicionar Ficheiros eSubmeter Alterações ● adicionar ficheiros ao index do repositório $> git add <some-file> ● os ficheiros ficam staged e prontos para integrarem um commit ● consultar o estado do index $> git status ● apresenta também info. sobre a relação entre o repositório e os restantes ficheiros ● submeter as alterações $> git commit -m "<message>"
  • 9.
    Branching / Merging ● um repositório pode conter múltiplos branches de desenvolvimento $> git branch <branchname> ● o nome do branch pode ser definido como uma path $> git branch author/dev-type/what_to_do ● listar branches locais $> git branch $> *master $> author/dev-type/what_to_do ● listar todos os branches (locais e remotos) $> git branch -a $> *master $> author/dev-type/what_to_do $> remotes/origin/master
  • 10.
    Branching / Merging ● mudar de branch $> git checkout <branchname> ● as alterações só são visíveis no branch actual ● para aplicá-las noutro branch é necessário fazer merge $> git checkout <other-branchname> $> git merge <branchname> ● se tudo correr bem, as alterações serão incorporadas no branch actual ● caso contrário, surgirão conflitos que necessitarão de ser resolvidos
  • 11.
    Comparar commits econsultar a história ● comparar commits permite ver o que realmente foi alterado ● podem comparar-se quaisquer dois pontos da história do projecto ● consultar alterações feitas mas que ainda não foram staged $> git diff ● consultar alterações que foram staged (mas não commited) $> git diff --cached ● comparar alterações com o último commit (HEAD) $> git diff HEAD
  • 12.
    Comparar commits econsultar a história ● comparar as alterações actuais com o estado (último commit) de outro branch $> git diff <branchname> ● comparar HEAD com as alterações actuais, limitando apenas a 1 ficheiro $> git diff HEAD -- ./animals/models.py ● comparar alterações com o último commit (HEAD) $> git diff HEAD ● obter um sumário de todas as alterações actuais $> git diff --stat
  • 13.
    Comparar commits econsultar a história ● finalmente, a comparação pode ser feita entre quaisquer dois commits... $> git diff <commit X>..<commit Y> ● ...ou entre quaisquer dois commits e o seu atepassado comum $> git diff <commit X>...<commit Y>
  • 14.
    Comparar commits econsultar a história ● consultar a história do repositório $> git log ● o comando permite várias opções de consulta ● e. g: commits desde um branch específico $> git log v1.0.. ● commits desde uma data específica $> git log --since="2 weeks ago" ● mostrar que ficheiros foram alterados, nº de linhas removidas / adicionadas, em cada commit $> git log --stat
  • 15.
    Partilhar alterações ●actualizar repositório privado $> git fetch <remote name> ● não é feito merge das alterações ● permite comparar as alterações antes de efectuar um merge $> git diff <local branch> <remote branch> ● em alternativa $> git pull <remote name> ● combina fetch e merge num só comando ● é útil (tipo mágico!), mas pode dar algumas dores de cabeça...
  • 16.
    Partilhar alterações ● enviar alterações para branch remoto $> git push [<local name>] [<remote name>] ● pode-se evitar introduzir os nomes do branch local e remoto, configurando o ficheiro .git/config ● e.g.: [remote "origin"] fetch = +refs/heads/*:refs/remotes/origin/* url = ssh_key:remote_repo.git [branch "master"] remote = origin merge = refs/heads/master
  • 17.
    Partilhar alterações ● commite share são duas tarefas distintas; ● para manter os branches locais sincronizados com os branches remotos, é necessário efectuar um git fetch; ● depois de sincronizados, é preciso fazer um merge dos branches para que as alterações fiquem disponíveis localmente; ● alternativa: git pull;
  • 18.
    Stashing ● permite"guardar" temporariamente as alterações em curso e voltar ao estado inicial do branch $> git stash "coding a fix" ● o index deixa de ter quaisquer alterações ● permite uma lista de stashed items $> git stash list ● as alterações podem ser recolocadas novamente no branch $> git stash apply [<stash queue item>] ● é extremamente útil em situações ad-hoc
  • 19.
    Remote Branches ●criar um branch local $> git branch -b <branch name> ● fazer checkout para o novo branch e realizar eventuais alterações ● o novo branch é submetido com push $> git push <remote name> <branch name> ● um branch remoto pode também ser apagado $> git push <remote name> :<branch name> ● apaga o branch no repositório remoto; é necessário apagá-- lo no repositório local $> git branch -d <branch name>
  • 20.
    Reverter alterações 1.considerar se as alterações não foram commited 2. considerar se as alterações já foram commited ● no primeiro caso, se o index estiver mesmo messed up $> git reset --hard HEAD ● as alterações serão todas revertidas ● mas pode-se reverter as alterações de um único ficheiro $> git reset HEAD <file name> ● o ficheiro voltará ao estado anterior
  • 21.
    Reverter alterações ●no segundo caso, se as alterações já foram commited e eventualmente publicadas $> git revert HEAD ● as alterações serão revertidas para um commit anterior e será criado um novo commit ● a mensagem de commit poderá ser alterada
  • 22.