Apostila Git
Apostila Git
Apostila Git
Alcides
ngela
Daniel
Eduardo
Apostila
Gabriel Git
Jhenifer
Paula
Walmes
No a vontade de vencer que ganha o jogo, e
sim a vontade de se preparar para venc-lo.
2 Instalao e Configurao 11
2.1 Instalao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
2.1.1 Windows . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
2.1.2 Linux . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
2.1.3 MacOS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
2.2 Configurando Perfil . . . . . . . . . . . . . . . . . . . . . . . . . . 17
2.2.1 Usurio . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
2.2.2 Atalhos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
2.2.3 Ignorar Arquivos . . . . . . . . . . . . . . . . . . . . . . . 20
3 Repositrios Locais 21
3.1 Instrues do Git . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
3.2 Meu Primeiro Repositrio . . . . . . . . . . . . . . . . . . . . . . 24
3.3 Complementos . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
3.4 Verses de Arquivos Diferentes . . . . . . . . . . . . . . . . . . . 28
3.5 Trabalhando com Ramos . . . . . . . . . . . . . . . . . . . . . . . 37
3.6 Resolvendo conflitos . . . . . . . . . . . . . . . . . . . . . . . . . 48
4 Projetos Remotos 55
4.1 Repositrio remoto pessoal . . . . . . . . . . . . . . . . . . . . . 55
4.2 Repositrio remoto coletivo . . . . . . . . . . . . . . . . . . . . . 58
4.3 Fluxo de trabalho com repositrio remoto, do clone ao push . . 59
4.3.1 Git clone . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59
4.3.2 Git Push . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59
4.3.3 Git Pull . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60
4.3.4 Git fetch . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60
4.4 Listar branches locais/remotos . . . . . . . . . . . . . . . . . . . 60
4.5 Adicionar, renomear, deletar remote . . . . . . . . . . . . . . . . . 61
4.5.1 Adicionando repositrios remotos . . . . . . . . . . . . . . 61
4.5.2 Obtendo informaes de um Remoto . . . . . . . . . . . . 61
4.5.3 Renomeado Remotos . . . . . . . . . . . . . . . . . . . . . . 61
4.5.4 Removendo Remotos . . . . . . . . . . . . . . . . . . . . . . 61
4.5.5 Deletar ramos no servidor . . . . . . . . . . . . . . . . . . 62
4.5.6 Clonar apenas um branch, commit ou tag. . . . . . . . . . 62
4.6 Criando um Repositrio Git . . . . . . . . . . . . . . . . . . . . . 62
4.7 Git no servidor . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63
4.8 Configurao de Conexo SSH com Servidor . . . . . . . . . . . 63
5
6 SUMRIO
6 Ferramentas grficas 95
6.1 Interfaces Git . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 96
6.1.1 git-gui . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 96
6.1.2 gitk . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 98
6.1.3 Outras Interfaces . . . . . . . . . . . . . . . . . . . . . . . 100
6.2 Interfaces de comparao . . . . . . . . . . . . . . . . . . . . . . 106
Apndice 122
B.0.14 Rm . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 136
B.0.15 Mv . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 137
B.0.16 Push . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 137
B.0.17 Fetch . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 137
B.0.18 Pull . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 137
B.0.19 HEAD . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 138
B.0.20 Tag . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 138
B.0.21 Stash . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 138
B.0.22 Reset . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 139
B.0.23 Rebase . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 139
B.0.24 Blame . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 139
B.0.25 Bisect . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 139
8 SUMRIO
Captulo 1
Sistemas de controle de
verso
9
10 CAPTULO 1. SISTEMAS DE CONTROLE DE VERSO
Instalao e Configurao
2.1 Instalao
2.1.1 Windows
11
12 CAPTULO 2. INSTALAO E CONFIGURAO
2.1.2 Linux
Arch
2.2. CONFIGURANDO PERFIL 17
Fedora
2.1.3 MacOS
Existem duas maneiras de instalar o Git no Mac, uma pelo instalador e outra
atravs do MacPorts.
Utiizando o Instalador
O usurio dever acessar Download for Mac3 , clicar em Download e baixar
o arquivo .dmg.
Aps o download, necessrio clicar duas vezes para ter acesso ao pacote de
instalao. Dentro do arquivo .dmg, execute o arquivo .pkg para iniciar a
instalao. Siga os passos at concluir a instalao. recomendvel utilizar a
instalao padro.
Para testar a instalao, abra o terminal e digite o comando git. A sada
dever ser similar a figura 2.9:
Utiizando o MacPorts
A maneira mais fcil de instalar Git no Mac via MacPorts4 , para isso basta
executar o seguinte comando:
2.2.1 Usurio
A opo --global usar essa informao para todo projeto Git da mquina.
possvel fazer definies para cada projeto, ou seja, no globais. Para isso
necessrio executar o comando a seguir sem a opo --global.
2.2.2 Atalhos
Pelo terminal:
Execute o comando abaixo com o atalho de sua preferncia e o nome completo
do comando o qual deseja criar o alias.
[alias]
st = status
ci = commit
br = branch
co = checkout
df = diff
Assim que adicionar este bloco com os comandos de sua escolha, ele ir
funcionar imediatamente.
Segue abaixo os caminhos para encontrar o arquivo /.gitconfig nos sistemas
operacionais:
Windows:
1. C:\\Pasta_do_seu_projeto\\.git\\config
2. C:\\Documents and Settings\\Seu_usuario\\.gitconfig
3. C:\\Arquivos de programas\\Git\\etc\\gitconfig
Mac:
1. /Pasta_do_seu_projeto/.git/config
2. /Users/Seu_usuario/.gitconfig
3. /usr/local/git/etc/gitconfig
Linux:
1. Crie um arquivo como sudo dentro da pasta etc/ com nome de
gitconfig e coloque os atalhos de sua escolha.
$ cat .gitignore
*.[oa]
*~
A partir disso, todos os arquivos que esto na lista sero ignorados pelo
usurio.
Finalmente com a instalao, configurao essencial (usurio e e-mail) e configu-
raes adicionais concludas, podemos comear a utilizar o Git para versionar
nossos projetos.
Captulo 3
Repositrios Locais
Neste captulo, as instrues sero todas feitas no terminal mesmo que existam
alternativas grficas para as mesmas. Isso enfatiza no que est sendo feito alm
do fato de que no terminal todos devem ter os mesmos recursos e os comandos
iro produzir os mesmos resultados, o que faz esse tutorial algo reproduzvel.
Casos voc queira usufruir das ferramentas grficas v para o captulo 6.
Sabendo que voc executou os comandos de perfil que no captulo anterior,
temos o Git devidamente configurado, com credenciais (nome e e-mail) e
configuraes aplicadas. Vamos ento ver como o sistema de controle de
verso acontece.
Todas as instrues do Git so sinalizadas por comear com git seguido da ins-
truo/comando e seus argumentos complementares, se existirem/necessrios.
Os comandos abaixo revelam tudo o Git possui, embora dizer o que ele tem
no signifique nada diante do que ele pode fazer com o que tem.
21
22 CAPTULO 3. REPOSITRIOS LOCAIS
add merge-octopus
add--interactive merge-one-file
am merge-ours
annotate merge-recursive
apply merge-resolve
archive merge-subtree
bisect merge-tree
bisect--helper mergetool
blame mktag
branch mktree
bundle mv
cat-file name-rev
check-attr notes
check-ignore pack-objects
check-mailmap pack-redundant
check-ref-format pack-refs
checkout patch-id
checkout-index prune
cherry prune-packed
cherry-pick pull
citool push
clean quiltimport
clone read-tree
column rebase
commit receive-pack
commit-tree reflog
config relink
count-objects remote
credential remote-ext
credential-cache remote-fd
credential-cache--daemon remote-ftp
credential-store remote-ftps
daemon remote-http
describe remote-https
diff remote-testsvn
diff-files repack
diff-index replace
diff-tree request-pull
3.1. INSTRUES DO GIT 23
difftool rerere
difftool--helper reset
fast-export rev-list
fast-import rev-parse
fetch revert
fetch-pack rm
filter-branch send-pack
fmt-merge-msg sh-i18n--envsubst
for-each-ref shell
format-patch shortlog
fsck show
fsck-objects show-branch
gc show-index
get-tar-commit-id show-ref
grep stage
gui stash
gui--askpass status
hash-object stripspace
help submodule
http-backend subtree
http-fetch symbolic-ref
http-push tag
imap-send unpack-file
index-pack unpack-objects
init update-index
init-db update-ref
instaweb update-server-info
interpret-trailers upload-archive
log upload-pack
ls-files var
ls-remote verify-commit
ls-tree verify-pack
mailinfo verify-tag
mailsplit web--browse
merge whatchanged
merge-base worktree
merge-file write-tree
merge-index
cola dag
'git help -a' and 'git help -g' list available subcommands and some
concept guides. See 'git help <command>' or 'git help <concept>'
to read about a specific subcommand or concept.
24 CAPTULO 3. REPOSITRIOS LOCAIS
git init
.
`-- .git
|-- branches
|-- config
|-- description
|-- HEAD
|-- hooks
| |-- applypatch-msg.sample
| |-- commit-msg.sample
| |-- post-update.sample
| |-- pre-applypatch.sample
| |-- pre-commit.sample
| |-- prepare-commit-msg.sample
| |-- pre-push.sample
| |-- pre-rebase.sample
| `-- update.sample
|-- info
| `-- exclude
|-- objects
| |-- info
| `-- pack
`-- refs
|-- heads
`-- tags
10 directories, 13 files
NOTA: o tree um programa instalado a parte (third party software) que re-
torna arte ASCII representado a estrutura de diretrios. Se voc usa distribuio
Debian, instale com sudo apt-get install tree. Windows: tree.
3.2. MEU PRIMEIRO REPOSITRIO 25
Vamos comear da maneira mais simples: criando um arquivo com uma linha
de texto apenas. Bem, vale avisar que ao longo desse captulo, os arquivos
sero sempre bem pequenos e dificilmente realistas, mas como o enfoque est
no funcionamento, no haver prejuzo.
Vamos criar o arquivo com contedo tambm pelo terminal. Se voc preferir,
abra eu editor de texto favorito (Emacs, Gedit, Geany, RStudio, Bloco de Notas,
Notepad++, etc) e faa algo mais criativo.
On branch master
Initial commit
Untracked files:
(use "git add <file>..." to include in what will be committed)
README.txt
nothing added to commit but untracked files present (use "git add" to track)
E o que o Git acha de tudo isso? O comando status o mais usado do Git,
principalmente nas etapas de aprendizado. Uma caracterstica diferente do Git,
se comparado a outras aplicaes de uso por terminal, que ele realmente
camarada. Nas mensagens de output, o Git informa o que aconteceu e tambm
sugere o que fazer.
Este diretrio agora um diretrio sob versionamento Git, portanto todas as
alteraes realizadas sero observadas pelo sistema. Ao criarmos o arquivo e
pedirmos a situao (status), o Git indica que existe um arquivo no rastreado
(untracked) no diretrio. Inclusive sugere uma ao que seria adicionar o aquivo
(add). Se o seu sistema operacional est em portugus, parte dos outputs do
Git podem estar traduzidos.
De forma geral temos 3 estgios 3.1 de arquivos considerados no sistema
de controle de versionamento Git. So eles working directory, Staged Area e
Committed, os discutiremos ao logo do texto. Todo arquivo criado em um
diretrio versionado deve necessariamente passar pelos trs estgios. Voltando
para a nossa situao temos o arquivo README.txt criado e atualmente ele est
no estgio working directory, faremos todo o procedimento para que chegue ao
estgio committed.
Alteraes em arquivos no working directory no so armazenadas, por isso
o sugestivo nome diretrio de trabalho. Portanto, para que o arquivo seja
26 CAPTULO 3. REPOSITRIOS LOCAIS
On branch master
Initial commit
Changes to be committed:
(use "git rm --cached <file>..." to unstage)
O arquivo README.txt j visto pelo Git como um arquivo com o qual ele
deve se preocupar, pois est sob versionamento. Vamos agora fazer um
registro definitivo sobre o estado desse arquivo (commit). de fundamental
importncia que a mensagem de notificao, ou mensagem de commit, reflita
as modificaes feitas. So as mensagens que sero consultadas quando voc
precisar desfazer/voltar. Ela deve ser curta (<= 72 caracteres) e ao mesmo
tempo informativa. A minha primeira mensagem no ser, todavia.
Boas Prticas de commit:
Verbo no indicativo
Frases curtas
"Modificaes realizadas"
## Registro de verso.
git commit -m 'Cria arquivo com ttulo'
3.3 Complementos
# Criando a tag
git tag versao2
# Excluir tags
git tag -d versao1
Caso haja mudana no nome do arquivo que voc esteja versionado, deve ser
alterado pelo prprio Git, para que fique no atual estgio de versionamento.
git rm README.txt
* livre
* seguro
* customizavel" > porqueLinux.txt
* livre
* seguro
* customizavel
git status
On branch master
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
modified: README.txt
Untracked files:
(use "git add <file>..." to include in what will be committed)
porqueLinux.txt
no changes added to commit (use "git add" and/or "git commit -a")
O Git retornou dois campos. No primeiro ele diz que existem mudanas no
README.txt no encaminhadas para receber registro (not staged for commit) e
no segundo ele aponta que o porqueLinux.txt um arquivo no rastreado
(fora de monitoramento).
Vamos explorar um pouco mais os recursos do Git antes de adicionar as
recentes mudanas. At o momento, temos apenas um commit feito. Para
acessar o histrico de registros usamos git log. O histrico mostra o sha1, o
autor, data e mensagem de commit. Uma sada mais enxuta obtida com git
log --oneline, til quando o histrico longo. possvel fazer restrio no
git log, como mostrar os commits a partir de certa data, certo intervalo de
datas, para um nico autor ou nico arquivo.
commit 612c338a6480db837dcef86df149e06c90ed6ded
Author: Walmes Zeviani <walmes@ufpr.br>
30 CAPTULO 3. REPOSITRIOS LOCAIS
Vamos aplicar o primeiro add ao porqueLinux.txt para que ele comece a ser
versionado. Perceba que ao adicion-lo, as mudanas, no caso a criao do
arquivo com contedo, j so separadas para receber registro (changes to be
commited).
On branch master
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
modified: README.txt
git status
On branch master
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
modified: README.txt
no changes added to commit (use "git add" and/or "git commit -a")
Ainda resta o REAMDE.txt para receber registro. Voc no precisa fazer agora.
Pode continuar editando caso no tenha atingido uma quantidade de modi-
ficao merecedora de commit. Lembre-se que registros geram contedo no
diretrio .git. Quanto mais commits, mais contedo gerado. Mas tambm,
toda vez que voc faz um commit, voc define um ponto de retorno, um estado
salvo, caso precise no futuro recuperar/visitar. O que uma unidade de
modificao comitvel voc ir definir aos poucos com a prtica.
On branch master
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
modified: README.txt
Por meio dos sha1, podemos aplicar o diff para visitarmos as modificaes
entre dois commits, no necessariamente consecutivos, por exemplo. Tambm
podemos retroceder (checkout, reset, revert) o projeto para alguns desses pontos.
+* seguro
+* customizavel
README.txt
porqueLinux.txt
On branch master
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
modified: porqueLinux.txt
no changes added to commit (use "git add" and/or "git commit -a")
O Git sugere voc aplicar add para preparar para commit. Caso as modificaes
sejam um engano e no mais desejadas, voc pode desfaz-las, abandonar a
correo/incluso das palavras usando checkout. Vamos aplic-lo para ver
como funciona.
* livre
* seguro
* customizvel
* Tem repositrios de software
* Atualizao constante
* Desempenho
less porqueLinux.txt
* livre
* seguro
* customizavel
On branch master
nothing to commit, working directory clean
git status
On branch master
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
modified: porqueLinux.txt
no changes added to commit (use "git add" and/or "git commit -a")
HEAD@{n}
HEADn
HEAD~n
3.4. VERSES DE ARQUIVOS DIFERENTES 35
* livre
* seguro
-* customizavel
+* customizvel
+* Tem repositrios de software
+* Atualizao constante
+* Desempenho
Para ficar claro daqui em diante, voc pode ao invs de pedir log, pedir o
reflog que inclu as referncias em termos da sequncia do mais recente para
os seus ancestrais.
## Adiciona e commita.
git add porqueLinux.txt
git commit -m "Novos argumentos."
O Git permite um nvel de rastreabilidade bem fino. Veja por exemplo que
possvel saber quem modificou e quando cada linha do arquivo e qual o
correspondente sha1 do commit.
3.5. TRABALHANDO COM RAMOS 37
^612c338 (Walmes Zeviani 2015-12-17 09:29:02 -0200 1) Meu primeiro repositrio Git
1aa33c31 (Walmes Zeviani 2015-12-17 09:29:02 -0200 2)
1aa33c31 (Walmes Zeviani 2015-12-17 09:29:02 -0200 3) A filosofia do Linux 'Ria na face do perig
1aa33c31 (Walmes Zeviani 2015-12-17 09:29:02 -0200 4) pa. Errado. 'Faa voc mesmo'. , essa.
1aa33c31 (Walmes Zeviani 2015-12-17 09:29:02 -0200 5) -- Lunus Torvald
Existem vrias formas de se trabalham com ramos veja a figura 3.2. Geralmente
os ramos so feitos sob demandas para adicionar uma caracterstica ao projeto
(feature) ou corrigir um bug. Alguns ramos, por outro lado, so ramos fixos
destinados a receber o desenvolvimento dos ramos de demanda. Esses ramos
so geralmente chamados de devel (development) e release. O ramo master o
default e em geral, para projetos grandes, o master s recebe verses funcionais
do projeito, livre de bugs.
Para criar um ramo, usamos git branch seguido do nome que se deseja.
Vamos criar um ramo para adicionar mais arquivos ou modificaes ao projeto.
* master
feature01
* master
On branch feature01
nothing to commit, working directory clean
## Histrico de commits.
git log --oneline
Veja que o novo ramo no comea no zero ou vazio (sem arquivos) e sim a partir
do ramo que seu ancestral, ou seja, ele comea a partir do ltimo commit
existente, por padro. Vamos adicionar um arquivo e commitar. O comando
wget permite baixar arquivos pelo terminal. Ser baixado um arquivo com
um funo para calcular o fator de inflao de varincia (vif, variance inflation
factor) usado em modelos de regresso, disponvel na pgina da Professora
Suely Giolo1 .
0K 100% 44,0M=0s
On branch feature01
Untracked files:
(use "git add <file>..." to include in what will be committed)
vif.R
nothing added to commit but untracked files present (use "git add" to track)
## Estrutura do diretrio.
tree --charset=ascii
.
|-- porqueLinux.txt
|-- README.txt
`-- vif.R
0 directories, 3 files
## Histrico de commits.
git reflog
git status
On branch feature01
nothing to commit, working directory clean
## Estrutura do diretrio.
tree --charset=ascii
.
|-- porqueLinux.txt
`-- README.txt
0 directories, 2 files
vif.R
Updating 095046c..826f940
Fast-forward
vif.R | 20 ++++++++++++++++++++
1 file changed, 20 insertions(+)
create mode 100644 vif.R
You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by performing another checkout.
If you want to create a new branch to retain commits you create, you may
do so (now or later) by using -b with the checkout command again. Example:
## Qual a situao.
git status
J que o commit mais recente dessa histria aponta para o arquivo compras,
vamos checar o seu contedo apenas por medida de segurana.
* livre
* seguro
* customizvel
* Tem repositrios de software
* Atualizao constante
* Desempenho
Dito e feito! Voltamos no tempo para o instante logo aps o commit que
inclu novos itens na lista. Podemos voltar para o presente se estivermos
3.5. TRABALHANDO COM RAMOS 43
satisfeitos com o passeio mas tambm podemos criar um ramo aqui, caso isso
seja necessrio. Primeiro vamos voltar para o presente depois mostramos como
criar o ramo.
git status
On branch master
nothing to commit, working directory clean
feature01
* master
You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by performing another checkout.
If you want to create a new branch to retain commits you create, you may
do so (now or later) by using -b with the checkout command again. Example:
0K 100% 68,9M=0s
git status
Untracked files:
(use "git add <file>..." to include in what will be committed)
pimentel_racoes.txt
nothing added to commit but untracked files present (use "git add" to track)
git status
git branch
git branch
feature01
* feature02
master
Diretrio existe.
Arquivo brasilCopa2014.txt j existe.
brasilCopa2014.txt -> ../meu1repo/brasilCopa2014.txt
wget 'http://www.leg.ufpr.br/~walmes/cursoR/geneticaEsalq/brasilCopa2014.txt'
0K . 100% 69,6M=0s
* 3044d9b (HEAD -> feature01) Arquivo sobre copa 2014 celeo brasileira.
* 826f940 (master) Adiciona funo R para VIF.
| * f26d9b4 (feature02) Adiciona aquivo de dados de experimento com raes.
|/
* 095046c Novos argumentos.
* 1aa33c3 Adiciona frase do Linux Torvalds.
* 8acac99 Lista de inicial de o porqu usar o Linux.
* 612c338 Cria arquivo com ttulo
## Mescla o feature01.
git merge feature01 master
Updating 826f940..3044d9b
Fast-forward
brasilCopa2014.txt | 22 ++++++++++++++++++++++
1 file changed, 22 insertions(+)
create mode 100644 brasilCopa2014.txt
## Mescla o feature02.
git merge feature02 master
tree --charset=ascii
.
|-- brasilCopa2014.txt
|-- pimentel_racoes.txt
|-- porqueLinux.txt
|-- README.txt
`-- vif.R
0 directories, 5 files
## Remove ramos.
git branch -d feature01
git branch -d feature02
git branch
Agora vou criar um novo ramo, adicionar um arquivo e encurtar o nome das
colunas no cabealho.
## Baixa o arquivo.
wget 'http://www.leg.ufpr.br/~walmes/data/bib1.txt'
0K 100% 35,0M=0s
## Baixa o arquivo.
wget 'http://www.leg.ufpr.br/~walmes/data/bib1.txt'
Auto-merging bib1.txt
CONFLICT (add/add): Merge conflict in bib1.txt
Automatic merge failed; fix conflicts and then commit the result.
git status
On branch master
You have unmerged paths.
(fix conflicts and run "git commit")
Unmerged paths:
(use "git add <file>..." to mark resolution)
no changes added to commit (use "git add" and/or "git commit -a")
52 CAPTULO 3. REPOSITRIOS LOCAIS
<<<<<<< HEAD
REPT VARI BLOC Y
=======
rept vari bloc y
>>>>>>> feature03
1 1 1 20
1 2 1 18
1 3 2 15
1 4 2 16
1 5 3 14
Ento deu conflito e o Git informa que ele deve ser resolvido. Resolver o
conflito aqui significa abrir os arquivos com problema listados no Git status
e editar de tal forma a desconflitar. Nas regies de conflito o Git sinaliza
de forma especial, indicando por divisrias (<<<<<<<, ======= e >>>>>>>) as
verses no HEAD (ramo master) e no ramos a ser incorporado (feature03). Ento
vamos resolver o conflito sem favorecer ningum, ou seja, vamos encurtar para
4 dgitos e manter caixa alta. Dessa forma o aquivo fica assim.
git status
On branch master
You have unmerged paths.
(fix conflicts and run "git commit")
Unmerged paths:
(use "git add <file>..." to mark resolution)
no changes added to commit (use "git add" and/or "git commit -a")
3.6. RESOLVENDO CONFLITOS 53
git status
On branch master
nothing to commit, working directory clean
* 9536074 (HEAD -> master) Resolve conflito, trunca com caixa alta.
|\
| * d8bab6c (feature03) Arquivo de experimento em BIB. Trunca cabealho 4 digitos.
* | 50dc261 Arquivo de experimento em BIB. Cabealho em caixa alta.
|/
* 039b7b6 Merge branch 'feature02'
|\
| * f26d9b4 Adiciona aquivo de dados de experimento com raes.
* | 3044d9b Arquivo sobre copa 2014 celeo brasileira.
* | 826f940 Adiciona funo R para VIF.
|/
* 095046c Novos argumentos.
* 1aa33c3 Adiciona frase do Linux Torvalds.
* 8acac99 Lista de inicial de o porqu usar o Linux.
* 612c338 Cria arquivo com ttulo
git reflog
9536074 HEAD@{0}: commit (merge): Resolve conflito, trunca com caixa alta.
50dc261 HEAD@{1}: commit: Arquivo de experimento em BIB. Cabealho em caixa alta.
039b7b6 HEAD@{2}: checkout: moving from feature03 to master
d8bab6c HEAD@{3}: commit: Arquivo de experimento em BIB. Trunca cabealho 4 digitos.
039b7b6 HEAD@{4}: checkout: moving from master to feature03
039b7b6 HEAD@{5}: merge feature02: Merge made by the 'recursive' strategy.
3044d9b HEAD@{6}: merge feature01: Fast-forward
826f940 HEAD@{7}: checkout: moving from feature01 to master
3044d9b HEAD@{8}: commit: Arquivo sobre copa 2014 celeo brasileira.
826f940 HEAD@{9}: checkout: moving from feature02 to feature01
f26d9b4 HEAD@{10}: checkout: moving from f26d9b4eaf6e2050d137009ab67310f8ecb4a5b1 to feature02
f26d9b4 HEAD@{11}: commit: Adiciona aquivo de dados de experimento com raes.
095046c HEAD@{12}: checkout: moving from master to HEAD@{6}
826f940 HEAD@{13}: checkout: moving from 095046c3927fe5fa9932d9d3d858e3128126b4fc to master
095046c HEAD@{14}: checkout: moving from master to HEAD@{4}
826f940 HEAD@{15}: merge feature01: Fast-forward
54 CAPTULO 3. REPOSITRIOS LOCAIS
Projetos Remotos
Nos captulos anteriores descrevemos como instalar o Git e ter projetos versio-
nados. No entanto, o uso do Git at ento foi apenas local. Os arquivos eram
mantidos na sua mquina de trabalho e disponveis s para voc.
Os recursos do Git, como o desenvolvimento em branches, permite que vrios
segmentos sejam conduzidos de forma independente e no futuro, quando
apropriado, reunidos em um nico branch. Isso exatamente o que precisamos
para trabalhar em equipe, certo? Se cada colaborador pudesse ter um ramo
separado do projeto para trabalhar, todos poderiam trabalhar simultaneamente.
Quando oportuno, bastaria fazer merges para reunir o trabalho. A questo :
como deixar o projeto disponvel para os colaboradores?
A resposta simples: mantenha o projeto em um servidor onde os colabora-
dores tenham acesso. Isso inclusive vai permitir que voc acesse o projeto de
vrias outras mquinas, como o notebook de casa e o desktop do escritrio.
55
56 CAPTULO 4. PROJETOS REMOTOS
cd ~/meusProjetos/meu1repo
Apenas isso precisa ser feito no servidor. Voc no cria nenhum arquivo
pelo servidor. Inclusive, muitos dos comandos Git, como git status no
funcionam para repositrio iniciados com a opo git --bare init.
Caso queira, voc tambm pode usar git init. A diferena entre eles s
onde ficam os arquivos do versionamento. Com git init, um diretrio oculto
.git/ o repositrio Git e os arquivos de trabalho, como o README.md, ficam
ao lado dele na estrutura de diretrio. Com git --bare init o contedo
do repositrio Git fica na raiz. Essa ltima opo justamente para criar
repositrios remotos que vo justamente manter a parte repositrio e no os
arquivos.
Uma vez iniciado o repositrio no servidor, todo trabalho passa ser local. a
vez de adicionar o endereo do diretrio no servidor e transferir arquivos.
Esse endereo pode ter IP, porque na realidade, todo servidor tem um IP. Por
exemplo, o servidor do github.com tem o IP 192.30.252.129. Para saber o IP
s dar um ping no endereo.
ping github.com
ping gitlab.com
ping google.com
ping cran.r-project.org
4.1. REPOSITRIO REMOTO PESSOAL 57
Nesse processo, toda transferncia de arquivos vai pedir senha do seu usurio
no servidor. Para facilitar, pode-se trabalhar com chaves pblicas.
O arquivo id_rsa.pub a sua chave pblica. O id_rsa o seu par. RSA o
tipo de encriptao. O nome e caminho do arquivo e a encriptao podem ser
outros, depende do que voc escolher ao gerar o par de chaves. Normalmente
usa-se RSA e as chaves so criadas no diretrio ~/.ssh.
## Logar no servidor
ssh eu@111.22.333.44
1O Flash foi o primeiro a transferir as chaves para o servidor porque ele mais rpido
58 CAPTULO 4. PROJETOS REMOTOS
## Logar na servidora.
ssh eu@servidor
Exemplo:
Exemplo:
Exemplo:
Assim como o comando Git pull, o Git fetch transfere arquivos do reposit-
rio remoto para o local, porm ele no realiza automaticamente o merge dos
arquivos transferidos, o usurio deve fazer o merge manualmente.
Exemplo:
O comando git remote usado para verificar quais repositrios esto configu-
rados.
Exemplo: para retornar a lista de repositrios:
git remote
git remote -v
4.5. ADICIONAR, RENOMEAR, DELETAR REMOTE 61
Para remover remotos utilizado o comando git remote rm, agora ser remo-
vido o repositrio renomeado anteriormente RenameRepo.
Exemplo:
62 CAPTULO 4. PROJETOS REMOTOS
Exemplo:
## Para um commit:
git -e: //git.myproject.org/MyProject.git@da39a3ee5e6b4b0d3255bfef95601890afd80709#egg=M
Agora o repositrio pode ser clonado por outros usurios, que podem ter
acesso de escrita e de envio de arquivos push no diretrio.
A partir deste comando, ser possvel alterar o diretrio onde ser salva a
chave SSH. O usurio tem a opo de permanecer com o diretrio padro,
para isso basta apertar Enter. A partir disso, so criados dois arquivos no
diretrio, o id_rsa e o id_rsa.pub. Aps escolher o diretrio onde sero
64 CAPTULO 4. PROJETOS REMOTOS
salvos os arquivos, voc ter a opo de digitar uma senha ou deixar o espao
em branco.
Para visualizar a chave basta digitar o seguinte comando:
Exemplo:
cat ~/.ssh/id_rsa.pub
ssh -T git@gitlab.c3sl.ufpr.br
Configurando o servidor
Agora ser abordado como configurar o acesso SSH do ponto de vista do
servidor. Voc precisa criar um usurio Git e um diretrio .ssh para este
usurio.
Exemplo: criar usurio e diretrio.
cd/dir/git
mkdir NovoProjeto.git
cd NovoProjeto.git
git -bare init
O Git tem vrios servios web voltados para ter um local que centralize o
projeto bem como oferea recursos administrativos e colaborativos. Esses
servios possuem contas free, alguns planos pagos e diversos recursos para
todo tipo de projeto e equipe.
67
68 CAPTULO 5. SERVIOS WEB PARA PROJETOS GIT
5.1.1 GitHub
O GitHub no hospeda apenas cdigo fonte mas sim todo e qualquer arquivo
que voc tenha sob versionamento. possvel hospedar dados, por exemplo,
em formato texto (csv, txt), e disponibiliz-los por meio da URL para download
ou leitura direta. Para usurios de R, essa uma caracterstica que permite no
apenas disponibilizar dados, mas tambm colees de funes que podem ser
carregadas com um source().
2 http://techcrunch.com/2012/07/14/what-exactly-is-github-anyway/
70 CAPTULO 5. SERVIOS WEB PARA PROJETOS GIT
Com o plano free do GitHub, voc pode ter inmeros repositrios pblicos,
inmeros colaboradores, ter o fork de quantos repositrios quiser e participar
de quantas organizaes precisar. Para ter repositrios privados, o plano
mais bsico custa U$ 7 por ms e d direito 5 repositrios. Existem outros
planos individuais, e tambm planos organizacionais, para todos os tamanhos
de projeto e equipe. Alm dessas opes, pode-se ter o GitHub em um
servidor prprio, o GitHub Interprise3 , com recursos e vantagens alm das j
mencionadas
Para muitos programadores, o GitHub uma fonte de conhecimento. L voc
encontra scripts de todas as linguagens de programao. Voc pode livremente
estudar o cdigo dos repositrios, ver como o cdigo evoluiu commit aps
commit e acompanhar como um bug foi resolvido.
Qualquer pessoa, mesmo sem perfil no GitHub, pode clonar um repositrio
pblico. O GitHub reconhece 382 linguagens que compreendem as de pro-
gramao (293: C++, Python, R, JavaScript), as de markup (34: HTML, TeX,
MarkDown), as de dados (40: JSON, SQL, XML, csv) e aplica os realces de
cdigo (highlights) que facilitam a sua compreenso.
O GitHub o servio web para Git mais popular quanto ao nmero de projetos
hospedados. No entanto, existem servios com as mesmas funcionalidades
e at com algumas que o GitHub no oferece no plano bsico. O GitLab e o
Bitbucket esto entre os 5 mais populares e permitem, por exemplo, ter alguns
repositrios privados com a conta free.
Como hospedamos nossos projetos coletivos do PET-Estatstica no GitLab do
C3SL4 , no podemos deixar de falar sobre ele.
5.1.2 GitLab
A verso paga do GitLab, Enterprise Edition (EE), tem um preo menor que a
equivalente do GitHub.
A verso gratuita do GitLab para servidores, a Community Edition (CE), pode ser
instalada em servidores Linux, Windows, mquinas virtuais e servidores na nu-
vem, alm de outras opes. Os endereos https://gitlab.c3sl.ufpr.br/explore
e http://git.leg.ufpr.br/explore so o GitLab CE para servidores rodando no
C3SL (Centro de Computao Cientfica e Software Livre) e LEG (Laboratrio
de Estatstica e Geoinformao). Estes GitLabs do suporte colaborao em
cdigo dentro dos departamentos de Informtica e Estatstica para alunos e
professores (C3SL) e para a equipe e colaboradores do LEG.
Em termos financeiros, custa menos um servidor na nuvem da Digital Ocean8
com o GitLab CE (U$ 5/ms) do que ter uma conta para repositrios privados
no GitHub (U$ 7/ms) por 5 repositrios privados). No entanto, conforme
j mencionamos, pequenas equipes podem ter repositrios privados na conta
gratuita do GitLab.com.
Alm das caractersticas essenciais e comuns aos demais servios, como issues,
fork, merge requests, wiki e snippets, o GitLab tem 1) 5 nveis de acesso aos
repositrios (owner, master, developer, report e guess), 2) reviso comentada de
cdigo nos diffs, 3) importao repositrios de outros servios, 4) adio de web
hooks e 5) integrao contnua nativa a partir da verso 8.0.
Criar uma conta no Github to simples como uma conta de e-mail ou numa
rede social. Acesse o endereo https://github.com/join para preencher seus
dados pessoais e escolher um plano. Nenhum dos planos tem limitao quanto
ao nmero de repositrios ou colaboradores. O que muda a quantidade
de repositrios privados. No plano free, s so criados repositrios pblicos
enquanto que nos planos pagos, o menor deles permite 5 repositrios privados
8 https://www.digitalocean.com/community/tutorials/how-to-use-the-gitlab-one-click-install-image-to-manage-git-repositories
72 CAPTULO 5. SERVIOS WEB PARA PROJETOS GIT
Uma vez criada uma conta, necessrio habilitar a comunicao entre sua
mquina e o (servidor do) GitHub. A comunicao feita com protocolo SSH
(Secure Shell), o qual j usamos no captulo anterior para hospedar o repositrio
em um servidor remoto.
Para relembrar, a maioria dos servidores suporta a autenticao por SSH.
Para que a conexo entre mquinas seja automtica, ou seja, sem precisar
fornecer usurio e senha a cada acesso/transferncia, usamos o recurso de
pares de chaves. Este serve para fazer a mquina remota (servidor) reconhecer
a mquina local (sua mquina) via autenticao do par de chaves. como se o
servidor fosse um cadeado e a sua mquina local tem a chave que o abre. Uma
vez que as chaves so pareadas e compatveis, ocorre o acesso ou transferncia
de arquivos.
Para gerar as chaves pblicas, voc precisa executar:
MMMMMMMMMMMMMMMMMMMMMMMMM
.MMMMMMMMMMMMMMMMMMMMMMMMM.
.MMMMMMMMM.
.MMM.
M
| |
+-----------------+
GitHub
A comunicao com o GitHub acabou de ser estabelecida. Agora podemos
criar repositrios e comear a mostrar nosso trabalho para o mundo e colaborar
de forma eficiente.
No canto superior direito das pginas do GitHub existe um cone + que
permite criar um novo repositrio ou uma nova organizao. Clique em
New repository ou acesse o endereo https://github.com/new. Na janela que
abrir, d um nome para o seu projeto e adicione uma breve descrio ele
(Figura 5.4). Na etapa seguinte, defina o nvel de visibilidade: pblico ou
privado. Lembre-se que os planos free s permitem repositrios pblicos. Ao
clicar em privado voc passar pelos formulrios para efetuar pagamento.
Para criar o projeto dentro de uma Organizao, selecione a Organizao na
drop list que fica no campo Owner, a esquerda do campo para o nome do
repositrio.
Voc pode inicializar o repositrio com um arquivo README.md, o que alta-
mente recomendado. Como j mencionamos, esse arquivo a capa do seu
repositrio e serve para documentar o seu objetivo, formas de colaborao,
colaboradores, formas de instalao/uso.
Voc pode editar o arquivo README.md (ou qualquer outro) no prprio GitHub.
As modificaes que fizer devem ser commitadas para serem salvas. O arquivo
README.md, que linguagem de marcao MarkDown, automaticamente
renderizado pelo GitHub fazendo com que urls sejam clicveis e cdigos
estejam em ambientes de fonte monoespao, alm de ter ttulos com tamanho
de fonte apropriado.
Depois de criar o repositrio, voc j pode clon-lo para trabalhar localmente. O
endereo do repositrio composto pelo seu nome de usurio (ou organizao)
e nome do repositrio. O repositrio bat-rangue da conta do batman pode ser
clonado com:
5.2. CRIAR UM PERFIL 75
Existe outra situao que quando voc j tem repositrio Git no qual j
est trabalhando e quer t-lo no GitHub. Nesse caso, voc vai criar um novo
repositrio mas no ir clon-lo, apenas copie a url que usaria para clon-lo.
No repositrio local, adicione essa url como endereo do servidor remoto e
faa um push. Vamos supor que o repositrio seja um artigo cientfico de
nome Artigo. Ao criar o repositrio com esse nome no GitHub, o endereo
fica git@github.com:fulano/Artigo.git. Ento s adicionar esse endereo
como origin do projeto Git:
Existem ainda mais coisas sobre o GitHub que no podemos deixar de comen-
tar: os recursos disponveis para colaborao. Nas sesses frente, trataremos
dos recursos de issue, fork e requisies de merge. Antes, no entanto, vamos
conhecer um pouco do GitLab, um servio web para projetos Git que pode ser
instalado no seu servidor.
O GitLab o servio que ns do PET usamos para colaborao em nossos
projetos. Alm disso, o que os alunos usam para fazerem seus trabalhos
e desenvolverem o TCC. O uso do Git como ferramenta de trabalho passou
ser estimulado no segundo semestre de 2015. Alm de reunir os alunos e
professores numa plataforma de colaborao eficiente, o conhecimento de Git
passa ser um diferencial no currculo.
GitLab
O GitLab concentra os acessos outras pginas em um menu do lado esquerdo.
Do lado direito pode haver informaes extras. O boto para criar um novo
repositrio fica no canto superior direito. Ao lado deste tem botes para ir
para pgina de configuraes, sair, ajuda e explorar o GitLab.
No menu da direita tem-se acesso aos projetos do usurio ( Yout Projects e
Starred Projects ) e aos grupos do qual participa ( Groups ). As entradas Milestones ,
Issues e Merge requests renem as informaes sobre todos os projetos do qual o
usurio participa.
Assim como acontece com outros servios web, na pgina inicial do projeto
exibido o arquivo de capa, o README. Centralizado na pgina encontra-se o
endereo para clonar o repositrio por SSH ou HTTP(S) e as principais entradas
esto no menu da direita:
## Segue a rotina.
git add <arquivos>
git commit -m <mensagem>
## Lista os remostos.
git branch -r
Voc pode notar que ramos locais no tem prefixo e que ramos remotos tem
o prefixo origin/. Voc pode remover um ramo local mas manter sua parte
remota e pode tambm excluir esse ramo por completo de todo o sistema,
localmente e no servidor, conforme ilustram os cdigos abaixo.
## Lista os remotos.
git remote -v
## Remove.
git remote rm profs
9 https://git-scm.com/docs/git-fetch
82 CAPTULO 5. SERVIOS WEB PARA PROJETOS GIT
Por fim, para subir o trabalho feito em um ramo, usa-se a instruo git push.
Enviar o seu trabalho com frequncia a melhor forma de ter backups, exibir e
disponibilizar suas contribuies para os seus colaboradores. A documentao
do git push11 rica em variaes mas a maneira mais simples de us-lo para
subir um ramo para o repositrio remoto.
Quando voc sobe pela primeira vez um ramo local, a sua parte remota
criada. Assim, a instruo que colocamos acima criou um ramo remoto
chamado origin/issue#10. Essa a forma mais natural, e at despercebida,
de criar ramos locais com cpias remotas, mas existem outras maneiras. Abaixo
fazemos a criao do remoto a partir do local sem ser usando o push. Esses
comandos precisam ser usados uma vez apenas.
Os servios web para Git, mesmo que voc trabalhe sozinho, j so interessan-
tes para ter uma cpia (backup) do seu projeto e disponibilizar seu trabalho.
No entanto, um dos principais objetivos dos servios web permitir a colabo-
rao entre pessoas. J mencionamos o bsico sobre recursos de colaborao
quando falamos de issue, fork e merge request. Nas sesses a seguir, vamos nos
aprofundar nesses trs mecanismos chave para a colaborao via servios web
para Git.
5.4.1 Issues
5.4.2 Fork
incorporar o que foi desenvolvido no fork. O GitHub usa o termo pull request
ao invs de merge request embora no exista diferena alguma.
Os trabalhos coletivos em projetos Git, para serem bem sucedidos, consideram
algum esquema de trabalho. A maioria dos esquemas considera o desenvolvi-
mento por branches. Nada mais justo, j que uma uma caracterstica do Git.
Existem ramos permanentes, como o master, que recebem o desenvolvimento
feito em branches auxiliares ou de demanda. Esses ramos de demanda, como o
nome sugere, so criados para incorporar algo ao projeto e, portanto, no so
permanentes - uma vez incorporados, so removidos.
Nos esquemas de trabalho, os membros so instrudos a fazerem o desenvolvi-
mentos nos ramos de demanda e jamais nos ramos permanentes. Ao concluir
essa unidade de trabalho, esse branch enviado para o servidor com um push
Na interface web, o membro faz um merge request desse ramo para um ramo
permanente, no qual em projetos simples o master mas em projetos maiores
usualmente o devel. Ao clicar em merge request, uma caixa de dilogo abre para
que voc liste as colaboraes que o branch leva.
Em ambos os servios, o merge resquest leva para um pgina na qual voc esco-
lhe que ramo de demanda (doador) ser incorporado a um ramo permanente
(receptor). Ao confirmar os ramos envolvidos, tem-se uma caixa de texto desti-
nada as informaes sobre quais as modificaes devem ser incorporadas. Elas
servem para justificar, esclarecer e informar o responsvel pelo merge sobre a
incorporao. Quando o projeto coletivo e no individual, um membro pode
ser indicado como responsvel pelo merge. O responsvel pelo merge avalia
as contribuies, se sentir necessidade v as diffs nos arquivos, e pode colocar
uma mensagem embaixo da sua com questionamentos e at adequaes que
precisarem ser feitas para aceitar o merge request.
Quando trata-se de fork, o processo ocorre de forma semelhante. A sequncia
de etapas : fazer o fork do projeto para a sua conta, 2) clonar o projeto para
sua mquina, 3) criar um branch e fazer o desenvolvimento nele, 4) subir o
branch (push) para a sua conta e 5) fazer um merge request para incorporar
as modificaes. Na hora de escolher o ramo permanente (receptor) tem-se
duas opes: 1) incorporar ao master (ou outro) da sua cpia ou 2) incorporar
ao master (ou outro) do original. Outra opo incorporar ao master da sua
cpia e depois pedir um merge request do seu master para o master do original.
Essa ltima til quando a quantidade de modificaes maior e portanto, o
trabalho vai levar mais tempo.
Os prprios servios web fazem o merge diretamente quando no existe conflito
(merge do tipo fast forward). Isso facilita bastante o trabalho. Porm, no
haver conflito de merge no significa que as modificaes incorporadas esto
funcionais, ou seja, as modificaes feitas precisam ser testadas localmente
para verificar se surtiram efeito. possvel habilitar o servio Git para checar se
o projeto executvel ou funcional. Esse recurso se chama integrao contnua
e veremos na prxima sesso.
86 CAPTULO 5. SERVIOS WEB PARA PROJETOS GIT
Em caso de conflito de merge, tem-se que baixar os ramos (git fetch). Local-
mente pode-se comparar as diferenas entre eles para entender as fontes de
conflito. Para isso so recomendveis as interfaces para Git que sero discutidas
no prximo Captulo. Uma vez que o merge foi resolvido, deve-se fazer o push
do ramo permanente (receptor) para o servio web que j reconhece que o
merge foi feito e fecha a requisio automaticamente.
Recomenda-se que os ramos de demanda sejam removidos aps sua incorpo-
rao nos ramos permanentes. Isso torna o projeto mais claro e concentrado
em ramos definitivos colhedores de desenvolvimento. Pode-se excluir o ramo
de demanda incorporado direto pela interface, marcando uma caixa de confir-
mao sobre remover o ramo aps o merge. Por linha de comando tambm
possvel.
de trabalho. Em uma situao ideal, algum teria que testar se o projeto corre
sem erros (cdigo executa, software instala) em uma mquina cliente (com
os requisitos mnimos exigidos), toda vez que um commit fosse feito, j que o
commit indica que modificaes foram feitas. Ento, se correu sem erros, avisar
todos que podem prosseguir, mas se falhou, informar a equipe, encontrar e
corrigir a falha.
No raro algo ser bem sucedido no ambiente em que foi desenvolvido e
apresentar falhas no ambiente de outra pessoa. O melhor jeito de antecipar
erros testar em um ambiente virgem, uma mquina cliente que contenha
apenas os requisitos mnimos necessrios ao projeto.
A Integrao Contnua (IC) a soluo desse problema. A ideia manter
o repositrio Git continuamente integrado um ambiente cliente que faz
verificaes no projeto a cada novo push.
Fazer integrao contnua no GitHub e GitLab, embora o conceito seja o mesmo,
tem algumas diferenas. Paro o GitHub existem diversos servios de IC, sendo
eles terceirizados. J o GitLab CE tm o servio prprio de IC a partir da
verso 8.0. Apresentaremos cada um deles na sesso seguinte.
Independe do servio web, as principais vantagens da IC14 so:
O que deve ficar claro que a integrao contnua no elimina erros, mas faz
com que eles sejam mais fceis de identificar e corrigir.
Sem a automao, os espaos entre verificaes podem ficar longos. Encontrar
um bug em tantos commits mais difcil, encontrar no cdigo mais ainda.
Pode atrasar a entrega do projeto e comprometer a receita e popularidade.
Integraes peridicas so mais fceis e leves.
O fluxo de trabalho de um repositrio com IC basicamente assim:
14 https://about.gitlab.com/gitlab-ci/
88 CAPTULO 5. SERVIOS WEB PARA PROJETOS GIT
5.5.1 GitHub
5.5.2 GitLab
continuous-integration-with-gitlab-ci.html
20 https://www.digitalocean.com/
21 http://git.leg.ufpr.br/
22 http://git.leg.ufpr.br/leg/legTools
23 http://git.leg.ufpr.br/wbonat/mcglm
90 CAPTULO 5. SERVIOS WEB PARA PROJETOS GIT
job1:
script: "teste_instalacao.sh"
job2:
script:
- pwd
- ls -a
Neste exemplo existem dois jobs (tarefas). Cada um deles corre independente e
podem ser executados simultaneamente. O primeiro executa um script shell e
o segundo comandos shell em uma lista. Porm, tais arquivos podem ser bem
mais complexos, com campos alm do script:. Os campos a seguir so todos
opcionais:
stages: define a ordem de excecuo dos jobs para uma cadeia de exe-
cuo condicional. Jobs de mesma ordem ou do mesmo estgio so
executados paralelamente mas queles frente s so executados se
houver sucesso dos predecessores.
stages:
- construcao
- teste
- entrega
job_contrucao:
script: "construcao.sh"
stage: construcao
job_test:
script: "teste_codigofonte.sh"
script: "teste_documentacao.sh"
stage: teste
job_entrega:
script: "compacta_transfere.sh"
stage: entrega
24 https://www.docker.com/
5.5. INTEGRAO CONTNUA 91
variables: serve para criar variveis de ambiente que podem ser usados
por todos os comandos e scripts. Tais variveis podem armazenadas se-
nhas de acesso, necessrias por exemplo para instalao de componentes
e acesso bancos de dados.
Com exceo dos nomes listados acima, um job pode ter qualquer nome, desde
que seja exclusivo. Dentro de um job tem-se tambm uma lista de campos
disponveis para configur-lo:
job_test:
script: "teste_codigofonte.sh"
script: "teste_documentacao.sh"
stage: teste
only:
- /^issue.*$/ ## Filtra os que comeam com issue.
job_R:
script:
- echo $HOME
- Rscript -e 'getwd(); .libPaths(); sessionInfo()'
- Rscript -e 'library(devtools); check()'
- Rscript -e 'library(devtools);\
.libPaths(path.expand("~/R-tests/legTools"));\
install(local = FALSE)'
![](http://git.leg.ufpr.br/ci/projects/1/status.png?ref=master)
5.5.2.2 Runners
Em poucas palavras, um runner uma mquina que executa o build por meio
do GitLab CI. Um runner pode ser especfico de um projeto ou pode ser um
runner compartilhado, disponvel todos os projetos. Estes ltimos so teis
projetos que tem necessidades similares, como todos queles projetos que
so pacotes R, por exemplo. Isso facilita a administrao e atualizao. Os
especficos, por outro lado, atendem projetos com demandas particulares.
Apenas usurios com permisses de admin podem criar runners compartilha-
dos.
Em Settings Services marque o campo active. Isso vai criar 6 novas entradas no
menu da esquerda:
25 https://gitlab.com/gitlab-org/gitlab-ci-multi-runner
26 http://doc.gitlab.com/ce/ci/runners/README.html
94 CAPTULO 5. SERVIOS WEB PARA PROJETOS GIT
Captulo 6
Ferramentas grficas
Os comandos mais usuais como git adde git commit se tornam simples,
pois mesmo para um usurio iniciante eles fazem parte do cotidiano em um
projeto sob versionamento Git. Porm, algumas situaes no ocorrem com
frequncia, como por exemplo voltar a verso de um arquivo ou do repositrio
requerem comandos que so pouco utilizados e para realiz-las necessrio a
consulta de algum material. Outra situao em que a utilizao dos comandos
dificultada, ocorre em projetos grandes, uma vez que muitos arquivos so
alterados simultaneamente. Neste caso o procedimento de commit se torna
trabalhoso, pois necessrio listar todos os arquivos que fazem parte de um
commit no commando git add. Uma ltima situao exemplo em que o uso de
CLI no parece satisfatrio na comparao de arquivos, j usamos o comando
git diff no captulo 3 e o output deste comando foi de simples visualizao,
mas em arquivos grandes (com muitas linhas) a navegao para verificar as
alteraes do arquivo no to amigvel. Para facilitar essas e outras situaes
surgem as GUIs (Graphical User Interfaces), interfaces grficas para o usurio
incorporar comandos Git em widgets(botes, caixas de texto etc.) dispostos em
uma janela grfica de seu sistema operacional.
95
96 CAPTULO 6. FERRAMENTAS GRFICAS
6.1.1 git-gui
git gui
git status
On branch master
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
modified: README.txt
modified: porqueLinux.txt
Untracked files:
(use "git add <file>..." to include in what will be committed)
TODO.txt
no changes added to commit (use "git add" and/or "git commit -a")
6.1.2 gitk
gitk
6.1.3.2 RabbitVCS
6.1.3.3 git-cola
Esta tambm uma interface alternativa que se destaca por ser completa e
portvel (disponvel para sistema LINUX, Windows e Mac). Implementada
em python, a git-cola uma alternativa git gui e contm praticamente os
mesmos elementos para alteraes no repositrio. Como a git gui se auxilia
da gitk para visualizao, a git-cola tambm tem uma interface de apoio,
chamada de git-dag que vem instalado junto ao git-cola.
Perceba pela figura 6.8 que as opes das interfaces so similares as apresen-
tadas em git gui e gitk. As interfaces git-cola e git-dag se destacam pela
fcil manipulao do layout exibido, alm de deixar a interface mais intuitiva
possvel. Como destaque em implementao de funcionalidade Git, a git-cola
se sobressai com relao git gui na possibilidade de execuo do comando
git rebase via interface.
##-------------------------------------------
### Windows.
git config diff.tool meld
git config difftool.meld.cmd '"path/Meld.exe" $LOCAL $REMOTE'
##-------------------------------------------
## Alterando README para induzir conflito
##-------------------------------------------
## Tentativa de mesclagem
git merge feature05
Auto-merging README.txt
CONFLICT (content): Merge conflict in README.txt
Automatic merge failed; fix conflicts and then commit the result.
111
112 CAPTULO 6. FERRAMENTAS GRFICAS
Na figura 6.13 temos a janela do programa meld quando usado para resoluo
de conflito, conforme comando descrito anteriormente. So apresentados trs
verses lado a lado de cada arquivo em conflito: direita temos a verso LOCAL,
com o estado do arquivo no ramo atual; esquerda o REMOTE, que representa
a verso com as alteraes a serem mescladas e; finalmente na poro central
temos o BASE, com o contedo de uma verso anterior comum a ambos. Assim
como apresentado na figura 6.12, em que o meld foi utilizado como difftool,
podemos (e neste caso devemos) editar um arquivo o BASE, exibido na poro
central do aplicativo. Este arquivo ser o definitivo ao fim da mesclagem, nele
podemos incluir as contribuies apresentadas no que batizamos de LOCAL e
REMOTE. Isso facilita a resoluo de conflitos, pois podemos ver as contribuies
lado a lado e decidir como dever ficar o arquivo definitivo.
Aps a edio do arquivo, o processo de mesclagem pode continuar normal-
mente. Abaixo conclumos o processo via linha de comando:
On branch master
All conflicts fixed but you are still merging.
(use "git commit" to conclude merge)
Changes to be committed:
modified: README.txt
Untracked files:
(use "git add <file>..." to include in what will be committed)
README.txt.orig
##-------------------------------------------
## Windows
git config merge.tool meld
git config merge.meld.cmd '"path/Meld.exe" $LOCAL $BASE $REMOTE --output=$MERGED'
Trabalhando em equipe
O Git uma ferramenta que aliada a outros servios web, como GitLab ou
GitHub, oferece funcionalidade e autonomia para se trabalhar. Contudo, com
tantos recursos disponveis, s sero bem aplicados quando todos os membros
do grupo, alm de conhec-los, trabalham em harmonia.
115
116 CAPTULO 7. TRABALHANDO EM EQUIPE
1. Separe o ttulo do corpo do texto com uma linha em branco: por padro,
a primeira linha o ttulo do commit, e deve ser uma mensagem curta.
Ao deixar uma linha em branco, permitido escrever uma mensagem
de qualquer tamanho, detalhando melhor as modificaes feitas. Dessa
forma, quando git log for executado, toda a mensagem de commit
aparecer, enquanto que git log --oneline mostrar apenas o ttulo do
commit.
- Corrigindo o erro
- Mudando a funo
- Mais correes para mais funes
Exemplos de rotinas
Rotinas
123
124 ROTINAS
## Configurando localmente
## - vlido para o repositrio atual
git config user.name "Name Lastname"
git config user.email "namelastname@servidor"
## Configurando globalmente
## - vlido para todos os repositrios do computador
git config --global user.name "Name Lastname"
git config --global user.email "namelastname@servidor"
Rotina 3: Criar chaves pblicas para adicionar aos perfils em sevios Web.
## Sai do servidor.
exit
126 ROTINAS
## Registra as alteraes
git commit -m "Altera delimitadores da funo"
## -------------------------------------------
## Diferenas no commitadas
## -------------------------------------------
## Diferenas entre verses commitadas
## -------------------------------------------
## Diferenas entre ramos
## Histrico de registros
git log
## -------------------------------------------
## Descartar todas as alteraes at um commit
git reset --hard ec3650c8
## -------------------------------------------
## Reverte o estado atual para um registro especfico
git revert ec3650c8
git commit -am "Retorna projeto para verso funcional"
## -------------------------------------------
## Cria um ramo provisrio a partir de um SHA1 ID
git checkout ec3650c8
Rotina 11: Refazer o ltimo commit para alterar a mensagem e/ou incluir mais
modificaes.
## -------------------------------------------
## Reescreve a ltima mensagem de commit
git commit --amend -m "Correo de Commit"
asdasd
asdas
## -------------------------------------------
## Realizando contribuies em um ramo remoto
## -------------------------------------------
## Realizando contribuies em um ramo remoto e
ROTINAS 131
## -------------------------------------------
## Adicionando local para trazer contribuies
## -------------------------------------------
## Adicionando local para enviar contribuies
## Listar os ramos:
git branch -l ## Locais
git branch -r ## Remotos
git branch -a ## Todos
git branch --merged ## Incorporados ao atual
## Remove ramos:
git branch -d bugfix ## Locais
git branch -dr origin/bugfix ## Remotos
git push --delete origin bugfix ## No origin
git push origin :bugfix ## Idem o anterior
Dicionrio de termos
B.0.1 Config
Exemplo:
Para que o Git local consiga se conectar a um servidor Git remoto, necessrio
que esta chave seja gerada e que as devidas configuraes sejam feitas tanto
localmente quanto no servidor remoto, caso contrrio, exibido um erro e a
conexo interrompida.
Exemplo:
133
134 APNDICE B. DICIONRIO DE TERMOS
B.0.3 Help
Todo comando Git tem um manual de ajuda que pode ser exibido na tela com
o comando --help.
Exemplo:
B.0.4 Repositrio
B.0.6 Remote
B.0.7 Clone
Exemplo:
B.0.8 Status
# Pedindo o status:
git status
B.0.9 Add
O add adiciona (envia) os arquivos para a stagin area, para que possa ser
marcado no tempo por um commit.
Exemplo:
B.0.10 Commit
O commit marca os arquivos da stagin area como uma verso definitiva, para
que posteriormente, caso algum erro ocorra, possamos voltar nos commits
anteriores onde o cdigo est em pleno funcionamento.
Exemplo:
B.0.11 Branch
B.0.12 Checkout
B.0.13 Merge
B.0.14 Rm
O git rm, na sua forma mais comum, serve para remover um arquivo de
forma que ele deixe de ser gerenciado pelo Git e seja excludo do disco rgido.
Tambm possvel que o arquivo deixe de ser gerenciado e permanea no
disco.
Uma das vantagens que, quando o arquivo removido pelo git rm, j aparece
como preparado (staged), precisando somente que a excluso seja commitada.
Exemplo:
137
B.0.15 Mv
B.0.16 Push
B.0.17 Fetch
B.0.18 Pull
B.0.19 HEAD
B.0.20 Tag
Exemplo:
B.0.21 Stash
Exemplo:
# Fazendo o stash:
git stash
# Listando os stash criados:
git stash list
139
B.0.22 Reset
B.0.23 Rebase
B.0.24 Blame
# Fazer
B.0.25 Bisect
O bisect realiza uma pesquisa binria (binary search) a procura de erros. Para
que a pesquisa ocorra, necessrio um ponto no tempo em que o cdigo esteja
funcionando e outro que no esteja.
Exemplo:
140 APNDICE B. DICIONRIO DE TERMOS
# Pesquisa Binria:
# Iniciando a pesquisa.
git bisect start
# Marcando o commit atual como no funcionando.
git bisect bad
# Marcando o commit com nome commit1 como funcionando:
git bisect good commit1