Git e Gitlab por Samir C Costa Iplanfor
-
Upload
samir-coutinho -
Category
Software
-
view
429 -
download
7
Transcript of Git e Gitlab por Samir C Costa Iplanfor
1
GIT E GITLABPARA UM DESENVOLVIMENTO
EFICIENTECriado por @ Samir C. Costa Instituto de Planejamento de Fortaleza
2
SUMÁRIO1. Sobre o Git2. Quem usa Git?3. Por que o Git é tão bom?4. Noções Básicas de Git
1. Teoria2. Branching3. Configuração básica4. Comandos básicos5. Desfazendo 'noobiadas'6. Integrando Branches7. Resolvendo conflitos
5. Git flow6. Entrega contínua de software7. Cultura DevOps8. GitLab Community Edition (CE)9. Exercícios de fixação
10. Referências
3
SOBRE O
Autor original: Linus TorvaldsRelease inicial: 7 de abril de 2005 (~ 10 anos)Licença: GNU General Public License v2Site oficial: https://git-scm.com
man page descreve Git como "the stupid content tracker"git é uma gíria em inglês britânico para cabeça dura
4
QUEM USA GIT?
5
QUEM USA GIT?e...
DISIN[nós]
6
POR QUE GIT É TÃO BOM?tudo é localé rápidoé pequenodistribuídovários workflowsfácil de aprendergrande comunidade
7
NOÇÕES BÁSICAS DE
8 . 1
SNAPSHOTS, E NÃO DIFERENÇAS
8 . 2
SNAPSHOTS, E NÃO DIFERENÇASsnapshots : captura de algo em um determinado instante,
como em uma foto.
SVN Git
9
DESCENTRALIZADO, MASCENTRALIZADO
10
TEM INTEGRIDADEGit usa o hash SHA-1 para fazer o checksumstring de 40 caracteres
caracteres hexadecimais (0-9 e a-f)
$ g i t l o g
c o m m i t c 8 f 4 3 4 7 f 9 d 3 e c d 3 1 1 e 8 9 4 1 c a d 3 c 9 8 0 2 e 7 2 0 3 8 e 8 4 A u t h o r : S a m i r C o s t a < s a m i r . c o u t i n h o @ f o r t a l e z a . c e . g o v . b r > D a t e : T u e F e b 1 6 1 7 : 2 5 : 2 0 2 0 1 6 - 0 3 0 0
b a r r a d e p e s q u i s a o c u l t a d a
11
PRODUTIVIDADEtem manual de cada comando
$ m a n g i t f e t c h
autocompletamento (TAB)
1213
OS TRÊS ESTADOS FUNDAMENTAIS
modificado → modified
preparado → staged
consolidado → committed
14
AS TRÊS SEÇÕES PRINCIPAIS
15
GLOSSÁRIO ESSENCIAL
HEADrepresenta o snapshot/posição de um branch
ORIGINnome padrão que o Git dá ao servidor de onde você fez oclone
16
BRANCHé essencialmente uma linha independente dedesenvolvimentoajuda a isolar seu trabalho dos outros membros da equipedesenvolvimento em paralelo sem dores de cabeçacódigo antigo intacto até saber se o novo funcionasempre confira se existe algum commit à frente antes decomeçar a trabalhar
17
TIPOS DE BRANCH (BRANCHING)Principais
masterdevelop
De apoiofeaturehotfixrelease
18
BRANCHINGPRINCIPAIS
masterrecebe código de produção provido de uma releasebranchbranch integrada (automatizada com hook)
19
BRANCHINGPRINCIPAIS
developrecebe código sem erros de sintaxe ou compilaçãooriunto das features branchsnele são executados testes no sistema como um todopara verificar se algum código quebrou outro.
20
BRANCHINGDE APOIO
featuresempre crie uma antes de iniciar a codificaçãofaça sua arte neste branchfaça commits curtos e frequentesfaça rebase frequentemente para trazer as mudançasdo ramo developramifique ainda maisnormalmente existem apenas nos repositórios dosdesenvolvedorestem vida curtaapague as antigas sem uso
21
BRANCHINGDE APOIO
hotfixhotfixes surgem da necessidade de agir imediatamentesobre uma situação indesejada na versão de produçãoativapode ser criado a partir da tag correspondente nobranch master que indica a versão em produção
22
BRANCHINGDE APOIO
releasecada vez que necessite de um merge no master, é umnovo release por definiçãoauxilia a preparação de uma nova versão de produçãopermite correções de bugs menores e a preparação demetadados de uma versão
23
PORTANTONUNCA commit direto no masterNUNCA commit direto no developsó faça merge neleso ideal quando em equipe: merge request
24
CONFIGURANDO O GITOnde?
~ / . g i t c o n f i g
Sua identidade
$ g i t c o n f i g - - g l o b a l u s e r . n a m e " P e t e r P e d r o " $ g i t c o n f i g - - g l o b a l u s e r . e m a i l p e t e r . p e d r o @ f o r t a l e z a . c e . g o v . b r
25
DICA DO CHEFE
Clonando fora da rede da prefeitura
g i t c l o n e h t t p : / / h o s t g i t : 3 2 0 0 0 / i p l a n f o r / s a l a - s e t o r i a l . g i t
Macete do bower
g i t c o n f i g - - g l o b a l u r l . " h t t p s : / / " . i n s t e a d O f g i t : / /
26
COMANDOS BÁSICOS DO GIT# V a i p a r a o b r a n c h m a s t e r g i t c h e c k o u t m a s t e r
# B a i x a a s ú l t i m a s m o d i f i c a ç õ e s n o p r o j e t o # ( R E M O T E : o r i g i n ) # ( N A M E - O F - B R A N C H : p o d e s e r " m a s t e r " o u u m b r a n c h e x i s t e n t e ) g i t p u l l R E M O T E N A M E - O F - B R A N C H - u
# C r i a u m b r a n c h g i t c h e c k o u t - b N A M E - O F - B R A N C H
# V a i p a r a o b r a n c h r e c é m - c r i a d o g i t c h e c k o u t N A M E - O F - B R A N C H
# V ê a s m u d a n ç a s r e a l i z a d a s g i t s t a t u s
27
COMANDOS BÁSICOS DO GIT# A d i c i o n a m u d a n ç a s n o s t a g e p a r a ' c o m i t a r ' g i t a d d C H A N G E S g i t c o m m i t - m " D E S C R I B E T H E I N T E N T I O N O F T H E C O M M I T "
# E n v i a a s m u d a n ç a s p a r a o g i t l a b g i t p u s h R E M O T E N A M E - O F - B R A N C H
# D e l e t a t o d a s a s m u d a n ç a s g i t c h e c k o u t .
# D e l e t a t o d a s a s m u d a n ç a s i n c l u s i v e a r q u i v o s n ã o r a s t r e a d o s g i t c l e a n - f
# T r a z a s m u d a n ç a s d o m a s t e r p a r a s u a b r a n c h # v o c ê p r e c i s a e s t a r n o b r a n c h c r i a d o g i t c h e c k o u t N A M E - O F - B R A N C H g i t m e r g e m a s t e r
28 . 1
CRIANDO UM PROJETO# T r a n s f o r m a o d i r e t ó r i o a t u a l e m u m r e p o s i t ó r i o G i t # P a s t a . g i t é a d i c i o n a d a g i t i n i t
# I n i c i a l i z a u m r e p o s i t ó r i o v a z i o , m a s o m i t e o d i r e t ó r i o d e t r a b a l h o g i t i n i t - - b a r e
OBTENDO UM PROJETOg i t c l o n e < u r l >
28 . 2
CRIANDO UM PROJETOFLAG BARE
29
SALVANDO ALTERAÇÕESgit add
# P õ e < f i l e > n o s t a g e g i t a d d < f i l e >
# P õ e < d i r > n o s t a g e g i t a d d < d i r >
# I n t e r a t i v a m e n t e , a d i c i o n a o c o n t e ú d o d a p a s t a a t u a l n o s t a g e g i t a d d - p
30
SALVANDO ALTERAÇÕESgit commit
# A b r e o e d i t o r p a d r ã o p a r a q u e a m e n s a g e m s e j a e s c r i t a g i t c o m m i t
# N ã o a b r e o e d i t o r e j á p r o c e s s a o c o m m i t g i t c o m m i t - m ' < m e s s a g e m > '
# C o m m i t c o m t o d a s a s a l t e r a ç õ e s r e a l i z a d a s n o d i r e t ó r i o d e t r a b a l h o . # A p e n a s a r q u i v o s r a s t r e a d o s g i t c o m m i t - a
31
INSPECIONANDO UMREPOSITÓRIO
git status
# O n b r a n c h m a s t e r # C h a n g e s t o b e c o m m i t t e d : # ( u s e " g i t r e s e t H E A D < f i l e > . . . " t o u n s t a g e ) # # m o d i f i e d : h e l l o . p y # # C h a n g e s n o t s t a g e d f o r c o m m i t : # ( u s e " g i t a d d < f i l e > . . . " t o u p d a t e w h a t w i l l b e c o m m i t t e d ) # ( u s e " g i t c h e c k o u t - - < f i l e > . . . " t o d i s c a r d c h a n g e s i n w o r k i n g d i . . . # # m o d i f i e d : m a i n . p y # # U n t r a c k e d f i l e s : # ( u s e " g i t a d d < f i l e > . . . " t o i n c l u d e i n w h a t w i l l b e c o m m i t t e d ) # # h e l l o . p y c
32
INSPECIONANDO UMREPOSITÓRIO
git status
EXEMPLO# E d i t e i h e l l o . p y
g i t s t a t u s # h e l l o . p y f o i l i s t a d o c o m o " C h a n g e s n o t s t a g e d f o r c o m m i t "
g i t a d d h e l l o . p y
g i t s t a t u s # h e l l o . p y f o i l i s t a d o c o m o " C h a n g e s t o b e c o m m i t t e d "
g i t c o m m i t
g i t s t a t u s # n a d a p a r a c o m m i t ( d i r e t ó r i o d e t r a b a l h o l i m p o )
33
INSPECIONANDO UMREPOSITÓRIO
git log
# M o s t r a o s ú l t i m o s n c o m m i t s g i t l o g - n < l i m i t >
# M o s t r a u m c o m m i t p o r l i n h a g i t l o g - - o n e l i n e
# F i l t r a c o m m i t s p o r u m p a d r ã o e s p e c í f i c o g i t l o g - - g r e p = " < p a d r a o > "
# F i l t r a c o m m i t s d e u m s n a p s h o t a o u t r o g i t l o g < c o m m i t _ d e s d e > . . < c o m m i t _ a t e >
# M o s t r a l o g a p e n a s d e u m a r q u i v o e m p a r t i c u l a r g i t l o g < f i l e >
# L o g " g r á f i c o " v i s u a l m e n t e b o n i t o ( i n t e r e s s a n t e f a z e r u m a l i a s ) g i t l o g - - g r a p h - - d e c o r a t e - - o n e l i n e
34
ALIASES$ g i t c o n f i g - - g l o b a l a l i a s . l a s t ' l o g - 1 H E A D '
$ g i t l a s t A u t h o r : S a m i r C o s t a < s a m i r . c o u t i n h o @ f o r t a l e z a . c e . g o v . b r > D a t e : W e d F e b 2 4 1 6 : 5 9 : 5 9 2 0 1 6 - 0 3 0 0
A d d a r q u i v o s o f f l i n e p a r a p l a n o B
35
TROCANDO DE BRANCH$ g i t c h e c k o u t < n o m e _ d o _ b r a n c h >
mas eu tenho arquivos modificados, como faço?
STASH
36
STASH$ g i t s t a s h
37
STASH$ g i t s t a t u s N o r a m o f e a t u r e / i s s u e - 1 C h a n g e s n o t s t a g e d f o r c o m m i t : m o d i f i c a d o : i n d e x . h t m l
$ g i t s t a s h S a v e d w o r k i n g d i r e c t o r y a n d i n d e x s t a t e W I P o n f e a t u r e / i s s u e - 1 . . . H E A D i s n o w a t c 9 3 f b f 1 r e a d m e t w e a k
$ g i t s t a t u s N o r a m o f e a t u r e / i s s u e - 1 Y o u r b r a n c h i s u p - t o - d a t e w i t h ' o r i g i n / f e a t u r e / i s s u e - 1 '
$ g i t s t a s h p o p
Recupera as modificações para seu diretório de trabalho.
38
DESFAZENDO'NOOBIADAS'
39
DESFAZENDO 'NOOBIADAS'git commit --amendgit checkoutgit revertgit resetgit clean
40
DESFAZENDO 'NOOBIADAS'git commit --amend
a maneira conveniente de consertar apenas o commitmais recente.
git commit --amend --no-editutiliza a mesma mensagem de commit do anterior
41
DESFAZENDO 'NOOBIADAS'git checkout: arquivos • commits • branches
# E s t a d o a t u a l d o b r a n c h e s p e c i f i c a d o g i t c h e c k o u t < b r a n c h >
# V a i p a r a u m a v e r s ã o a n t e r i o r d o a r q u i v o e s p e c i f i c a d o g i t c h e c k o u t < c o m m i t > < f i l e >
# A t u a l i z a t o d o s o s a r q u i v o s p a r a o c o m m i t e s p e c i f i c a d o g i t c h e c k o u t < c o m m i t >
# A t u a l i z a a p e n a s a r q u i v o s c u j o s c a m i n h o s c o n c i d e m c o m < p a t h s > g i t c h e c k o u t - - < p a t h s >
# V a i p a r a a v e r s ã o m a i s r e c e n t e d o a r q u i v o e s p e f i c a d o g i t c h e c k o u t H E A D < f i l e >
42
DESFAZENDO 'NOOBIADAS'
git revert:
desfaz um único commit com um novo commitnão perde histórico
"seguro"
g i t r e v e r t < c o m m i t >
43
DESFAZENDO 'NOOBIADAS'git reset:
age principalmente na área de stagepode agir no diretório do trabalho com a flag --hardpode remover commitsdeve ser usado apenas localmente"perigoso"
44
DESFAZENDO 'NOOBIADAS'git reset
# R e m o v e u m a r q u i v o e s p e c í f i c o d o s t a g e g i t r e s e t < f i l e >
# R e s e t a t u d o n o s t a g e p a r a o c o m m i t m a i s r e c e n t e g i t r e s e t
# R e s e t a t u d o n o s t a g e e d i r e t ó r i o d o t r a b a l h o g i t r e s e t - - h a r d
# M o v e a p o n t a d o b r a n c h a t u a l p a r a < c o m m i t > e r e s e t a o s t a g e g i t r e s e t < c o m m i t >
# M e s m o q u e o a n t e r i o r , m a s r e s e t a s t a g e e d i r e t ó r i o d e t r a b a l h o g i t r e s e t - - h a r d < c o m m i t >
45
DESFAZENDO 'NOOBIADAS'
46
DESFAZENDO 'NOOBIADAS'git revert
EXEMPLO # E d i t e i a l g u n s a r q u i v o s r a s t r e a d o s
# F i z u m c o m m i t g i t c o m m i t - m " F i z a l g u m a s a l t e r a ç õ e s q u e s e r ã o d e s f e i t a s "
# R e v e r t o c o m m i t q u e a c a b e i d e c r i a r g i t r e v e r t H E A D
47
DESFAZENDO 'NOOBIADAS'git revert
EXEMPLO
48
DESFAZENDO 'NOOBIADAS'git clean
remove arquivos não rastreados do seu diretório detrabalho
# " d r y - r u n " d o g i t c l e a n g i t c l e a n - n
# R e m o v e a r q u i v o s n ã o r a s t r e a d o s d o d i r e t ó r i o a t u a l . # N ã o r e m o v e p a s t a s e i t e n s d o . g i t i g n o r e g i t c l e a n - f
# O m e s m o q u e o a n t e r i o r , m a s l i m i t a d o a o c a m i n h o e s p e c i f i c a d o g i t c l e a n - f < p a t h >
# R e m o v e a r q u i v o s e p a s t a s n ã o r a s t r e a d a s d o d i r e t ó r i o l o c a l g i t c l e a n - d f
# R e m o v e t o d o s o s a r q u i v o s n ã o r a s t r e a d o s a s s i m c o m o o s # e s p e c i f i c a d o s n o . g i t i g n o r e g i t c l e a n - x f
49
DESFAZENDO 'NOOBIADAS'git clean
EXEMPLO# E d i t e i a l g u n s a r q u i v o s e x i s t e n t e s # A d i c i o n e i a l g u n s a r q u i v o s n o v o s # P e r c e b i q u e n ã o t i n h a i d e i a d o q u e e s t o u f a z e n d o
# D e s f i z a s a l t e r a ç õ e s n o s a r q u i v o s r a s t r e a d o s g i t r e s e t - - h a r d
# R e m o v i t u d o q u e n ã o e s t a v a r a s t r e a d og i t c l e a n - d f
50
INTEGRANDO BRANCHES
MERGE FAST-FORWARD@ ( m a s t e r ) $ g i t m e r g e b u g f i x
51
INTEGRANDO BRANCHES
MERGESEM FAST-FORWARD
@ ( m a s t e r ) $ g i t m e r g e - - n o - f f b u g f i x
52
MERGEPRÓS
fácil de entendercommits do ramo fonte permanecem separados doscommits do outro ramo
bom para feature branchescommits existentes do ramo fonte ficam intactos e válidos
CONTRAS
se a necessidade de merge surge simplesmente porquevárias pessoas estão trabalhando em do mesmo ramo emparalelo, o histórico pode criar uma confusão.
53
REBASEgit rebase -i ⇒ squash
juntar, combinar múltiplos commits em ume reordená-los.
54
REBASEPRÓS
simplifica o históricoé a maneira mais intuitiva e livre de confusão paracombinar commits de múltiplos desenvolvedores em umramo compartilhado
CONTRAS
um pouco mais complexo, especialmente sob conflito decódigo
cada commit é feito rebase em ordema cada conflito, este processo é interrompido
a reescrita do histórico tem ramificações se você fez pushdaqueles commits anteriormente em outro lugar
55
REGRA DE OURO
NUNCAFAÇA REBASE DE UM RAMO QUE
VOCÊ FEZ:push oupull (fetch + merge) do trabalho de uma outra pessoa
56
MERGE X REBASEMerge preserva o histórico de commitsRebase reescreve o histórico de commits
57
ESTRATÉGIASuse SEMPRE feature branches para codificarsempre crie commits atômicosprefira utilizar o faça rebase para evitar/solucionar conflitos
git flow
58
RESOLVENDO CONFLITOS
git difffeio e trabalhoso
$ g i t d i f f - - c a c h e d d i f f - - g i t a / R E A D M E b / R E A D M E i n d e x b c c d f b d . . b 0 e d 4 1 5 1 0 0 6 4 4 - - - a / R E A D M E + + + b / R E A D M E @ @ - 1 + 1 , 2 @ @ T h i s i s t h e R E A D M E f i l e . + O n e m o r e l i n e .
# E d i t a r e s a l v a r o s a r q u i v o s u m p o r u m # A d d n o s t a g e e c o m m i t
59
RESOLVENDO CONFLITOS
bonito e produtivomenos dolorosotem instalador para o sistemaoperacional proprietário daMicrosoft
MELDs u d o a p t - g e t i n s t a l l m e l d
g i t m e r g e t o o l - t m e l d
m e l d a r q 1 a r q 2
60
GIT CHEAT SHEET
https://duckduckgo.com/?q=git+cheat+sheet&ia=cheatsheet&iax=1
61 . 1
GIT FLOWmodelo de Vincent Driessen
61 . 2
GIT FLOWmodelo de Vincent Driessen original
61 . 3
APRESENTAÇÃO: USANDO GITFLOW PARA ALIVIAR DORES DE
CABEÇA
62
ENTREGA CONTÍNUA DESOFTWARE
Poder lançar um release para produção a qualquermomento.Software ser implantável ao longo do seu ciclo de vidaEquipe priorizar manter implantável ao trabalhar emnovas featuresPoder obter feedback rápido e automatizado sobre osistema em produçãoPoder implantar qualquer versão de forma simples aqualquer ambiente sob demanda
63
ENTREGA CONTÍNUA DE SOFTWARE
VANTAGENSrisco de implantação reduzido
pequenas mudançasmenor chance de dar erradofacilidade de conserto
progresso mais críveltrabalho concluído tangível em produção
feedback do usuário
64
CULTURA DEVOPSaumentar a colaboração entre desenvolvimento eoperaçõescompartilhar responsabilidadesequipe autônomaqualidade no processo de desenvolvimento
performancesegurança
feedback contínuoautomação
testesconfiguraçãoimplantação
65
COMMUNITY EDITION (CE)
65
66
GITLAB CECódigo-fonte aberto (licença MIT)Escalável: suporta 25.000 usuários em um servidor eclusterizaçãoStream de atividadeFile browserGit powered wiki com markdown GitLab FlavoredMarkdown (GFM)
67
GITLAB CEIntegração e entrega contínuaGerenciador de issuesSnippetsWeb hooksRevisor de código
Merge-request com comentários linha por linha
68 . 1
GITLAB CELINKANDO E FECHANDO ISSUES COM COMMITS OU
MERGE REQUESTS
1. mencionar a issue na mensagem do commit ou descriçãodo merge request
fixes #14 • fix #14 • fixed #14 • fixing #14closes #67 • close #67 • closed #67 • closing #67
2. A issue será fechada automaticamente quando o commitestiver no branch principal (master).
EXEMPLOg i t c o m m i t - m " A w e s o m e c o m m i t m e s s a g e \ ( F i x # 2 0 , F i x e s # 2 1 a n d C l o s e s g r o u p / o t h e r p r o j e c t # 2 2 ) . \ T h i s c o m m i t i s a l s o r e l a t e d t o # 1 7 a n d f i x e s # 1 8 , # 1 9 \ a n d h t t p s : / / g i t l a b . e x a m p l e . c o m / g r o u p / o t h e r p r o j e c t / i s s u e s / 2 3 . "
68 . 2
GITLAB CELINKANDO E FECHANDO ISSUES COM COMMITS OU
MERGE REQUESTS
69
GITLAB CEMILESTONES
permite agrupar issues e definir prazos
70 . 1
GITLAB CE
70 . 2
GITLAB CELABELS
bugconfirmedcriticaldiscussiondocumentationenhancementsuggestionsupporttaskwip
71
GITLAB CENETWORK
72
EXERCÍCIOS DE FIXAÇÃO - Git do zero
- aprenda os poderosos conceitos portrás do branching com o git.
Try GitLearn Git Branching
73
REFERÊNCIAS Vincent Driessen. Janeiro de
2010. Daniel Kummer. Agosto de 2012.
Martin Fowler. Maio de 2013. Alex Tercete. Julho de 2014.
Steve. Agosto de 2012. Sytse Sijbrandij. Setembro de 2014.
Lemi Orhan. Novembro de 2012. Scott Chacon e Ben Straub. 2014.
Atlassian. GitLab Inc e comunidade.
A successful Git branching model.
Cheatsheet do git-flow.Continuous Delivery.Como usamos o Git Rebase.Merge or Rebase?Gitlab Flow.Git Branching Model.Livro Pro Git 2ª edição.Become a git guru.GitLab Documentation.
74
"No que diz respeito ao empenho, aocompromisso, ao esforço, à dedicação, nãoexiste meio termo. Ou você faz uma coisa
bem feita ou não faz."
Ayrton Senna