2014-05-07 2 views
6

Non sono sicuro di potermi fidare di Git per unire automaticamente. Ecco uno scenario.Come posso fidarmi di Git merge?

Creare un programma nel master:

MOVE 0 TO I. 
A. 
    PERFORM X-PROC. 
    IF I IS EQUAL TO 25 THEN GO TO A. 

Developer 1 fa un ramo e si accorge che c'è un bug: un ciclo infinito. Ha la fissa:

MOVE 0 TO I. 
A. 
    ADD 1 TO I. 
    PERFORM X-PROC. 
    IF I IS EQUAL TO 25 THEN GO TO A. 

Intanto Developer 2 fa un ramo e corregge il bug a modo suo:

MOVE 0 TO I. 
A. 
    PERFORM X-PROC. 
    ADD 1 TO I. 
    IF I IS EQUAL TO 25 THEN GO TO A. 

Entrambi gli sviluppatori di testare il proprio codice e lo trovano corretto. Entrambi si fondono con il master:

MOVE 0 TO I. 
A. 
    ADD 1 TO I. 
    PERFORM X-PROC. 
    ADD 1 TO I. 
    IF I IS EQUAL TO 25 THEN GO TO A. 

Il ciclo infinito è tornato.

Mi sembra che questo problema si verifichi spesso in qualsiasi tipo di ambiente di sviluppo distribuito. Quando ho provato questo, Git non ha segnalato un conflitto di fusione. A volte questo problema potrebbe non essere rilevato per molto tempo. Un test di regressione dovrebbe trovarlo, ma i test di regressione sono uniti anche in Git, quindi non possiamo fidarci neanche di loro.

Cosa posso fare a riguardo? Devo fare una lettura del codice dopo ogni unione?

risposta

9

Devo eseguire una lettura del codice dopo ogni unione?

Sì, certo.

Gli algoritmi di automazione sono utili, ma non sono magici; includono solo le modifiche apportate su entrambi i lati di un file se non sono in conflitto. Non c'è alcuna garanzia che la modifica risultante compili o addirittura non sia priva di senso. Non c'è alcuna garanzia che la logica non sia un completo naufragio. (Alcuni hanno ipotizzato che il bug Heartbleed fosse il risultato di un automerge che modificava la logica in modo subdolo e non è stato preso in esame.)

Questo è vero per qualsiasi strumento di controllo versione che esegue un'automazione (che, presumendo si stia utilizzando qualcosa che è stato scritto negli ultimi 15 anni circa, quasi certamente.) Anche se questo non è per impeach automerge, che risolve due modifiche allo stesso file e generalmente fa un buon lavoro; questo è anche vero per una fusione in generale. Se modifichi alcuni file A e modifico alcuni file B, non c'è alcuna garanzia che l'unione abbia senso.

Best practice: è necessario rivedere sempre le unioni prima di eseguirne il commit o il push, anche quando si automatizzano correttamente.

+4

Test suite/test di unità sono uno strumento meraviglioso per ridurre il carico di lavoro se si hanno fusioni gigantesche (che di solito non si hanno) - ma non cadere nel falso senso di sicurezza e negligenza mentale - controllare le proprie fusioni, solo perché i tuoi test passano tutti! –

+1

Una tecnica che utilizzo per verificare una fusione meno dolorosa consiste nel prendere il diff di un ramo prima e dopo un'unione con un altro ramo, quindi confrontare tale diff (utilizzando un programma diff.) Al diff delle modifiche apportate nel altro ramo. Se non c'è differenza tra i diff, allora posso avere maggiore fiducia che l'unione non sia stata pasticciata. –

+0

Grazie NevikRehnel e @cupcake - Mi piacerebbe o sentirò le strategie di tutti per il controllo della sanità mentale che si fondono! –