Logo Passei Direto
Buscar

Integração da equipe de Devs com o Git

Unidade de Aprendizagem sobre integração da equipe de Devs com o Git (Gitflow). Aborda estratégia de ramificação e versionamento com Gitflow, resolução de conflitos, objetivos de aprendizagem, infográfico e um desafio prático (caso DEV_B) com saídas de comandos.

Material
páginas com resultados encontrados.
páginas com resultados encontrados.

Escolha uma das opções e acesse esse e outros materiais sem bloqueio. 🤩

Cadastre-se ou realize login

Ao continuar, você aceita os Termos de Uso e Política de Privacidade

Escolha uma das opções e acesse esse e outros materiais sem bloqueio. 🤩

Cadastre-se ou realize login

Ao continuar, você aceita os Termos de Uso e Política de Privacidade

Escolha uma das opções e acesse esse e outros materiais sem bloqueio. 🤩

Cadastre-se ou realize login

Ao continuar, você aceita os Termos de Uso e Política de Privacidade

Escolha uma das opções e acesse esse e outros materiais sem bloqueio. 🤩

Cadastre-se ou realize login

Ao continuar, você aceita os Termos de Uso e Política de Privacidade

Escolha uma das opções e acesse esse e outros materiais sem bloqueio. 🤩

Cadastre-se ou realize login

Ao continuar, você aceita os Termos de Uso e Política de Privacidade

Escolha uma das opções e acesse esse e outros materiais sem bloqueio. 🤩

Cadastre-se ou realize login

Ao continuar, você aceita os Termos de Uso e Política de Privacidade

Escolha uma das opções e acesse esse e outros materiais sem bloqueio. 🤩

Cadastre-se ou realize login

Ao continuar, você aceita os Termos de Uso e Política de Privacidade

Escolha uma das opções e acesse esse e outros materiais sem bloqueio. 🤩

Cadastre-se ou realize login

Ao continuar, você aceita os Termos de Uso e Política de Privacidade

Escolha uma das opções e acesse esse e outros materiais sem bloqueio. 🤩

Cadastre-se ou realize login

Ao continuar, você aceita os Termos de Uso e Política de Privacidade

Escolha uma das opções e acesse esse e outros materiais sem bloqueio. 🤩

Cadastre-se ou realize login

Ao continuar, você aceita os Termos de Uso e Política de Privacidade

Prévia do material em texto

Integração da equipe de Devs com o 
Git
Apresentação
O trabalho em equipe no desenvolvimento de aplicações é uma realidade cada vez mais presente 
no mundo corporativo, mesmo em cenários em que o profissional trabalha remotamente. É muito 
comum que o profissional seja responsável por parte de um código, uma função, uma tela, um 
microsserviço ou um módulo. Nesse cenário de colaboração, é necessário dominar as boas 
práticas de trabalho com o Git, para diminuir as chances de conflito, e saber como lidar com os 
conflitos que podem ocorrer quando seu trabalho se juntar ao de outros profissionais.
Nesta Unidade de Aprendizagem, você vai aprender a trabalhar em equipe com o Git, fazendo uso 
de um fluxo de trabalho adotado amplamente por equipes no mundo todo: o Gitflow. Também vai 
aprender como o código-fonte que está desenvolvendo será versionado, além de lidar com 
situações de conflito ao juntar seu código ao de outros desenvolvedores.
Bons estudos.
Ao final desta Unidade de Aprendizagem, você deve apresentar os seguintes aprendizados:
Identificar a estratégia de organização do versionamento do código-fonte por meio do 
Gitflow.
•
Ilustrar o método de trabalho conjunto de uma equipe com o versionamento de código-fonte. •
Demonstrar a resolução de conflitos de versionamento.•
Desafio
O Gitflow foi proposto por Vincent Driessen em 2010 como uma estratégia de ramificação e um 
modelo de versionamento de projetos e tem sido amplamente adotado por equipes de usam o Git. 
A imagem a seguir resume a estratégia de ramificação do Gitflow:
Aponte a câmera para o código e acesse o link do conteúdo ou clique no código para 
acessar.
A adoção do padrão proposto pelo Gitflow visa à melhora da qualidade do trabalho de codificação, 
mas não isenta um desenvolvedor dos conflitos de versionamento.
Imagine que você trabalha em uma equipe de desenvolvedores de sistemas juntamente com outros 
dois desenvolvedores, DEV_A e DEV_B. Juntos, vocês fazem parte de uma equipe internacional de 
desenvolvedores.
Neste momento, vocês estão trabalhando em uma nova implementação, chamada feature-15. Cada 
desenvolvedor de sua equipe é responsável por codificar sua parte em seu repositório local do Git, 
seguindo o padrão do Gitflow.
O desenvolvedor DEV_B parece estar com problemas em sua tarefa, e você precisa ajudá-lo.
Observe as instruções que o desenvolvedor DEV_B está executando:
https://statics-marketplace.plataforma.grupoa.education/sagah/5cfa6573-14ad-4e62-8d40-05aeb0d6794b/f843f2ea-9872-47a7-a032-0f9fccb4c1fc.png
Aponte a câmera para o código e acesse o link do conteúdo ou clique no código para acessar.
https://statics-marketplace.plataforma.grupoa.education/sagah/5cfa6573-14ad-4e62-8d40-05aeb0d6794b/a9b30f22-5ee7-437a-bc95-20fcf7cbb8a2.png
Com base nas saídas dos comandos emitidos pelo desenvolvedor DEV_B:
a) identifique qual cuidado ele poderia ter tomado para evitar esse conflito;
b) proponha uma solução para ajudá-lo a resolver esse conflito de versionamento.
Infográfico
O trabalho de um desenvolvedor é parte essencial no fluxo de produção de um software. O 
Gitflow conduzirá as etapas de versionamento para garantir a colaboração entre as equipes 
envolvidas no processo de produção.
Acompanhe, no Infográfico, a estratégia de ramificação do Gitflow.
Conteúdo interativo disponível na plataforma de ensino!
Conteúdo do Livro
O trabalho de desenvolvimento e versionamento de código é facilitado com o uso do sistema de 
controle de versionamento distribuído Git. Seu modelo de controle de versionamento incentiva o 
trabalho em equipe, mas não oferece um fluxo que organize o trabalho cooperativo dos 
desenvolvedores. A estratégia de ramificação e o modelo de gerenciamento de versão do Gitflow 
apresentam um modelo de trabalho produtivo para equipes de desenvolvedores, estejam eles no 
mesmo departamento ou em continentes diferentes.
No capítulo Integração da equipe de Devs com o Git, da obra DevOps, base teórica desta Unidade 
de Aprendizagem, você vai compreender como adotar o Gitflow em seus projetos.
Boa leitura.
DEVOPS
Renê de Ávila Mendes
Integração da equipe 
de Devs com o Git
Objetivos de aprendizagem
Ao final deste texto, você deve apresentar os seguintes aprendizados:
 � Identificar a estratégia de organização do versionamento do código-
