Skip to content

Branching Patterns

Un resum de Patterns for Managing Source Code Branches by Martin Fowler

https://martinfowler.com/articles/branching-patterns.html

Patrons generals

Patró Source Branching (Ramificant el codi)

  • Problema: Com treballar amb canvis paral·lels fets fer diferents persones?
  • Solució: Crea diferents copies del codi i enregistra els canvis que es fan a cadascuna

Conceptes:

  • Commit (confirmació): un canvi enregistrat
  • Codeline: una seqüència de canvis confirmats (el terme branca s'evita per significa coses diferents en diferents sistems de control de versions)
    • Una codeline és més que una branca de git: Alice i Bob poden tenir diferents codelines en local de la mateixa branca master de git i poden diferir de la d'origin.
  • Tip/Head (cap): la darrera comissió d'una codeline
  • To branch (ramificar): generar una copia del codi a partir de la qual generar una nova sequència de commissions
  • To merge (fusionar): aplicar els canvis d'una codeline a una altra
  • Conflictes: Fusionar sovint implica conflictes
    • Conflictes textuals: Quan les dues branques han modificat les mateixes linies. El control de versions ho detecta però requereix resolució manual.
    • Conflictes semàntic: Quan les dues branques, tot i no incòrrer en conflicte textual interfereixen en la seva lògica. El control de versions no ajuda a detectar-ho però si ens ajuda tenir bons testos.

Forces:

  • Ramificar és fàcil, fusionar costa.
  • Ramificant evitem temporalment el conflicte que seria estar tothom canviant el codi.
  • Tard o d'hora cal pagar els deutes (amb interessos).
  • La fusió és més costosa com més canvis acomulen.

Patrò Mainline (Linia principal)

  • Problema: Quan tenim diverses branques, quin és l'estat actual del projecte?
  • Solució: Considerar una única branca compartida l'estat actual del producte

Conceptes

  • La branca fa de referencia per:
    • Saber de quin punt he d'arrencar la meva branca
    • Saber quins canvis dels companys he d'incorporar
    • Saber d'on treure una versió a desplegar a producció
  • Usualment la branca esta a un servidor compartit

Forces

  • Alternativa: Release Train

Patrò Healthy Branch (Branca sana)

  • Problema: Amb tanta gent aplicant canvis a l'hora, com puc refiar-me de que la branca principal funciona?
  • Solució: Executar automaticament comprovacions per cada commit que es fa a la branca

Forces:

  • Important que el codi s'auto-comprovi
  • Hi ha tensió entre el cost de les proves i la freqüència i profundintat de les proves
    • Jerarquia de testos: Els ràpids primer per donar feedback aviat
  • Ajuda el patro Pre-Integration Review
  • Important a la branca principal, pero tambè a les branques de features o personals

Patrons d'integració

Patrò Mainline Integration

S'integra el codi a la branca principal

Patrò Feature Branching (Ramificat per funcions)

  • Problema: Com integrar els canvis?
  • Solució: Tots els canvis associats amb una funció van a una branca i s'integra quan està acabada

Alternativa: Integració continua

Forces:

  • :-) La qualitat de tot codi de la funció es comprova com a unitat
  • :-) El codi de la funció s'incorpora integrament o no, només quan la funció és completa
  • :-( La fusió és menys freqüent
    • Més conflictes textuals i semantics
    • Por al merge
    • Branques zombie
  • :-) Introdueix un punt de peer-review de tercers (fora del pair programming)
  • :-( Els refactorings no relacionats es veuen aliens a una brancha de funció
  • :-) Es un mode de funcionament popular a l'open source (pull request), on els desenvolupadors son contribuidors i cal review dels programadors principalsa

Patrò Continuous Integration (Integració contínua)

  • Problema: Com integrar els canvis?
  • Solució: Els desenvolupadors integren amb mainline tan d'hora com s'arriba a una branca sana de compartir, normalment dintre del dia

