Prof. Me. Cícero Samuel Clemente Rodrigues
RebelLabs [2013]
Registra a evolução do projeto
Controla a concorrência de edição dos arquivos
Cria e mantém variações do projeto
{
Funções do Controle de Versão
Precisamos registrar o estado dos arquivos antes de ir para próxima implementação
A solução mais comum é compactar nomeando com a data ou versão
Com o tempo, torna-se impossível a gestão dessas versões...
Só os backups não bastam!
Provê mecanismos para controle de concorrência:
Um controle de versão é composto por:
armazena todo o histórico de evolução do projeto, registrando toda e qualquer alteração feita em cada item versionado
contém a cópia dos arquivos do projeto e que é monitorada para identificar as mudanças realizadas
envia modificações feitas gerando uma revisão
atualiza espaço de trabalho a partir de uma revisão
é o estado dos arquivos em determinado momento
(uma fotografia)
é uma configura configuração registrada
Rastreabilidade Bidirecional
Changeset
=
diferença entre duas configurações
Responde a pergunta
"O que mudou?"
config1
+
changeset2
=
config2
changeset2
=
config2
config1
-
Configuração é o estado dos arquivos do projeto em um determinado momento
Revisão é uma configuração registrada no repositório
Changeset é o conjunto de diferenças entre duas configurações
Versão é uma revisão usada em produção (Release)
Tipo de Controle de Versão
Variam de acordo com o arranjo entre o repositório e espaço de trabalho
Centralizado
Distribuído
Há um único repositório e várias cópias de trabalho que se comunicam apenas através do repositório central.
Cada desenvolvedor possui um repositório próprio acoplado a uma área de trabalho.
A comunicação entre eles continua sendo através de commit e update.
pull (puxar)
Atualiza o repositório local (destino) com todas as alterações feitas em outro repositório (origem)
push (empurrar)
Envia as alterações do repositório local (origem) para um outro repositório (destino)
Centralizado | Distribuído | Descrição |
---|---|---|
checkout | clone | criação da cópia de trabalho/repositório |
commit | commit | envia alterações para o repositório, criando uma revisão |
update | update checkout fetch |
atualiza a cópia/área de trabalho em uma revisão |
pull | importa revisões feita em outro repositório | |
push | envia revisões locais para outro repositório |
Numeração sequencial definida a partir da ordem das revisões
Hash SHA-1 a partir de cada configuração
Ex.: Subversion
Ex.: Mercurial e o GIT
The end result was I decided I can write something better than anything out there in two weeks, and I was right.
Modified/Untracked
Staged
Commited
git help
man git
ou
git config --global user.name "Nome"
git config --global user.email e-mail
Identificação
git config --global core.editor editor
Editor
git config --list
Verificar configurações atuais
Para iniciar um repositório Git:
Este comando cria toa a estrutura que o Git necessita para funcionar.
Os arquivos são criados na pasta oculta .git/
git init
O git status exibe as alterações ocorridas no repositório desde o último commit.
git status
O git add adiciona ou atualiza um arquivo da staging area.
Ou seja, o comando informa ao Git para rastrear o referido arquivo. Caso o arquivo já esteja sob controle do Git, ele o atualiza.
git add arquivo
git add .
git add diretório
git commit transfere o estado do projeto salvo na staging area para o repositório do projeto.
git commit
git commit -m "descrição do commit"
git commit -am "descrição do commit"
Todo commit deve possuir uma mensagem de identificação, usada para descrever as alterações do commit.
Favor, use-a para tal fim.
Escreva mensagens intuitívas.
O comando git diff compara o estado do repositório atualmente com o estado salvo na staging area
git diff
git diff arquivo
git diff id_commit
git diff id_commit id_commit
O git status informa "quem" foi alterado, mas e se eu quiser saber exatamente "o que" foi alterado?
O comando git diff --cached compara o estado do repositório salvo na staging area com o estado do último commit
git diff --cached
git log
git log --oneline
git log -p
git log --graph
O comando git log exibe o histórico de commits do projeto
A partir do código associado aos commits você pode voltar para um determinado 'estado' do projeto
git checkout id_commit
O comando git checkout também redireciona arquivos e branches
git checkout arquivo
git checkout .
Você pode descartar mudanças no seu working directory voltando o estado dos seus arquivos para o último salvo na staging area.
git reset HEAD arquivo
git reset HEAD .
O comando git reset HEAD devolve as modificações da staging area para o working directory.
1ª Solução: git reset
O comando git reset faz o projeto/arquivo voltar para um estado anterior.
git reset id_commit
git reset arquivo
git reset --hard id_commit
Reflete essa mudança para staging area e work directory
2ª Solução: git reset
O comando git revert não desfaz um commit, mas cria outro removendo a alteração anterior
git revert id_commit
O comando git rm remove um arquivo do seu projeto.
git rm arquivo
git rm --cached arquivo
A opção --cached remove o arquivo apenas do Git, sem esta opção o comando remove o arquivo do seu computador também.
Deixar todos os arquivos contidos na pasta do projeto sob controle do Git pode acabar dificultando o gerenciamento, e muitas vezes simplesmente não achamos necessário rastrear alterações de alguns arquivos (arquivos temporários, executáveis e etc...).
O arquivo oculto .gitignore é o responsável por dizer ao Git quais arquivos ele pode ignorar.
Basta adicionar uma pattern que o Git usará para ignorar os arquivos.
Todos os arquivos que 'casarem' com as patterns serão ignorados.
As patterns seguem o padrão utilizado nos sistemas unix/Linux.
#comentario
* qualquer caractere
! negação
/** subdiretório
Exemplos de patterns e extensões podem ser geradas em gitignore.io
O Git permite criar uma linha independente de desenvolvimento no seu projeto. Isto permite alterações em partes especificas do software sem comprometer o restante do projeto.
O comando git branch cria um novo branch a partir do último commit.
git branch nome_branch
Além de visualizar commits antigos, o git checkout também é o responsável por alterar o branch corrente.
git checkout nome_branch
Após desenvolvedor uma funcionalidade separada do fluxo principal, muitas vezes é interessante incorporar as modificações no branch master.
O comando git merge uni dois branches novamente, combinando as funcionalidades do branch independente com o branch atual.
git merge nome_branch
Quando não há commits posteriores à criação do branch, a incorporação das funcionalidades ocorre sem nenhum problema.
Porém, quando os branches divergem, o Git precisa que combinar seus conteúdos.
Para informar o trecho conflitante, o Git sinaliza as linhas do arquivo com algumas marcações(<<<<<<<, ======= e >>>>>>>), para corrigir o conflito e confirmar o merge, basta apagar as linhas desnecessárias do arquivo, mantendo conteúdo escolhido, e efetuar um novo commit. Este é basicamente o único trabalho manual que o Git necessita
Após incorporar um branch à outro, pode não ser mais necessário manter uma ramificação. Para deletar um branch utiliza-se do parâmetro -d juntamente com o comando git branch
git branch -d nome_branch
Tempo de vida infinito
máster (origin/master)
develop (origin/develop)
As branches de suporte comumente usadas são
Release branches dão suporte à preparação de uma nova liberação(release) de produção.
Utlizadas para pequenas correções de bugs e preparar metadados para uma versão (número da versão, datas de criação, etc.)
Muitas empresas possuem servidores dedicados para suas equipes, mas há algumas soluções no mercados que cumprem a mesma função.
O comando git remote add é o responsável por referenciar um repositório remoto em um repositório local já existente
O comando git remote rm é utilizado para apagar uma referência à um repositório remoto. Util quando se deseja substituir o local onde o remoto está hospedado.
git remote add origin URL
git remote rm origin
Quando se deseja iniciar/continuar um projeto já existente, utiliza-se dogit clone para copiar todo um repositório remoto para uma máquina local.
git clone URL
O Git disponibiliza duas maneiras de baixar as atualizações de um repositório remoto. O comando git fetch baixa as atualizações mas não as incorpora ao repositório local.
git fetch
git fetch origin master
git fetch origin nome_branch
Outra maneira é utilizando o comando git pull, que baixa e incorpora as modificações no repositório local. Equivale à um git fetch seguido de uma git merge.
git pull
git pull origin master
git pull origin nome_branch
Versão
=
Revisão
Release
Pode se tornar uma
Um release de sistema é uma versão de um sistema de software distribuída aos clientes. (Sommerville, 2011).
Dado um número de versão MAJOR.MINOR.PATCH, incremente a:
- versão Maior(MAJOR): quando fizer mudanças incompatíveis na API,
- versão Menor(MINOR): quando adicionar funcionalidades mantendo compatibilidade, e
- versão de Correção(PATCH): quando corrigir falhas mantendo compatibilidade.
Rótulos adicionais para pré-lançamento(pre-release) e metadados de construção(build) estão disponíveis como extensão ao formato MAJOR.MINOR.PATCH.
Conforme incluímos funcionalidades no sistema, podemos definir pontos relevantes no software, que geralmente, marcam uma versão de lançamento.
O comando git tag inclui um rótulo à um determinado commit para que este possa ser referenciado mais facilmente.
git tag -a versao -m "descrição"
Para visualizar as versões ja criadas, utilize git tag.
git tag
Por padrão, o comando git push não transfere tags
Você deve enviar as tags explicitamente – você executa git push origin [nome-tag].
git push origin v1.5
se deseja enviar muitas tags ao mesmo tempo digite:
git push origin --tags
CHACON, Scott; STRAUB, Ben. Pro git. Apress, 2014.
DIAS, A. F. Conceitos Básicos de Controle de Versão de Software-Centralizado e Distribuído. 2011. 2013.
KREEFTMEIJER, Jeff. Using git-flow to automate your git branching workflow. 2015.
PRESTON-WERNER, Tom. Semantic Versioning 2.0.0. URL: https://semver. org, 2013.
SOMMERVILLE, Ian. Software engineering 9th Edition. ISBN-10137035152, 2011.