-fonte por meio do Gitflow.
 � Ilustrar o método de trabalho conjunto de uma equipe com o versio-
namento de código-fonte.
 � Demonstrar a resolução de conflitos de versionamento.
Introdução
A realidade de trabalho de um desenvolvedor de software requer cons-
tante cooperação, seja com profissionais de infraestrutura e de projeto, 
seja com seus pares de desenvolvimento. São comuns as situações em 
que um desenvolvedor é contratado para atuar em uma equipe que está 
fisicamente separada, exigindo desse profissional que seu código-fonte 
se encaixe perfeitamente ao dos demais desenvolvedores, como se todos 
estivessem trabalhando lado a lado.
Neste capítulo, você verá como organizar a estrutura de versiona-
mento do código-fonte de uma aplicação. Além disso, verá como uma 
equipe de trabalho pode atuar nessa estrutura. Por fim, conhecerá os 
principais problemas que podem ocorrer no versionamento de código-
-fonte quando se trabalha em equipe. 
1 Gitflow: organizando o versionamento de 
código-fonte
O desenvolvimento de um software, de um website ou mesmo de uma aplicação 
para smartphones é uma atividade complexa, pois envolve pessoas, tecnologias 
e processos. Ao mesmo tempo que cria oportunidades para o surgimento de 
novos sistemas e aplicativos, o avanço da ciência computacional aumenta a 
variedade de linguagens e de tecnologias envolvidas no desenvolvimento 
desses sistemas.
Metodologias de desenvolvimento de software começaram a surgir na 
década de 1960 para estruturar o desenvolvimento de software, organizando 
a formação do time de desenvolvimento, o planejamento e a execução da 
fase de desenvolvimento, bem como a organização da comunicação entre os 
desenvolvedores e com os times externos. Dependendo da metodologia apli-
cada no desenvolvimento de um software, a quantidade e os nomes das etapas 
podem variar, mas ainda assim seguirão uma sequência lógica e organizada. 
Em um contexto de desenvolvimento de aplicações, é provável se deparar com 
nomes como metodologia em cascata, metodologia de prototipação, desenvol-
vimento rápido, DSDM (dynamic system development model; ou metodologia 
de desenvolvimento de sistemas dinâmicos, em português), metodologia ágil, 
modelo em espiral, XP (extreme programming; ou programação extrema, em 
português), RUP (rational unified process; ou processe unificado rational), 
Scrum, Lean, entre outros (WAZLAWICK, 2013). 
No entanto, em todas as metodologias, é comum a preocupação com o 
desenvolvimento e a integração do código-fonte, gerado por equipes que podem 
estar em um mesmo departamento ou até mesmo em continentes diferentes. 
A metodologia de desenvolvimento de software adotada organiza o que será 
desenvolvido e quando será desenvolvido. Mas como desenvolver uma apli-
cação em equipe sem que seu trabalho sobreponha o do seu par, cumprindo 
os prazos e os objetivos da entrega?
O sistema de controle de versionamento distribuído Git fornece recursos 
tecnológicos que permitem a codificação e o versionamento por equipes; 
no entanto, por si só, ele não garante a organização do trabalho dessas equipes. 
Assim, faz-se necessário um fluxo de trabalho simples, bem estabelecido e que 
seja facilmente compreendido pela equipe de desenvolvimento. Além disso, 
esse fluxo deve atender às demandas por integração contínua, presentes nas 
práticas DevOps (MUNIZ et al., 2020). 
Integração da equipe de Devs com o Git2
Controlando versões no processo de 
integração contínua
O processo de integração contínua é fundamental na filosofia DevOps, e pode 
ser entendido como a prática de submeter pequenas peças de código para o uso 
em produção. A ideia da integração contínua é parte dametodologia de de-
senvolvimento XP, proposta inicialmente por Kent Beck (COPELAND, 2001).
 No processo de integração contínua, os códigos desenvolvidos individual e 
localmente por cada desenvolvedor são testados automaticamente e validados 
antes de serem disponibilizados para o uso. Esse processo de integração requer 
liberações de código com frequências diárias, a fim de evitar grandes pacotes 
de atualização que causem maiores impactos na aplicação e que requeiram 
uma grande janela de tempo para a sua implantação em produção. 
Segundo Muniz et al. (2020), existem três conceitos principais do processo 
de integração de versões:
 � Linha principal, trunk ou master: local onde ficará armazenado o 
