A volte sento persone dire qualcosa come "Tutto il codice di commit deve funzionare". In alcuni articoli le persone scrivono anche descrizioni su come creare svn o git hooks che compilano e testano il codice prima del commit.
Nella mia azienda di solito creiamo un ramo per una funzione e un programmatore di solito lavora in questo ramo. Io spesso (1 per 100, penso e penso con una buona ragione) faccio commit non compilabili. Mi sembra che il requisito di "sempre compilabile / stabile" commetta conflitti con l'idea di frequenti commit. Un programmatore preferirebbe eseguire un commit in una settimana piuttosto che testare la stabilità / compilabilità dell'intero progetto dieci volte al giorno. Per il solo codice compilabile utilizzo tag e alcuni rami selezionati (trunk, ecc.)
Vedo questi motivi per il commit di codice non completamente funzionante o non compilabile:
- Se sviluppo una nuova funzione, è difficile farlo funzionare scrivendo poche righe di codice.
- Se sto modificando una funzione, a volte è difficile mantenere il codice sempre funzionante.
- Se cambio il prototipo o l'interfaccia di qualche funzione, farei anche centinaia di modifiche, non di modifiche meccaniche, ma intellettuali. A volte uno di questi potrebbe farmi eseguire centinaia di commit (ma se voglio che tutti i commit siano stabili, dovrei impegnarmi 1 volta anziché 100).
In tutti questi casi per fare commit stabili farei commit con molti e molti cambiamenti e sarà molto, molto, molto difficile scoprire "Cosa è successo in questo commit?".
Un altro aspetto di questo problema è che la compilazione del codice non garantisce il corretto funzionamento.
Quindi è una buona idea richiedere che ogni commit sia stabile / compilabile?
Dipende dal modello di ramificazione o CVS?
Nella tua azienda, è vietato eseguire commit non compilabili? È (e perché) una cattiva idea utilizzare solo rami selezionati (incluso il tronco) e tag per versioni stabili?