Quanto dovrebbe essere grande un singolo commit? [duplicare]

17

Una discussione è arrivata al lavoro e voglio avere l'opinione di altri programmatori.

Durante la mia permanenza al college, usavamo SVN solo per sourcecontrol. Tutti si collegano allo stesso server e tutte le modifiche vengono trasferite su tutte le macchine. In questo sistema, è facile quando devi spingere le tue modifiche: quando hai finito con le tue modifiche. Tuttavia, questo rende il merging dei changeset di più sviluppatori un incubo completo.

Tuttavia, nell'ultimo anno o giù di lì che ho programmato professionalmente, abbiamo utilizzato Mercurial per il controllo del codice sorgente. All'inizio lo stavo usando come SVN: lavoro su un featur, commetti e spingo tutto in una volta, ma solo quando è finito.

A poco a poco, le mie abitudini hanno iniziato a cambiare. Ho saputo delle filiali, di come i commit potevano essere una bozza, pubblici o segreti e persino di usare una chiavetta USB come deposito centrale. I miei impegni si sono ridotti, ma sono aumentati in quantità. Invece di commettere e spingere in una volta sola, farei dei commit per ogni cambiamento in un ramo chiamato.

Ecco come appare il repository di uno dei miei progetti personali:

Vedounpaiodivantaggiinquestoapproccio.

  • Ipiccolicommitsignificanochesonofocalizzatisuunsingolosoggetto.Ognicommitriceveunadescrizionediunarigadeicambiamenti,chelirendefacilidaseguireanchedoposettimanediinattività.

  • Iramiconnometitengonoinargomento.Selavorinelramo"refactor-text-rendering", ad esempio, non dovresti apportare modifiche alla libreria matematica, perché non è correlata all'argomento del ramo.

Tuttavia, lo sviluppatore principale è infastidito dalla mia metodologia. Sente che il piccolo impegna a ingombrare la storia del deposito. La sua metodologia preferita è lavorare in una patch. Quando la funzione è terminata, unisce i commit e li spinge in un colpo solo.

Quindi, cosa preferisci? Un flusso di coscienza, una storia di commit o una patch di cambiamenti ogni tanto? O qualcos'altro interamente?

    
posta knight666 02.08.2013 - 20:38
fonte

6 risposte

13

Sono andato alla ricerca di riferimenti ai libri per questo, ma purtroppo non li trovo.

In generale, credo che i piccoli commit siano ampiamente considerati le migliori pratiche. O più precisamente: il commit più piccolo che rappresenta una feature coesiva che è in uno stato compatibile.

Perché?

  1. Piccoli e frequenti check-in ti impediscono di perdere il lavoro in caso di guasto dell'hardware, terremoto, apocalisse di zombi.
  2. I tuoi colleghi possono ottenere i tuoi cambiamenti prima che se aspetti fino alla fine e facciano un grosso commit.
  3. Se è necessario eseguire il rollback di una funzione, puoi eseguire il rollback di un changeset diverso da "metà" di un changeset.
  4. I check-in più piccoli significano meno aree di cambiamento, il che significa meno probabile conflitto con il lavoro di altre persone.
risposta data 02.08.2013 - 20:54
fonte
4

Sono quasi sicuro che ci sia una buona dose di opinione in questo spazio, ma tendo a seguire alcune regole da cui tende a dettare le dimensioni dei commit, alcune riflessioni su questo:

  1. I singoli commit dovrebbero essere "rollback-able", la tua funzione ha un impatto sulla capacità di lavoro del sistema se il commit è stato lanciato? I commit dovrebbero essere unità coesive e quelle unità coesive dovrebbero "mappare" correttamente (il più possibile) nella funzionalità.
  2. Fila in privato dove possibile per proteggere la "brutta" dalla tua squadra, in definitiva i tuoi commit, grandi o piccoli, non dovrebbero influire sul loro lavoro sulla caratteristica B.

Penso che se segui entrambe le regole generali, i tuoi commit potrebbero o meno necessariamente essere "grandi" o "piccoli" (relativamente parlando). Certo, i piccoli commit sono buoni, ea volte più facili da ragionare, ma se sono tutti strongmente accoppiati, potrebbe renderlo un po 'più difficile da gestire. Sto bene con un commit "grande" (entro limiti ragionevoli) a patto che sia ridotto al suo raggruppamento funzionale coesivo più piccolo.

    
risposta data 02.08.2013 - 21:34
fonte
2