código principal da aplicação, a ser posteriormente disponibilizado 
para produção.
 � Ramificação (branching): os ramos (branchs) são as cópias do trunk 
em um determinado momento, os quais permitem que linhas indepen-
dentes de desenvolvimento sejam mantidas e, posteriormente, fundidas 
(merging) com a linha principal.
 � Marcação (tagging): o estado de um código deve ser identificado por 
uma marca (tag), que geralmente identifica a versão do código. Por 
exemplo: a tag v1.1.14.
A Figura 1, a seguir, ilustra o controle de versionamento de um código.
Ao concluir um desenvolvimento realizado em um ramo (branch), um de-
senvolvedor precisará integrá-lo ao restante do código. Esse processo consiste 
na sincronização das modificações realizadas em um determinado ramo com 
o código fonte do ramo principal. Essa ação é chamada de fusão, integração 
ou merge, e é muito comum em projetos com muitos branches. 
A complexidade do processo de merge dependerá, entre outras variáveis, 
do tempo que o código não está sendo integrado ao ramo principal. A quanti-
dade de alterações sendo simultaneamente desenvolvidas, em ramos distintos, 
aumentará a complexidade do processo de merge, com a ocorrência de conflitos 
de versionamento e a possibilidade da introdução de bugs (MUNIZ et al., 2020). 
3Integração da equipe de Devs com o Git
Figura 1. Controle de versionamento, com destaque para master, branches e tag. 
Fonte: Adaptada de Muniz et al. (2020). 
Últimos ajustesmaster
novo-branch
hot�x/1.0.1 1.0.1
1.0.0
Continuação desenvolvimento...
Tentando resolver problema 1.0.1
Melhorias para a próxima versão
Primeira versão para reprodução
Primeiro commit
Bug 1.0.0 �nalmente resolvido
Commit de um novo branch em paralelo
O modelo Gitflow
Para responder ao questionamento de como desenvolver em equipe com o 
Git, Driessen (2010) apresentou uma estratégia de ramificação (branching) 
e um modelo de gerenciamento de versão, chamado posteriormente de Gitflow, 
amplamente adotado por equipes locais ou distribuídas. O Gitflow baseia-
-se nos conceitos de repositório, ramificação (branching) e fusão (merging) 
apresentados no Git (CHACON; STRAUB, 2014), definindo uma convenção 
para nomes de ramos (branchs) e estabelecendo regras para a ramificação e a 
fusão entre eles. O Quadro 1, a seguir, apresenta os tipos de ramos e as regras 
definidas no Gitflow.
Integração da equipe de Devs com o Git4
Ra
m
os
 
m
a
s
t
e
r
h
o
t
f
i
x
r
e
l
e
a
s
e
d
e
v
e
l
o
p
f
e
a
t
u
r
e
Em
 q
ua
l r
ep
os
itó
-
rio
 e
st
á
or
ig
in
 (c
en
tr
al
)
 lo
ca
l
or
ig
in
 (c
en
tr
al
)
or
ig
in
 (c
en
tr
al
)
Lo
ca
l
O
 q
ue
 c
on
té
m
O
 q
ue
 e
st
á 
em
 
pr
od
uç
ão
. T
am
-
bé
m
 c
on
he
ci
do
 
po
r t
ro
nc
o 
(tr
un
k)
Co
rr
eç
ão
 d
e 
um
 b
ug
 
cr
íti
co
, q
ue
 n
ão
 p
od
e 
es
pe
ra
r p
el
a 
pr
óx
im
a 
re
le
as
e
O
 q
ue
 ir
á 
pa
ra
 
pr
od
uç
ão
O
 q
ue
 ir
á 
pa
ra
 a
 
pr
óx
im
a 
re
le
as
e
U
m
a 
no
va
 
im
pl
em
en
ta
çã
o,
 p
ar
a 
a 
pr
óx
im
a 
ou
 p
ar
a 
um
a 
re
le
as
e 
fu
tu
ra
Pa
dr
ão
 d
e 
no
m
e
–
h
o
t
f
i
x
-
*
r
e
l
e
a
s
e
-
*
–
Li
vr
e,
 e
xc
et
o 
m
a
s
t
e
r
, d
e
v
e
l
o
p
, 
r
e
l
e
a
s
e
-
*
, 
h
o
t
f
i
x
-
*
Te
m
po
 d
e 
vi
da
In
fin
ito
At
é 
qu
e 
es
te
ja
 p
ro
nt
o 
pa
ra
 s
er
 li
be
ra
do
 p
ar
a 
pr
od
uç
ão
At
é 
qu
e 
es
te
ja
 p
ro
nt
o 
pa
ra
 s
er
 li
be
ra
do
 p
ar
a 
pr
od
uç
ão
In
fin
ito
En
qu
an
to
 e
st
iv
er
 e
m
 
de
se
nv
ol
vi
m
en
to
Po
de
 s
e 
ra
m
ifi
ca
r 
do
 ra
m
o
– 
m
a
s
t
e
r
d
e
v
e
l
o
p
m
a
s
t
e
r
d
e
v
e
l
o
p
Q
ua
dr
o 
1.
 T
ip
os
 d
e 
ra
m
os
 e
 re
gr
as
 e
st
ab
el
ec
id
as
 n
o 
G
itf
lo
w
(C
on
tin
ua
)
5Integração da equipe de Devs com o Git
Fo
nt
e:
 A
