2012-05-04 9 views
6

Tutti gli standard di codifica e le buone pratiche parlano da parte, come fa Git stesso tecnicamente a gestire enormi commit vs piccoli commit. Ad esempio, Git è più intelligente con fusioni di filiali (ad esempio meno conflitti) con entrambi i casi, la garbage collection diventa più efficiente o qualcosa di simile? O c'è qualche differenza?Prestazioni di Git con Big Commits vs tiny commit

Per essere chiari, intendo lo scenario in cui il codice viene modificato da A a B, e il "commit enorme" cambia semplicemente il codice da A a B, mentre il "piccolo commit" ha un sacco di intermedio commette (per esempio, per ogni piccola modifica), ma alla fine finisce nello stesso identico.

+0

+1: questa è una domanda importante per coloro che devono operare in una revisione aziendale prima di eseguire un'operazione di stile che tende a rallentare il ciclo di commit. Può dipendere dalla misura della "grandezza" e dallo stile di cambiamento. Direi che il limite di una mezza dozzina di conflitti di unione di base, o una modifica funzionale, come un probabile piccolo limite <->. –

risposta

4

I "molti piccoli commit" useranno un po 'più di spazio, ma la differenza probabilmente non vale la pena pagare il prezzo della cronologia persa .

L'effetto sul file stesso dipenderà da quante modifiche non sono state modificate in seguito. Ad esempio, se un commit successivo tocca linee che anche un commit precedente ha toccato, lo stato intermedio di quelle linee non sarebbe visibile nella cronologia con un grosso commit, e quindi non ci sarebbe alcun oggetto nel file pack per rappresentarli.

Non riesco a immaginare che il numero di commit su un ramo riduca o aumenti la complessità della fusione; ma non posso parlare con autorità su questo dato che non ho esaminato esattamente come viene eseguita la fusione tipica da ricorsiva. La mia comprensione è che è equivalente a una diff3 dall'ultimo punto in cui sono stati uniti (o divisi). In quel caso, un grosso commit non sarebbe più o meno efficiente di molti piccoli commit.

C'è un altro aspetto da considerare, a seconda dei tempi. Se stai lavorando su un ramo e unisci regolarmente il ramo upstream tra i tuoi commit, molti piccoli commit genereranno meno conflitti perché manterrai una parità migliore con il ramo upstream, e quindi scarterai di meno. Ciò causerà certamente meno problemi quando è il momento di fondersi.

La raccolta dei dati inutili non viene in alcun modo influenzata, poiché in entrambi i casi, non vi sono commit penzolanti o oggetti sciolti in entrambi i metodi.

Tutto sommato, tuttavia, i file pack sono in genere abbastanza efficienti quando si ha a che fare con il testo che il vantaggio di poter visualizzare una cronologia completa e non adulterata spesso supera il costo dello spazio aggiuntivo necessario.

+1

Penso che questo potrebbe avere effetto sui conflitti di unione in quell'unico grande commit causerà un conflitto grande, difficile da gestire e unire. Mentre molti piccoli commit causano molti piccoli conflitti di fusione, che dovrebbero essere più facili da gestire. – svick

+0

@svick Mi hai letto nel pensiero. Ho appena aggiunto la parte sull'essere in grado di mantenere una migliore parità prima di vedere il tuo commento :) – Greyson