Preferisco il tuo approccio quando usi Mercurial. I moderni sistemi di controllo del codice sorgente come Git e Mercurial si basano sull'idea che i commit rapidi ti permettono di impegnarti frequentemente. Non dovresti salvare un gran numero di modifiche e impegnarle in un colpo solo.

Git ti permette di condensare più commit in un singolo commit usando la sua funzione "squash", ma questo non è fornito di default in Mercurial. La modifica della cronologia dei commit va contro l'ethos Mercurial, che afferma che la storia dovrebbe essere immutabile. Tuttavia, se vuoi provare a replicare la funzione di schiacciamento di Git - in modo che tu possa continuare a utilizzare i tuoi strumenti correttamente, pur continuando ad aderire al nocciolo del tuo lead dev - questa domanda potrebbe aiutarti:

link

    
risposta data 02.08.2013 - 20:58
fonte
2

Esistono argomenti validi in entrambi i casi, da un lato, il controllo del codice sorgente non è un meccanismo di backup, si dovrebbe usare shelving, un repository locale o un semplice backup vecchio per assicurarsi che il proprio lavoro sia sicuro fino al commit alla produzione. D'altra parte, se una serie di modifiche rappresenta una correzione completa e discreta di bug, funzionalità, ecc., Allora sembra ragionevole impegnarle quando sono pronte. In futuro, rivedere i commit più piccoli e più "modulari" potrebbe rivelarsi più semplice piuttosto che sfiorare una revisione con 100s di file modificati.

Inoltre, cercare di mantenere la purezza in un log di controllo sorgente sembra un gioco perdente a lungo termine e si concentra sulla gestione di un artefatto del processo di sviluppo piuttosto che sul software stesso.

    
risposta data 02.08.2013 - 20:59
fonte
2

Porta la tua cronologia dei commit, come esempio per il tuo progetto personale. Ci sono 13 messaggi di commit per 1 giorno (ad esempio "2 giorni fa"). Ora immagina come sarebbe la storia per lo stesso periodo di tempo se gli sviluppatori 50-200 + hanno lavorato al progetto nello stesso modo. Questo è 650-2600 messaggi di commit al giorno . La cronologia dei commit per una settimana sarebbe intrattabile per un umano.

Quindi dipende dalle dimensioni del team: su piccole squadre, sono buone informazioni dettagliate. Man mano che la squadra diventa più grande esplode rapidamente in un casino di rumore, rendendo la storia funzionalmente inutile.

    
risposta data 02.08.2013 - 22:34
fonte
1
  • Non commetti mai deliberatamente un commit che lascerà il repository in uno stato di errore, anche se intendi creare un altro che lo risolva.

  • Preferisci piccoli commit a grandi commit. Quando si rintraccia la fonte di alcuni problemi tagliando il repository, è più facile rintracciare la fonte di un problema se i passaggi sono piccoli; ed è più facile comprendere rapidamente le modifiche in un piccolo commit.

  • Preferisci un singolo commit per una singola funzione, correzione o altra unità logica di lavoro; evitare commit "parziali" che introducono modifiche che non sono funzionali senza ulteriori commit ed evitare commit composti che contengono diverse modifiche non correlate. Se stai apportando una modifica stilistica che non modifica la funzionalità, eseguila separatamente. Tutto ciò aumenta la probabilità di lasciare la build ininterrotta, e rende molto più facile per un'altra persona scaricare i problemi della base di codice per capire la sequenza di cambiamenti funzionali avvenuti e cogliere rapidamente ogni singola modifica.

  • Se stai lavorando su una funzione molto complessa o un refactoring che non può essere reso sicuro o utile da impegnare mentre parzialmente scritto, lavorare su un ramo privato, impegnarsi spesso, cerca di rimanere aggiornato con il trunk, e se possibile, quando finalmente si fondono in trunk, fallo in un modo che lasci ai futuri manutentori un modo per accedere alla cronologia del ramo privato.

Quindi, per riassumere: cerca sempre di fare il più piccolo impegno possibile che sia sia necessario che sufficiente per completare una singola unità logica di lavoro.

    
risposta data 03.08.2013 - 01:54
fonte

Leggi altre domande sui tag