da
pt
ad
o 
de
 D
rie
ss
en
 (2
01
0)
.
Ra
m
os
 
m
a
s
t
e
r
h
o
t
f
i
x
r
e
l
e
a
s
e
d
e
v
e
l
o
p
f
e
a
t
u
r
e
Po
de
 s
er
 fu
nd
id
o 
co
m
 o
 ra
m
o
–
m
a
s
t
e
r
, d
e
v
e
l
o
p
 e
 
r
e
l
e
a
s
e
m
a
s
t
e
r
 e
 d
e
v
e
l
o
p
f
e
a
t
u
r
e
, 
d
e
v
e
l
o
p
 e
 
r
e
l
e
a
s
e
d
e
v
e
l
o
p
Ex
em
pl
o 
de
 ta
g
1.1
.14
1.1
.15
1.
2
–
–
O
bs
er
va
çã
o
Ca
da
 fu
sã
o 
ge
ra
rá
 
um
a 
no
va
 v
er
sã
o
D
ev
e 
se
r f
un
di
do
 p
rim
ei
ro
 
co
m
 m
a
s
t
e
r
 e
, e
nt
ão
, 
co
m
 d
e
v
e
l
o
p
D
ev
e 
se
r f
un
di
do
 
pr
im
ei
ro
 c
om
 
m
a
s
t
e
r
 e
, e
nt
ão
, c
om
 
d
e
v
e
l
o
p
–
U
m
 ra
m
o 
pa
ra
 c
ad
a 
no
va
 im
pl
em
en
ta
çã
o 
(fe
at
ur
e)
Q
ua
dr
o 
1.
 T
ip
os
 d
e 
ra
m
os
 e
 re
gr
as
 e
st
ab
el
ec
id
as
 n
o 
G
itf
lo
w
(C
on
tin
ua
çã
o)
Integração da equipe de Devs com o Git6
2 Trabalhando em equipe: versionando 
o código-fonte
Após conhecer os tipos de ramos e as regras que limitam o seu uso, pode-se 
pensar em como o desenvolvimento do código-fonte se organiza no Gitflow. 
Os tipos de ramos apresentados no Quadro 1 não são diferentes ou especiais, 
mas se diferenciam pela forma como são utilizados. A seguir, cada tipo de 
ramo é apresentado em mais detalhes.
Ramos fundamentais
No padrão Gitflow, os ramos fundamentais são apenas dois: master e de-
velop. O ramo master existe apenas no repositório central, identificado 
por origin (consulte o comando git remote, na documentação do Git), 
e sempre conterá o código-fonte que foi liberado para uso em produção. 
A versão disponível no ramo master é necessariamente identificada por uma 
tag, que define em qual versão (release) o código-fonte está. Por exemplo, 
a release do código-fonte do ramo master pode ser 1.1.14. Sempre que o 
ramo master for fundido com mudanças que vierem dos ramos release 
ou hotfix, a sua versão necessariamente deverá ser alterada. Por exemplo, 
a versão do ramo master é alterada para 1.1.15 ao receber um hotfix, ao passo 
que é alterada para 1.2 ao receber a release identificada por release-1.2.
O ramo develop, por sua vez, é criado inicialmente como um ramo 
(branch) do ramo master, e receberá daí em diante os códigos-fonte dos 
desenvolvimentos e as correções dos bugs que forem produzidos nos ramos 
feature. Todas as implementações e correções de bug que estiverem no 
ramo develop farão parte da próxima release a ser liberada para produção.
O ramo develop é limpo após o seu conteúdo ser liberado para o ramo 
release, e não receberá códigos-fonte dos ramos feature até que o conte-
údo do ramo release seja liberado para produção, isto é, seja fundido com o 
ramo master. É importante ressaltar que, antes de começar a receber as novas 
implementações e correções de bug, o ramo develop deve receber (merge) 
o conteúdo do ramo release, para que as implementações que acabaram 
de ser liberadas para produção se reflitam nos próximos desenvolvimentos e 
correções de bug (DRIESSEN, 2010).
7Integração da equipe de Devs com o Git
Para adotar o Gitflow, comece pela criação do ramo develop, a partir do ramo 
master, no repositório origin:
$ git checkout -b develop master
Switched to a new branch 'develop'
Ramo feature
É um tipo de ramo criado a partir do ramo develop, com a finalidade especí-
fica de receber o desenvolvimento de uma nova funcionalidade para o software 
ou aplicação, a ser incorporadaà próxima versão (release) específica, ou a uma 
versão futura. Esse tipo de ramo é utilizado também para o desenvolvimento 
de correções de erros (bugs) previamente documentados, cuja liberação para 
produção possa ocorrer em uma release futura (DRIESSEN, 2010).
Uma característica que diferencia o ramo feature dos demais é o fato 
de que podem existir diversos ramos desse tipo simultaneamente, um para 
cada nova funcionalidade ou para cada bug a ser corrigido. Cada ramo recebe 
o código-fonte sendo produzido por um desenvolvedor ou por uma equipe de 
desenvolvedores. O nome do ramo deve seguir um padrão de nomenclatura 
que identifique unicamente a funcionalidade ou bug, e jamais pode receber 
o nome dos ramos fundamentais (master e develop) ou adotar o nome 
de uma release ou de um hotfix. Por exemplo, um ramo (branch) do tipo 
feature pode ter o nome feature-7, ao passo que outro ramo pode se 
chamar bug-10.
Se uma equipe de desenvolvedores trabalhar na mesma funcionalidade ou no mesmo 
bug, os desenvolvedores devem configurar seu Git para apontar para o repositório de 
seus pares, a fim de acompanhar o desenvolvimento. 
Integração da equipe de Devs com o Git8
Um ramo do tipo feature durará enquanto a funcionalidade ou correção 
de bug estiver em desenvolvimento, sendo excluído após ser fundido com o 
ramo develop ou se for rejeitado por ser reprovado em testes (DRIESSEN, 
2010).
Ramo release
Assim como os ramos do tipo feature, os ramos do tipo release são 
criados a partir do ramo develop, mas com finalidade e efeitos diferentes. 
Ao contrário de um ramo feature, um ramo release é um tipo de ramo 
utilizado especificamente para preparar uma nova versão da aplicação ou do 
software a ser liberada para produção (DRIESSEN, 2010).
Quando um ramo do tipo release é criado, ele recebe uma tag que 
identifica a sua versão (release). No momento de criação desse ramo, 
o ramo develop deve ser limpo, para que não receba novas funcionalidades. 
As funcionalidades ou correções de bug que ainda estejam em desenvolvimento 
e que não fazem parte do ramo release atual devem aguardar a liberação 
do ramo develop.
O ramo release é identificado pelo padrão release-*, em que o * 
corresponde à sua versão, a mesma atribuída pela tag. Por exemplo, um ramo 
do tipo release pode ser criado com o nome release-1.2 e receber a 
tag v1.2. O ramo release é excluído após ser fundido aos ramos master 
e develop, para que futuros desenvolvimentos incluam o que já foi liberado 
para produção.
Ramo hotfix
Criado exclusivamente a partir do ramo master, esse tipo de ramo não é 
planejado, pois é criado para conter código-fonte de correção de um bug crítico 
do software que está em produção. Um bug crítico em produção não pode 
esperar a liberação de um novo release, pois requer ação de correção imediata.
De maneira semelhante a um ramo do tipo feature, mais de um ramo 
de hotfix pode ser criado simultaneamente, cada um para conter códigos-
-fonte em desenvolvimento para a correção de um bug crítico específico. Para 
diferenciar entre os ramos do tipo hotfix, adota-se o padrão de nomenclatura 
hotfix-*, identificando unicamente o hotfix. Por exemplo, um ramo hotfix 
pode se chamar hotfix-05.
9Integração da equipe de Devs com o Git
O ramo hotfix é excluído após ser fundido (merge) aos ramos master 
e develop, para garantir que a correção esteja também na próxima release 
(DRIESSEN, 2010).
Quando um ramo release é fundido ao ramo master, um novo commit é gerado 
no ramo master, e uma tag de versão é atribuída a ele:
$ git checkout master
Switched to branch 'master'
$ git merge --no-ff release-1.1
Merge made by the 'recursive' strategy.
 arquivo3.c | 0
 1 file changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 arquivo3.c
