Sobes.tech
Middle

Care sunt diferențele dintre abordările Trunk-Based Development și Feature Branching?

sobes.tech AI

Răspuns de la AI

Criteriu Dezvoltare bazată pe Trunk (TBD) Ramificare de Funcții (FB)
Ramură principală O singură ramură principală (trunk/main/master) Mai multe ramuri de lungă durată (develop, release, master)
Frecvența de unire Foarte frecvent (cel puțin o dată pe zi) Rară (după finalizarea unei funcții)
Dimensiunea ramurilor de funcții Foarte scurtă (de câteva minute până la ore) De lungă durată (zile până la săptămâni)
Integrare Integrarea continuă (CI) este esențială Integrarea are loc mai rar, poate fi mai complexă
Riscul de conflicte Mai puține conflicte mari, dar mai multe mici și frecvente Mai multe conflicte mari la unirea ramurilor mari
Timpul de lansare în producție Rapid și frecvent (livrare continuă) Mai lent și mai rar
Cerinte de teste Nivel înalt de automatizare a testelor Testele pot fi efectuate mai târziu în ciclu
Dimensiunea echipei Mai potrivit pentru echipe mici și medii, scalabil cu disciplină Potrivit pentru echipe mari

Dezvoltare bazată pe Trunk:

  • Se concentrează pe integrarea frecventă a modificărilor mici direct în ramura principală.
  • Necesită disciplină strictă, teste automatizate și steaguri de caracteristici pentru gestionarea funcțiilor incomplete.
  • Reduce riscurile asociate cu unificări mari.

Ramificarea de Funcții:

  • Fiecare funcție este dezvoltată într-o ramură separată.
  • Unificarea are loc doar după finalizarea funcției.
  • Poate duce la "înecare" de modificări și conflicte complexe la unificare dacă ramurile durează mult.

Exemplu de cod pentru TBD (simplificat):

// Dezvoltarea se face direct în main/trunk
public class FeatureA {
    public void doStuff() {
        // Codul funcției A
    }
}

// Alt dezvoltator face commit aproape simultan în main/trunk
public class FeatureB {
    public void doOtherStuff() {
        // Codul funcției B
    }
}

Exemplu de cod pentru FB (simplificat):

// Dezvoltatorul 1 lucrează în ramura feature/A
// git checkout -b feature/A develop
public class FeatureA {
    public void doStuff() {
        // Codul funcției A
    }
}

// Dezvoltatorul 2 lucrează în ramura feature/B
// git checkout -b feature/B develop
public class FeatureB {
    public void doOtherStuff() {
        // Codul funcției B
    }
}

// După finalizarea funcției A, ramura se unește în develop
// git checkout develop
// git merge feature/A

// După finalizarea funcției B, ramura se unește în develop
// git checkout develop
// git merge feature/B // Pot apărea conflicte cu codul din feature/A