{"id":5464,"date":"2022-08-10T11:06:34","date_gmt":"2022-08-10T14:06:34","guid":{"rendered":"https:\/\/elemarjr.com\/engenhariadesoftware\/?p=5464"},"modified":"2022-08-10T11:06:34","modified_gmt":"2022-08-10T14:06:34","slug":"git-flow","status":"publish","type":"post","link":"https:\/\/elemarjr.com\/livros\/engenhariadesoftware\/git-flow\/","title":{"rendered":"Colocando a &#8220;casa em ordem&#8221; com Git Flow"},"content":{"rendered":"<p><b>Os reposit\u00f3rios de c\u00f3digo-fonte dos sistemas que uma empresa desenvolve s\u00e3o o &#8220;cora\u00e7\u00e3o&#8221; da engenharia de software. <\/b><\/p>\n<p>Empresas maduras na\u00a0<em>capability\u00a0<\/em>de engenharia de software t\u00eam reposit\u00f3rios &#8220;saud\u00e1veis&#8221;, ou seja, que facilitam a implementa\u00e7\u00e3o \u00e1gil de mudan\u00e7as (implementa\u00e7\u00f5es e corre\u00e7\u00f5es) nos sistemas &#8211; com baixo <em>development lead-time<\/em> e alta frequ\u00eancia de <em>deploys\u00a0<\/em>&#8211; e facilitam a colabora\u00e7\u00e3o. Por outro lado, reposit\u00f3rios &#8220;doentes&#8221; dificultam a resolu\u00e7\u00e3o de problemas do dia-a-dia, sendo, inclusive, dif\u00edceis de monitorar, impedindo a ado\u00e7\u00e3o de pr\u00e1ticas reconhecidamente positivas, como\u00a0<em>continuous integration\u00a0<\/em>e\u00a0<em>continuous deployment.<\/em><\/p>\n<div class=\"card-insight\" style=\"background-color: #f0f0f0; width: 100%; padding: 35px 30px 20px 35px; border-radius: 5px 5px 5px 5px; margin-top: 30px; margin-bottom: 35px; font-size: 16px; box-shadow: 0px 4px 0px 0px #dddddd;\">\r\n<p style=\"font-size: 24px; font-weight:bold; line-height: 28px; font-family: Montserrat;\">Continuous Integration (CI), Continuous Delivery e Continuous Deployment (CD)<\/p>\r\n<\/p>\n<p><em>Continouous Integration<\/em> (CI) \u00e9 uma pr\u00e1tica de engenharia onde c\u00f3digo \u00e9 integrado em um reposit\u00f3rio compartilhado com maior frequ\u00eancia poss\u00edvel &#8211; de prefer\u00eancia v\u00e1rias vezes ao dia. Cada integra\u00e7\u00e3o geralmente \u00e9 verificada por compila\u00e7\u00e3o e testes automatizados.<\/p>\n<p><em>Continuous Delivery<\/em> \u00e9 uma extens\u00e3o da <em>Continuous Integration<\/em>, pois implanta automaticamente todas as altera\u00e7\u00f5es de c\u00f3digo em um ambiente de teste e\/ou produ\u00e7\u00e3o ap\u00f3s o est\u00e1gio de compila\u00e7\u00e3o.<\/p>\n<p>Finalmente, <em>Continuous Deployment\u00a0<\/em>(CD) vai um passo al\u00e9m da <em>Continuous Delivery<\/em>. Com essa pr\u00e1tica, toda mudan\u00e7a que passa por todas as etapas do seu <em>pipeline<\/em> de produ\u00e7\u00e3o \u00e9 liberada para seus clientes. N\u00e3o h\u00e1 interven\u00e7\u00e3o humana e apenas um teste com falha impedir\u00e1 que uma nova altera\u00e7\u00e3o seja implantada na produ\u00e7\u00e3o.<\/p>\n<p><\/div>\nReposit\u00f3rios &#8220;doentes&#8221; raramente s\u00e3o produtos de tecnologias ou ferramentas ruins. Na pr\u00e1tica, o que ocasiona problemas s\u00e3o a falta de pol\u00edticas claras e conduta indisciplinada.\n<hr \/>\n<p>Modernamente, a maioria das empresas utiliza alguma implementa\u00e7\u00e3o de <em>git\u00a0<\/em>como base tecnol\u00f3gica para controlar seus reposit\u00f3rios. Uma das abordagens mais efetivas para utilizar\u00a0<em>git\u00a0<\/em>do jeito certo \u00e9 o <em>git flow.<\/em><\/p>\n<div class=\"card-insight\" style=\"background-color: #f0f0f0; width: 100%; padding: 35px 30px 20px 35px; border-radius: 5px 5px 5px 5px; margin-top: 30px; margin-bottom: 35px; font-size: 16px; box-shadow: 0px 4px 0px 0px #dddddd;\">\r\n<p style=\"font-size: 24px; font-weight:bold; line-height: 28px; font-family: Montserrat;\">Git<\/p>\r\n<\/p>\n<p><b>Git<\/b> \u00a0\u00e9 um\u00a0sistema de controle de vers\u00f5es\u00a0distribu\u00eddo, usado principalmente no\u00a0desenvolvimento de software, mas pode ser usado para registrar o hist\u00f3rico de edi\u00e7\u00f5es de qualquer tipo de arquivo (Exemplo: alguns livros digitais s\u00e3o disponibilizados no\u00a0<a title=\"GitHub\" href=\"https:\/\/pt.wikipedia.org\/wiki\/GitHub\">GitHub<\/a>\u00a0e escrito aos poucos publicamente).<\/p>\n<p>O Git foi inicialmente projetado e desenvolvido por\u00a0<a title=\"Linus Torvalds\" href=\"https:\/\/pt.wikipedia.org\/wiki\/Linus_Torvalds\">Linus Torvalds<\/a>\u00a0para o desenvolvimento do\u00a0kernel do <em>Linux<\/em>, mas foi adotado por muitos outros projetos.<sup id=\"cite_ref-3\" class=\"reference\"><\/sup><\/p>\n<p><\/div>\n<h2>O que \u00e9 e quando usar &#8220;<em>Git flow&#8221;<\/em><\/h2>\n<p><strong>O <em>Git flow\u00a0<\/em>\u00e9 um &#8220;modelo opinativo&#8221; de trabalho para equipes de engenharia de software que utilizam <em>Git<\/em>.<\/strong> Ele foi idealizado por <a href=\"https:\/\/twitter.com\/nvie\" target=\"_blank\" rel=\"noopener\">Vincent Driessen<\/a> em 2010 e se destaca pela fluidez que adiciona ao processo para desenvolvimento de novas funcionalidades, corre\u00e7\u00f5es de <em>bugs\u00a0<\/em>e lan\u00e7amento de vers\u00f5es.<\/p>\n<div class=\"nota-livro\">\r\n<table class=\"tabelalivro\" style=\"width: 100%;\">\r\n<tbody>\r\n<tr>\r\n<td class=\"nota-contribuicao-1\" valign=\"top\"><img decoding=\"async\" class=\"img-insight img-contribuicao\" src=\"https:\/\/nvie.com\/img\/nvie-small@2x.jpg\" alt=\"\" width=\"150\" \/><\/td>\r\n<td class=\"nota-contribuicao-2\"><img decoding=\"async\" class=\"nota-img img-contribuicao\" src=\"https:\/\/nvie.com\/img\/nvie-small@2x.jpg\" alt=\"\" width=\"120\" \/>\r\n<p style=\"font-size: 22px; font-weight: bold; color: #4c4c4c; line-height: 1.1; font-family: Montserrat; margin-bottom: 10px;\">A successful Git branching model<\/p>\r\n<\/p>\n<p>Artigo original, escrito por <a href=\"https:\/\/twitter.com\/nvie\">Vincent Drissen<\/a> em 2010, onde ele prop\u00f5e o <em>git flow.\u00a0<\/em>Trata-s de uma excelente refer\u00eancia, detalhada e ilustrada, do modelo.<\/p>\n<p>\r\n<p><a class=\"botao-livro\" href=\"https:\/\/nvie.com\/posts\/a-successful-git-branching-model\/\" target=\"_blank\" rel=\"noopener\">Acessar artigo<\/a><\/p>\r\n<\/td>\r\n<\/tr>\r\n<\/tbody>\r\n<\/table>\r\n<\/div>\n<p>O modelo proposto por Drissen, segundo o pr\u00f3prio autor, \u00e9 ideal para projetos que utilizam versionamento sem\u00e2ntico ou quando times precisam suportar v\u00e1rias vers\u00f5es, em produ\u00e7\u00e3o, simultaneamente.<\/p>\n<div style=\"background-color: #f0eef4; width: 100%; padding: 35px 30px 20px 35px; border-radius: 5px 5px 5px 5px; margin-top: 30px; margin-bottom: 35px; font-size: 16px;\">\r\n<p style=\"font-size: 24px; font-weight: bold; line-height: 28px; font-family: Montserrat; color: #432b75;\">Defini\u00e7\u00e3o: Semantic versioning<\/p>\r\n<p style=\"font-size: 16px; font-weight: Regular; line-height: 20px; font-family: Roboto; color: #45365d;\"><\/p>\n<p>Semantic versioning \u00e9 uma estrat\u00e9gia para determina\u00e7\u00e3o de vers\u00f5es, utilizando n\u00fameros, em um esquema, <em>MAJOR<\/em>.<em>MINOR<\/em>.<em>PATCH<\/em>, onde deve-se incrementar o <em>major <\/em>quando as mudan\u00e7as implementadas geram incompatibilidade com vers\u00f5es anteriores, <em>minor <\/em>quando forem adicionadas funcionalidades mantendo a compatibilidade e, finalmente, <em>patch<\/em> quando h\u00e1 apenas corre\u00e7\u00e3o de falhas.<\/p>\n<p><\/p>\r\n<\/div>\n<h2>Como funciona o &#8220;<em>Git Flow<\/em>&#8220;<\/h2>\n<p><strong>O <em>Git Flow<\/em> trabalha com duas <em>branches<\/em> principais, a <em>Develop<\/em> e a <em>Main <\/em>(antigamente <em>Master<\/em>), que s\u00e3o mantidas no reposit\u00f3rio indefinidamente. Al\u00e9m delas recomenda-se manter uma <em>branch\u00a0<\/em>para cada\u00a0<em>release\u00a0<\/em>que se deseja disponibilizar.<\/strong><\/p>\n<p>A partir das <em>branches <\/em>principais, podem ser criadas outros dois tipos de <em>branches: Feature<\/em>\u00a0e <em>Hotfix<\/em>, tempor\u00e1rias e mantidas at\u00e9 serem mescaladas com as <em>branches<\/em> principais.<\/p>\n<p><img fetchpriority=\"high\" decoding=\"async\" class=\"wp-image-5476 aligncenter\" src=\"https:\/\/elemarjr.com\/engenhariadesoftware\/wp-content\/uploads\/2022\/08\/git_flow-scaled.jpg\" alt=\"\" width=\"750\" height=\"365\" srcset=\"https:\/\/elemarjr.com\/livros\/engenhariadesoftware\/wp-content\/uploads\/2022\/08\/git_flow-scaled.jpg 2560w, https:\/\/elemarjr.com\/livros\/engenhariadesoftware\/wp-content\/uploads\/2022\/08\/git_flow-300x146.jpg 300w, https:\/\/elemarjr.com\/livros\/engenhariadesoftware\/wp-content\/uploads\/2022\/08\/git_flow-1024x498.jpg 1024w, https:\/\/elemarjr.com\/livros\/engenhariadesoftware\/wp-content\/uploads\/2022\/08\/git_flow-768x374.jpg 768w, https:\/\/elemarjr.com\/livros\/engenhariadesoftware\/wp-content\/uploads\/2022\/08\/git_flow-1536x748.jpg 1536w, https:\/\/elemarjr.com\/livros\/engenhariadesoftware\/wp-content\/uploads\/2022\/08\/git_flow-2048x997.jpg 2048w\" sizes=\"(max-width: 750px) 100vw, 750px\" \/><\/p>\n<p><strong>A <em>branch Main\u00a0<\/em>armazena o hist\u00f3rico oficial de lan\u00e7amentos, enquanto a <em>branch\u00a0<\/em><em>Develop\u00a0<\/em>\u00e9 base para integra\u00e7\u00e3o.\u00a0<\/strong><\/p>\n<p><strong>Toda vez que uma nova\u00a0<em>feature\u00a0<\/em>for desenvolvida, uma <em>branch\u00a0<\/em>espec\u00edfica deve ser iniciada a partir da <em>branch Develop<\/em>.<\/strong> Idealmente, esta <em>branch\u00a0<\/em>dever\u00e1 ser nomeada conforme padr\u00e3o fixo (ex:\u00a0<em>feature\/&lt;nro. do documento de solicita\u00e7\u00e3o<\/em>). Ela dever\u00e1 existir at\u00e9 que a implementa\u00e7\u00e3o esteja conclu\u00edda quando, ent\u00e3o, dever\u00e1 ser\u00a0<em>mesclada\u00a0<\/em>com a\u00a0<em>branch\u00a0develop<\/em>.<\/p>\n<div class=\"nota-insight\">\r\n<table class=\"tabelainsight\" style=\"width: 100%;\">\r\n<tbody>\r\n<tr>\r\n<td class=\"nota-coluna-1\" valign=\"top\"><img decoding=\"async\" class=\"img-insight\" src=\"\/livros\/engenhariadesoftware\/wp-content\/uploads\/2022\/03\/ico-lamp-2.png\" alt=\"\" width=\"70\" height=\"70\" \/><\/td>\r\n<td class=\"nota-coluna-2\"><img decoding=\"async\" class=\"nota-img\" src=\"\/livros\/engenhariadesoftware\/wp-content\/uploads\/2022\/03\/ico-lamp-2.png\" alt=\"\" width=\"70\" height=\"70\" \/> O n\u00famero de <em>branches <\/em><em>Feature <\/em>abertas corresponde ao n\u00famero de funcionalidades que est\u00e3o sendo desenvolvidas simultaneamente. Em times de engenharia que adotam <em>kanban, <\/em>elas ajudam a controlar o <em>Work in Progress.<\/em><\/p>\r\n<\/td>\r\n<\/tr>\r\n<\/tbody>\r\n<\/table>\r\n<\/div>\n<p><strong>Sempre que uma corre\u00e7\u00e3o imediata, em produ\u00e7\u00e3o, for necess\u00e1ria, uma <em>branch hotfix\u00a0<\/em>deve ser iniciada, a partir da\u00a0<em>Main.<\/em>\u00a0<\/strong>Idealmente, essa <em>branch<\/em> dever\u00e1 ser nomeada conforme padr\u00e3o fixo (ex:\u00a0<em>hotfix\/&lt;nro. do documento de solicita\u00e7\u00e3o&gt;<\/em>). Ela dever\u00e1 existir at\u00e9 que a corre\u00e7\u00e3o esteja implementada e pronta para ser integrada tanto na <em>branch Main\u00a0<\/em>quanto\u00a0<em>Develop<\/em>. Al\u00e9m disso, toda vez que for realizado um <em>merge\u00a0\u00a0<\/em>com a\u00a0<em>Main,<\/em> uma tag indicativa de vers\u00e3o dever\u00e1 ser indicada.<\/p>\n<div class=\"nota-insight\">\r\n<table class=\"tabelainsight\" style=\"width: 100%;\">\r\n<tbody>\r\n<tr>\r\n<td class=\"nota-coluna-1\" valign=\"top\"><img decoding=\"async\" class=\"img-insight\" src=\"\/livros\/engenhariadesoftware\/wp-content\/uploads\/2022\/03\/ico-lamp-2.png\" alt=\"\" width=\"70\" height=\"70\" \/><\/td>\r\n<td class=\"nota-coluna-2\"><img decoding=\"async\" class=\"nota-img\" src=\"\/livros\/engenhariadesoftware\/wp-content\/uploads\/2022\/03\/ico-lamp-2.png\" alt=\"\" width=\"70\" height=\"70\" \/> O n\u00famero de <em>branches <\/em><em>Hotfix <\/em>abertas corresponde ao n\u00famero de erros em produ\u00e7\u00e3o que est\u00e3o sendo corrigidos simultaneamente. A compara\u00e7\u00e3o entre a quantidade de <em>branches\u00a0<\/em><em>Feature\u00a0<\/em>e\u00a0<em>Hotfix <\/em>serve como um &#8220;retrato&#8221; do momento do time<em>.<\/em><\/p>\r\n<\/td>\r\n<\/tr>\r\n<\/tbody>\r\n<\/table>\r\n<\/div>\n<h2>M\u00e9tricas! M\u00e9tricas!<\/h2>\n<p><strong>A ado\u00e7\u00e3o do\u00a0<em>git flow\u00a0<\/em>oferece excelentes alternativas para coleta duas m\u00e9tricas fundamentais: <span style=\"text-decoration: underline;\"><em>development lead-time<\/em><\/span> e <span style=\"text-decoration: underline;\">frequ\u00eancia de<\/span><em><span style=\"text-decoration: underline;\"> deploy<\/span>.<\/em><\/strong><\/p>\n<div class=\"nota-link\">\r\n<table class=\"tabelalink\" style=\"width: 100%;\">\r\n<tbody>\r\n<tr>\r\n<td class=\"nota-coluna-1\" valign=\"top\"><img loading=\"lazy\" decoding=\"async\" class=\"img-insight\" src=\"\/engenhariadesoftware\/wp-content\/uploads\/2022\/05\/link.png\" alt=\"\" width=\"70\" height=\"70\" \/><\/td>\r\n<td class=\"nota-coluna-2\"><img loading=\"lazy\" decoding=\"async\" class=\"nota-img\" src=\"\/engenhariadesoftware\/wp-content\/uploads\/2022\/05\/link.png\" alt=\"\" width=\"70\" height=\"70\" \/>\r\n<p style=\"font-size: 22px; font-weight: bold; line-height: 26px; font-family: Montserrat; color: #432b75; margin-bottom: 5px;\">M\u00e9tricas importantes para a engenharia de software<\/p>\r\n<p style=\"font-size: 16px; font-weight: Regular; line-height: 20px; font-family: Roboto; color: #45365d; margin-bottom: 0px;\"><\/p>\n<p><em>Development lead-time<\/em> e frequ\u00eancia de\u00a0<em>deploy\u00a0<\/em>s\u00e3o parte de um conjunto de quatro m\u00e9tricas essenciais para gest\u00e3o de times \u00e1geis.<\/p>\n<p>Quer saber mais sobre? Leia o t\u00f3pico em que as apresentamos.<\/p>\n<p><\/p>\r\n<a class=\"botao-livro\" href=\"https:\/\/elemarjr.com\/engenhariadesoftware\/definindo-boa-engenharia-de-software-e-o-papel-do-engenheiro-e-do-cto\/#Metricas_importantes_para_a_engenharia_de_software\" target=\"_blank\" rel=\"noopener\">Acessar t\u00f3pico<\/a><\/td>\r\n<\/tr>\r\n<\/tbody>\r\n<\/table>\r\n<\/div>\n<p><em>Development lead-time\u00a0<\/em>pode ser &#8220;simplificado&#8221;, em projetos ativos, para o intervalo de tempo entre\u00a0<em>tags <\/em>indicando vers\u00f5es que introduzem\u00a0<em>features<\/em>. De forma an\u00e1loga, a frequ\u00eancia de\u00a0<em>deploy <\/em>pode ser medida a partir da quantidade de <em>tags <\/em>indicando vers\u00f5es que introduzem <em>features\u00a0<\/em>em um determinado intervalo de tempo (por exemplo, em um m\u00eas).<\/p>\n<h2>Uma restri\u00e7\u00e3o importante<\/h2>\n<em>Git flow\u00a0<\/em>pode ser considerado burocr\u00e1tico demais para empresas com frequ\u00eancias de <em>deploy <\/em>muito altas (v\u00e1rias vezes ao dia, por exemplo). Tal restri\u00e7\u00e3o \u00e9 sinalizada, inclusive pelo criador do modelo.\n<h2>Para pensar&#8230;<\/h2>\n<em>Git flow<\/em> \u00e9 um &#8220;primeiro passo seguro&#8221; para times de engenharia com processos de gest\u00e3o do reposit\u00f3rio desestruturados. Ele estabelece, imediatamente, a implanta\u00e7\u00e3o de pr\u00e1ticas saud\u00e1veis como controle efetivo de vers\u00f5es e coleta de m\u00e9tricas essenciais para a gest\u00e3o.\n<hr \/>\n<p>Mesmo com algumas limita\u00e7\u00f5es percept\u00edveis, entendo que o modelo ajuda organiza\u00e7\u00f5es de engenharia a por a &#8220;casa em ordem&#8221;, habilitando trabalho simult\u00e2neo, colabora\u00e7\u00e3o e suporte para corre\u00e7\u00f5es r\u00e1pidas.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Os reposit\u00f3rios de c\u00f3digo-fonte dos sistemas que uma empresa desenvolve s\u00e3o o &#8220;cora\u00e7\u00e3o&#8221; da engenharia de software. Empresas maduras na\u00a0capability\u00a0de engenharia de software t\u00eam reposit\u00f3rios &#8220;saud\u00e1veis&#8221;, ou seja, que facilitam a implementa\u00e7\u00e3o \u00e1gil de mudan\u00e7as (implementa\u00e7\u00f5es e corre\u00e7\u00f5es) nos sistemas &#8211; com baixo development lead-time e alta frequ\u00eancia de deploys\u00a0&#8211; e facilitam a colabora\u00e7\u00e3o. Por [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":5483,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[],"tags":[],"url":[72],"apendices":[],"capitulos":[35],"class_list":["post-5464","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","url-permanente","capitulos-capitulo-2-1"],"acf":[],"_links":{"self":[{"href":"https:\/\/elemarjr.com\/livros\/engenhariadesoftware\/wp-json\/wp\/v2\/posts\/5464","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/elemarjr.com\/livros\/engenhariadesoftware\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/elemarjr.com\/livros\/engenhariadesoftware\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/elemarjr.com\/livros\/engenhariadesoftware\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/elemarjr.com\/livros\/engenhariadesoftware\/wp-json\/wp\/v2\/comments?post=5464"}],"version-history":[{"count":20,"href":"https:\/\/elemarjr.com\/livros\/engenhariadesoftware\/wp-json\/wp\/v2\/posts\/5464\/revisions"}],"predecessor-version":[{"id":5487,"href":"https:\/\/elemarjr.com\/livros\/engenhariadesoftware\/wp-json\/wp\/v2\/posts\/5464\/revisions\/5487"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/elemarjr.com\/livros\/engenhariadesoftware\/wp-json\/wp\/v2\/media\/5483"}],"wp:attachment":[{"href":"https:\/\/elemarjr.com\/livros\/engenhariadesoftware\/wp-json\/wp\/v2\/media?parent=5464"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/elemarjr.com\/livros\/engenhariadesoftware\/wp-json\/wp\/v2\/categories?post=5464"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/elemarjr.com\/livros\/engenhariadesoftware\/wp-json\/wp\/v2\/tags?post=5464"},{"taxonomy":"url","embeddable":true,"href":"https:\/\/elemarjr.com\/livros\/engenhariadesoftware\/wp-json\/wp\/v2\/url?post=5464"},{"taxonomy":"apendices","embeddable":true,"href":"https:\/\/elemarjr.com\/livros\/engenhariadesoftware\/wp-json\/wp\/v2\/apendices?post=5464"},{"taxonomy":"capitulos","embeddable":true,"href":"https:\/\/elemarjr.com\/livros\/engenhariadesoftware\/wp-json\/wp\/v2\/capitulos?post=5464"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}