$ git tag -a v1.1 -m "Versao v1.1"
3 Trabalhando em equipe: resolvendo conflitos
O desenvolvedor deverá adotar alguns cuidados ao trabalhar em equipe, 
os quais, quando respeitados, diminuirão a chance de problemas com seus pares 
de desenvolvimento. Como boas práticas de versionamento, o desenvolvedor 
deve (CHACON; STRAUB, 2014):
 � Garantir que suas submissões não contenham erros de espaço em branco 
(trailing whitespace). Esses erros ocorrem quando o código-fonte contém 
linhas compostas apenas de espaços em branco, ou quando a indentação 
de uma linha contém um espaço em branco antes de um caractere TAB. 
Assim, deve-se utilizar o comando git diff --check antes de 
um comando commit para identificar a presença de erros de espaço 
em branco.
Integração da equipe de Devs com o Git10
 � Garantir que cada commit contenha uma unidade logicamente separá-
vel, isto é, contenha apenas uma nova funcionalidade ou apenas uma 
correção de bug.
 � Adotar o hábito de incluir mensagens de qualidade para um commit. 
Recomenda-se que a mensagem inicie com uma linha de, no máximo, 
50 caracteres que descreva a implementação de maneira concisa, 
seguida por uma linha em branco e, então, por um texto mais completo 
sobre a implementação. Nesse texto, deve-se incluir a motivação para o 
desenvolvimento e descrever em que essa implementação se diferencia 
da anterior.
A adoção de boas práticas de versionamento melhora o relacionamento entre 
os desenvolvedores e aumenta a qualidade do trabalho, mas não os poupa dos 
conflitos de versionamento. Esse tipo de conflito ocorrerá frequentemente ao 
se submeter um objeto a um repositório compartilhado (origin ou repositório 
do par) ou ao se fundir (merge) um desenvolvimento a um ramo.
Fowler (2006) já apontava para a ocorrência de conflitos de versão de 
código-fonte ao apresentar seus princípios de integração contínua. O autor não 
somente cita a possibilidade desses conflitos, mas também delineia o método 
a ser utilizado no Git em caso de conflitos:
Com uma boa compilação, posso pensar em confirmar minhas alterações no 
repositório. A reviravolta, é claro, é que outras pessoas podem, e geralmente 
fizeram, alterações na linha principal antes que eu tenha chance de confir-
mar. Então, primeiro atualizo minha cópia de trabalho com as alterações e 
reconstruo. Se as alterações deles colidirem com as minhas alterações, ele 
se manifestará como uma falha na compilação ou nos testes. Nesse caso, 
é minha responsabilidade corrigir isso e repetir até que eu possa criar uma 
cópia de trabalho que esteja sincronizada corretamente com a linha principal. 
(FOWLER, 2006, documento on-line).
Para ilustrar o procedimento básico de resolução de conflitos de versio-
namento, confira, a seguir, a adaptação de um dos cenários propostos por 
Chacon e Straub (2014).
11Integração da equipe de Devs com o Git
Exemplo 1
Nesse cenário, dois desenvolvedores, DEV_A e DEV_B, trabalharão separada-
mente no desenvolvimento de uma nova implementação, seguindo o padrão do 
Gitflow. Essa nova implementação requererá a inclusão de dois novos arquivos 
e receberá o nome de feature-15. Cada arquivo dessa implementação será 
codificado por um desenvolvedor em seu repositório local do Git. Observe que, 
inicialmente, cada desenvolvedor clonará para a sua máquina (DEV_A_LOCAL 
e DEV_B_LOCAL) o repositório central (REPOSITORIO): 
DEV _ A -------------------------------------
$ git clone REPOSITORIO DEV _ A _ LOCAL
Cloning into 'DEV _ A _ LOCAL'...
done.
DEV _ B -------------------------------------
$ git clone REPOSITORIO DEV _ B _ LOCAL
Cloning into 'DEV _ B _ LOCAL'...
done.
Ao clonar o repositório central, o ramo develop também foi clonado, 
incluindo todos os arquivos que faziam parte desse ramo no momento do clone. 
Os arquivos que foram clonados do ramo develop do repositório central 
devem existir também no ramo develop do repositório local do desenvolve-
dor, para que ele possa codificar e testar a sua parte da nova funcionalidade. 
No próximo passo, o desenvolvedor A (DEV_A) criará um novo ramo a 
partir do ramo local develop, para, então, codificar a sua parte da nova 
implementação, que consistirá no arquivo arquivo2.c. Confira esses passos 
a seguir:$ git branch feature-15
$ git checkout feature-15
Switched to branch 'feature-15'
$ vi arquivo2.c
$ git add arquivo2.c
warning: LF will be replaced by CRLF in arquivo2.c.
Integração da equipe de Devs com o Git12
The file will have its original line endings in your working 
directory
$ git commit -a -m "feature-15 - adiciona arquivo2.c"
[feature-15 c87847f] feature-15 - adiciona arquivo2.c
 1 file changed, 1 insertion(+) create mode 100644 arquivo2.c