Com?

  • Redueix la por d'integració per branca llarga
  • Requereix Integració Continua
  • Compromís d'arribar frequentment a punts de integració sana, amb una feature, si cal, parcialment construïda
  • Com integrar features parcialment construides:
    • Feature flags: Que la feature estigui desactivada amb un flag
    • Keystone Interface: No exposar la interficie a l'usuari fins que tot lo de darrera està fet (Keystone interface, la interficie es la pedra final)
  • Obrir una feature branch es opcional:
    • Si s'obre, s'integra freqüentment
    • També es pot treballar sense ella: Si es passa la CI i hi ha manera de desactivar la feature parcial a producció

Alternativa: Feature branch

Forces:

  • :-( Requereix compromís de tenir la branca sana (integració continua)
  • :-) Integració més freqüent que la duracio del desenvolupament d'una funció
    • :-) Redueix el temps de detecció dels conflictes
    • :-) Fusións més petites
  • :-) Més natural fer refactorings no relacionats amb la funció
  • :-) Cientificament comprovat que augmenta el delivery (Fowler dixit)
  • :-( Codi condicional que un cop a producció caldria treure

Pre-integration review (Revisió previa a la integració)

  • Problema: Com assegurar la qualitat del mainline?
  • Solució: Tota integració amb la mainline ha de estar revisada per iguals abans d'acceptar-se

Una Pull request es una combinació dels patrons Feature Branch i Pre-integration review

Forces:

  • :-( El pair programming ja aporta peer-review i més rápida
  • :-) Assegura un mínim de qualitat quan els equips no són equilibrats
  • :-) Aporta peer review quan no s'esta fent pair programming
  • :-( Introduceix latència en el delivery
  • :-( Complicada de fer a cada integració si hi ha integració contínua
  • :-( Amb Feature Branch els reviews arriben al final del desenvolupament principal implicant refer coses per arribar a la qualitat desitjada

DGG: Pot servir per fer extensiu el que s'està fent si el desenvolupament ha estat molt concentrat en poques persones

Patrò: Ship-show-ask (Entrega, mostra o pregunta)

No es un patrò de l'article pero en Fowler comenta que, en un entorn equilibrat ell prefereix fer refactorings un cop comitejat, que exigir-los a una revisió pre-commit.

https://martinfowler.com/articles/ship-show-ask.html

Adaptar l'estrategia al tipus de canvi.

  • Ship
    • Com la integració contínua, sense branca
    • Casos:
      • Funció afegida seguint protocols ja establerts
      • Arregla un bug obvi
      • Documentació
      • Millora codi basat en el feedback rebut
  • Show
    • Crees una PR i s'integra un cop es passen els checks automatics, hi ha conversa sobre el codi
    • Obre espai per comunicar el que s'ha fet i rebre feedback, preguntes...
    • Discusio post mortem
    • Casos:
      • M'agradaria qualsevol tipus de feedback per millorar el codi
      • Mireu aquesta nova aproximació de fer les coses
  • Wait
    • Crees una PR, i esperes al feedback abans de fusionar
    • Casos:
      • Això funcionaria?
      • No estic segur de com he resolt el tema
      • Necessito ajuda per millorar això
      • Ja integraré demà, que avui no arribo

Regles:

  • Per fusionar no es requereix review
  • Els autors decideixen quin tipus de cas
  • Els autors son els que fusionen
  • Les branques tenen vida curta i les rebasem a master sovint

Forces:

  • Un cop proposada una solució es dur proposar alternatives
  • No es substitut de parlar amb les companyes abans de començar
  • Que no obrir una PR pugui ser tampoc una forma d'evitar la discussió sobre com es fan les coses

Aspectes claus dels patrons d'integració

  • Freqüència d'integració: Baixa freqüència permet desenvolupament tranquil,
  • Fricció d'integració:
    • tot el que posem en mig de fer la integració: formularis, conflictes, reviews...
    • si hi ha molta dificulta la integració continua
    • plantejar: aporta un valor clar?
    • Factors culturals: confiança entre desenvolupadors, equilibri de
  • Modularitat

Patrons d'entrega

Patró Release Branch

Patró Maturity Branch

Patró Long Lived Release Branch

Patró Environment Branch

Patró Hotfix Branch

Patró Release Train Branch

Patró Release-Ready Mainline

Altres patrons

Patró Experimental Branch

Patró Future Branch

Patró Collaboration Branch

Patró Team Integration Branch

Branching Policies

Git-flow

Github flow

Trunk based development