Post on 27-Jun-2015
description
Git: Controlo de Versões
@botequilha
Agenda
1. O que é isso?2. Layout dos repositórios3. Uma introdução pragmática
1. Criar / clonar repositórios2. Ignorar ficheiros3. Adicionar ficheiros e submeter alterações4. Branching / merging5. Comparar commits e consultar a história6. Partilhar alterações7. Stashing8. Remote branches9. "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 = originmerge = 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ções1. considerar se as alterações não foram commited2. 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