Observe que, após criar a sua parte da nova implementação, o desenvolvedor 
A (DEV_A) adiciona o novo arquivo ao Git (git add) e cria um novo commit. 
Da mesma forma, o desenvolvedor B (DEV_B) trabalhará em sua parte da 
implementação, criando um arquivo com seu código-fonte (arquivo3.c). 
Para isso, o desenvolvedor criará um ramo a partir do ramo develop do seu 
repositório local e, então, criará e adicionará (git add) o novo arquivo ao 
repositório Git. Confira esses passos a seguir:
$ git branch feature-15
$ git checkout feature-15
Switched to branch 'feature-15'
$ vi arquivo3.c
$ git add arquivo3.c
warning: LF will be replaced by CRLF in arquivo3.c.
The file will have its original line endings in your working 
directory
$ git commit -a -m "feature-15 - adiciona arquivo3.c"
[feature-15 aa12e87] feature-15 - adiciona arquivo3.c
 1 file changed, 1 insertion(+)
 create mode 100644 arquivo3.c
$ git checkout develop
Switched to branch 'develop'
Your branch is up to date with 'origin/develop'.
$ git merge feature-15
Updating 845cfd9..aa12e87
Fast-forward
13Integração da equipe de Devs com o Git
 arquivo3.c | 1 +
 1 file changed, 1 insertion(+)
 create mode 100644 arquivo3.c
$ git push origin develop
Enumerating objects: 4, done.
Counting objects: 100% (4/4), done.
Delta compression using up to 4 threads
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 333 bytes | 333.00 KiB/s, done.
Total 3 (delta 0), reused 0 (delta 0), pack-reused 0
To /REPOSITORIO
 845cfd9..aa12e87 develop -> develop
Observe que, após fazer o commit do que foi desenvolvido, o desenvolve-
dor B faz o check out para o ramo develop local e funde (merge) o ramo 
feature-15 ao ramo develop. Então, a sua versão do ramo develop é 
movida (push) para o ramo develop do repositório central (representado pela 
conexão remota origin). Essa ação finaliza a atividade de desenvolvimento 
do desenvolvedor B.
Quando o desenvolvedor A considera o seu desenvolvimento concluído, 
ele segue os mesmos passos do desenvolvedor B: faz o check out para o ramo 
develop local e funde (merge) o ramo feature-15 ao ramo develop. 
Confira, a seguir, essa ação e observe atentamente o que ocorrerá ao tentar 
mover (push) o ramo develop para o repositório central:
$ git checkout develop
Switched to branch 'develop'
Your branch is up to date with 'origin/develop'.
$ git merge feature-15
Updating 845cfd9..c87847f
Fast-forward
 arquivo2.c | 1 +
 1 file changed, 1 insertion(+)
 create mode 100644 arquivo2.c
$ git push origin develop
To /REPOSITORIO
Integração da equipe de Devs com o Git14
 ! [rejected] develop -> develop (fetch first)
error: failed to push some refs to '/REPOSITORIO'
hint: Updates were rejected because the remote contains work 
that you do
hint: not have locally. This is usually caused by another re-
pository pushing
hint: to the same ref. You may want to first integrate the 
remote changes
hint: (e.g., 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' 
for details.
Quando o desenvolvedor A tentou mover (push) o seu ramo develop para 
o repositório central, a sua ação foi rejeitada. Essa situação ocorreu porque o 
ramo develop do repositório central contém objetos que não foram encon-
trados no ramo develop do repositório local do desenvolvedor A (observe 
os hints apresentados abaixo do retorno de rejeição do push). 
Uma das ações que o desenvolvedor A pode tomar é baixar os objetos do 
ramo develop do repositório central que não estejam no ramo develop de 
seu repositório local. Uma vez que estejam em seu ramo develop local, os 
objetos novos devem ser analisados e, se não prejudicarem o arquivo produzido 
pelo desenvolvedor A, incorporados (merge) ao ramo develop local. Confira 
essas ações a seguir:
$ git fetch origin
remote: Enumerating objects: 4, done.
remote: Counting objects: 100% (4/4), done.
remote: Compressing objects: 100% (2/2), done.
remote: Total 3 (delta 0), reused 0 (delta 0), pack-reused 0
Unpacking objects: 100% (3/3), 313 bytes | 2.00 KiB/s, done.
From /REPOSITORIO
 845cfd9..aa12e87 develop -> origin/develop
$ git merge origin/develop
Merge made by the 'recursive' strategy.
 arquivo3.c | 1 +
 1 file changed, 1 insertion(+)
 create mode 100644 arquivo3.c
15Integração da equipe de Devs com o Git
$ git push origin develop
Enumerating objects: 7, done.
Counting objects: 100% (7/7), done.
Delta compression using up to 4 threads
Compressing objects: 100% (4/4), done.
Writing objects: 100% (5/5), 522 bytes | 522.00 KiB/s, done.
Total 5 (delta 2), reused 0 (delta 0), pack-reused 0
To /REPOSITORIO
 aa12e87..3c7cbb2 develop -> develop
Com essa ação, o desenvolvedor A pode considerar o seu trabalho concluído.
Fowler (2020) propõe uma série de padrões para grupos de desenvolvedores criarem 
ramos que possam ser melhor integrados e organizados.
Ao aprender a trabalhar com o Gitflow, a produzir e versionar corretamente 
o seu código-fonte e a lidar com os conflitos na publicação de código-fonte, se 
estará preparado para atender ao requisito de integração contínua do DevOps.
CHACON, S.; STRAUB, B. Pro Git: everything you need to know about git. 2nd. ed. New 
York: Apress, 2014.
COPELAND, L. Extreme programming. In: COMPUTERWORLD. [S. l.: s. n.], 2001. Disponível 
em: https://www.computerworld.com/article/2585634/extreme-programming.html. 
Acesso em: 11 ago. 2020.
DRIESSEN, V. A successful Git branching model. In: NVIE. [S. l.: s. n.], 2010. Disponível em: 
http://nvie.com/posts/a-successful-git-branching-model. Acesso em: 12 ago. 2020.
FOWLER, M. Continuous integration. In: MARTIN FOWLER. [S. l.: s. n.], 2006. Disponível em: 
https://martinfowler.com/articles/continuousIntegration.html. Acesso em: 12 ago. 2020.
Integração da equipe de Devs com o Git16
Os links para sites da web fornecidos neste capítulo foram todos testados, e seu fun-
cionamento foi comprovado no momento da publicação do material. No entanto, a 
rede é extremamente dinâmica; suas páginas estão constantemente mudando de 
local e conteúdo. Assim, os editores declaram não ter qualquer responsabilidade 
sobre qualidade, precisão ou integralidade das informações referidas em tais links.
FOWLER, M. Patterns for Managing Source Code Branches. In: MARTIN FOWLER. [S. l.: 
s. n.], 2020. Disponível em: https://martinfowler.com/articles/branching-patterns.html. 
Acesso em: 12 ago. 2020.
MUNIZ, A. et al. Jornada DevOps: unindo cultura ágil, Lean e tecnologia para entregar 
software com qualidade. 2. ed. Rio de Janeiro: Brasport, 2020.
WAZLAWICK, R. Engenharia de software: conceitos e práticas. Rio de Janeiro: Elsevier, 2013.
17Integração da equipe de Devs com o Git
Dica do Professor
O Git é um sistema distribuído de controle de versionamento muito aplicado por desenvolvedores 
do mundo todo. No entanto, sua aplicação vai além do desenvolvimento de código-fonte. Quando 
aliado à estratégia de ramificação do Gitflow e à presença mundial do Github, a gestão de 
versionamento pode ser aplicada a praticamente qualquer produção técnica.
Nesta Dica do Professor, veja um exemplo de como usar o potencial dessas ferramentas para 
controlar versionamentos de outros tipos de arquivos. 
Aponte a câmera para o código e acesse o link do conteúdo ou clique no código para acessar.
https://fast.player.liquidplatform.com/pApiv2/embed/cee29914fad5b594d8f5918df1e801fd/60afa69263c0b3cf5ea8154a9d7ba446
Exercícios
1) O Gitflow apresenta uma estratégia deramificação (branching) e um modelo de 
gerenciamento de versão. 
Com relação à estratégia de ramificação do Gitflow, é correto afirmar que:
A) o ramo master do repositório central conterá as implementações que ainda serão testadas.
B) as correções de bugs críticos devem aguardar a liberação de uma nova release para seguirem 
para produção.
C) novas implementações e correções de bugs ainda em desenvolvimento estão no ramo 
develop.
D) o ramo feature não deve ser usado para correções de bugs não críticos.
E) mais de um ramo hotfix pode existir ao mesmo tempo.
2) O modelo de gerenciamento de versão no Gitflow propõe a duração da existência de cada 
ramo. 
Com relação à duração da existência dos ramos no Gitflow, é correto afirmar que:
A) o ramo feature é excluído após a implementação ou correção de bugs se fundir ao ramo 
develop.
B) o ramo develop é excluído quando seu conteúdo é liberado para o ramo release.
C) o ramo release é mantido para receber as implementações da próxima release.
D) o ramo master é o único que sempre existe.
E) o ramo hotfix deve ser mantido para o caso de haver uma correção no ramo master.
3) O modelo de gerenciamento de versão proposto no Gitflow é aplicado com o uso de 
instruções (comandos) do Git. 
Com relação ao modelo de gerenciamento de versão proposto no Gitflow e ao uso 
de instruções (comandos) Git na aplicação desse modelo, é correto afirmar que:
A) o comando git tag cria um novo ramo para uma nova release.
B) o comando git branch faz a fusão do ramo especificado no comando com o ramo do contexto 
atual.
C) um ramo do tipo feature é identificado por uma tag de versão.
D) em um modelo de trabalho em equipe, o repositório local do desenvolvedor armazena o ramo 
master central.
E) a versão do ramo master é alterada sempre que se funde com um ramo release ou hotfix.
4) Em um trabaho colaborativo com o Git, são comuns as ocorrências de conflitos de 
versionamento. 
A respeito dos conflitos de versionamento, é correto afirmar que:
A) boas práticas de versionamento evitam conflitos de versionamento.
B) os conflitos de versionamento ocorrem ao criar um novo ramo a partir do ramo master.
C) conflitos de versionamento podem ocorrer ao submeter um objeto a um repositório 
compartilhado.
D) a adoção do Gitflow elimina os conflitos de versionamento.
E) conflitos de versionamento podem ser corrigidos com a estratégia de ramificação proposta no 
Gitflow.
As instruções a seguir refletem a tentativa de um desenvolvedor de submeter seu 
desenvolvimento ao repositório central do Git:
5) 
Aponte a câmera para o código e acesse o link do conteúdo ou clique no código para acessar.
https://statics-marketplace.plataforma.grupoa.education/sagah/f4622065-7ab1-47f1-8cf5-119675734bf7/73059bc5-b824-4cd4-8a97-742ac8a84fc1.png
Quanto a essas instruções, é correto afirmar que:
A) a instrução git checkout verificou as pendências antes de enviar as modificações para o 
repositório remoto origin.
B) o arquivo "arquivo2.c" não estava no ramo develop do repositório local.
C) a instrução git push origin develop trouxe os objetos divergentes para o ramo develop local.
D) o arquivo "arquivo3.c" não estava no ramo develop do repositório local.
E) a instrução git merge origin/develop foi necessária para fundir a origem ao ramo develop.
Na prática
Uma das vantagens de um sistema de controle de versionamento distribuído, como o Git, é permitir 
o trabalho em um repositório local sem a necessidade de se estar conectado a um repositório 
central. Adotando o Gitflow como estratégia de ramificação e modelo de gerenciamento de versão, 
um desenvolvedor pode manter um ramo develop em sua máquina e desenvolver códigos-fonte de 
implementações ou correções de bug.
No entanto, o trabalho colaborativo requer que, em algum momento, os códigos-fonte produzidos 
por diferentes desenvolvedores de uma mesma equipe sejam compartilhados entre eles. Ao 
compartilhar suas implementações e correções de bug, um desenvolvedor permitirá que outro 
desenvolvedor adicione uma nova funcionalidade a seu código ou mesmo descubra uma falha.
Veja, Na Prática, como esse compartilhamento ocorre.
Aponte a câmera para o 
código e acesse o link do 
conteúdo ou clique no 
código para acessar.
https://statics-marketplace.plataforma.grupoa.education/sagah/9dc9bbce-5943-40f2-9426-18a73609591b/dcec5e84-711c-4de5-913d-d898b6c44edb.png
Saiba mais
Para ampliar o seu conhecimento a respeito desse assunto, veja abaixo as sugestões do professor:
Gerenciamento de configuração e mudança com Git + Eclipse
Acompanhe este minicurso sobre gerenciamento de configuração e mudança com Git e Eclipse, 
preparado por Jadson Santos e Amador Pahim, para saber como usar funcionalidades de gestão de 
versionamento do Git no Eclipse.
Aponte a câmera para o código e acesse o link do conteúdo ou clique no código para acessar.
Git-flow na prática (tutorial)
Assista a este vídeo de Anderson Almeida, que mostra uma aplicação prática do uso do git-flow.
Aponte a câmera para o código e acesse o link do conteúdo ou clique no código para acessar.
Cheatsheet do git-flow
Veja, neste cheatsheet, como usar as funções da extensão git-flow para o Git, que implementam o 
modelo de ramificação do Gitflow.
Aponte a câmera para o código e acesse o link do conteúdo ou clique no código para acessar.
http://publica.sagah.com.br/publicador/objects/attachment/1874900612/minicursogerenciamentodeconfiguracaoemudanca-iiiworkshopsinfoufrn.pdf?v=1155284929
https://www.youtube.com/embed/p1VAghNq-qg
https://danielkummer.github.io/git-flow-cheatsheet/index.pt_BR.html
Git, Gitflow, Github/GitLab explicados e aplicados
Acompanhe os passos de planejamento, projeto e implementação de uma aplicação seguindo 
práticas de DevOps.
Aponte a câmera para o código e acesse o link do conteúdo ou clique no código para acessar.
https://www.bdm.unb.br/bitstream/10483/21588/1/2018_LuanGuimaraesLacerda_tcc.pdf

Mais conteúdos dessa disciplina