By the time I'm ready to merge my branch back into develop (emphasis mine)
Gestire i conflitti in git merge
è spesso più semplice di git rebase
. In Git si può vedere l'intero elenco di file che sono stati modificati contemporaneamente. Indipendentemente dal numero di commit compiuti da altri colleghi, dovrai unire una volta . Con il flusso di lavoro di rebase, potresti finire per ottenere sempre gli stessi conflitti e doverli rivedere manualmente. Puoi finire per correggere il 13 ° commit e sentirti non puoi vedere la luce fuori dal tunnel .
In base alla mia esperienza, quando ho tentato di risolvere in modo ingenuo i conflitti rebase ripetuti, ho finito per perdere le modifiche di qualcuno o con un'applicazione che non si è nemmeno compilata. Spesso io e colleghi abbiamo lavorato molto ma siamo rimasti così sopraffatti dalla complessità dei conflitti ripetuti che abbiamo dovuto abortire e perdere il nostro lavoro precedente dopo una manciata di commit di rebase.
Ti suggerirò alcune tecniche, ma possono solo aiutare l'unione a diventare più facile che automatizzare l'attività.
-
File di risorse / lingua . Se hai modifiche additive in un file di risorse, assicurati di spostarle sempre alla fine del file in modo da poter facilmente ricordare le tue modifiche rispetto a altri 'modifiche. Potresti essere in grado di copiare e incollare le modifiche nella parte inferiore o semplicemente rimuovere i contrassegni di conflitto
-
fare. Non. ASSOLUTAMENTE. RE-formato . Né tu né i tuoi colleghi sviluppatori dovrete eseguire un "massive reformat di codice" durante il lavoro quotidiano. Il codice reformat aggiunge un numero eccessivo di falsi positivi nella gestione dei conflitti. Il codice reformat può essere fatto
- Incrementalmente, ad es. da ogni sviluppatore su ogni commit, non appena utilizzano uno strumento automatico (ad esempio, Eclipse ha un'opzione per riformattare al salvataggio, vanilla Visual Studio non ne ha). Assolutamente ogni sviluppatore deve utilizzare gli stessi standard di formattazione del codice, codificati in un file di formato che viene mangiato dal tuo IDE. Per darti un'idea, se sono 4 spazi o 2 schede non ha importanza, ma conta davvero se tutti usano lo stesso.
- Poco prima del rilascio, da un capo squadra. Se un commit "code reformat" si verifica quando le persone non lavorano sui branch, cioè prima che si diramano, le cose andranno più facilmente
-
Rivedi la divisione del lavoro tra i colleghi. Questa è la parte in cui viene la maggior parte dell'ingegneria. Come sottolineato da altre risposte, è l'odore del design se più sviluppatori che svolgono compiti diversi devono toccare le stesse risorse. Potresti dover discutere con il tuo team leader su quale parte deve essere modificata da ogni sviluppatore concorrente.
Ho anche visto alcune cattive abitudini nei flussi di lavoro Git nei miei team. Spesso le persone superano le loro filiali. Ho assistito personalmente a uno sviluppatore aggiungendo da 10 a 20 commit etichettati come "fix", ognuno dei quali impegnava una o due linee. La nostra politica prevede che i commit siano etichettati con i biglietti JIRA per darti un'idea.
@JacobRobbins suggerisce di rendere git rebase
un'attività giornaliera. Vorrei spingere il suo approccio in avanti.
Per prima cosa, usa una volta rebase per ridurre il numero di commit a una manciata. E rebase solo sul ramo di sviluppo originale , che è il commit da cui hai diramato. Quando dico manciata, potrei dire 3 o 4 (ad esempio tutto front-end, tutto back-end, tutte le patch del database) o qualsiasi figura umanamente ragionevole. Dopo averli consolidati, utilizzare fetch
e lavorare il rebase sul ramo upstream. Questo non ti salverà dal conflitto a meno che il tuo team non riveli il proprio approccio, ma renderà la tua vita meno dolorosa.
Se hai altre domande sulle attività specifiche, sentiti libero di cercare e chiedere su Stackoverflow.
[Modifica] sulla regola no-reformat e boy scout. Ho leggermente riformulato RE-format per evidenziare che quello che sto intendendo è il compito di formattare da zero l'intero file sorgente, incluso il codice che non è stato toccato da te. Al contrario, per formattare sempre il tuo codice, che è perfettamente boy-scouty, un certo numero di sviluppatori, incluso me stesso, sono usati per riformattare l'intero file con le capacità dell'IDE. Quando il file viene toccato da altri, anche se le linee interessate non vengono modificate nei loro contenuti e semantica, Git lo vedrà come un conflitto. Solo un editor molto potente e in grado di riconoscere la lingua può suggerire che il conflitto riguarda solo la formattazione e l'unione automatica del frammento meglio formattato. Ma non ho prove di uno strumento del genere.
Dopotutto, la regola del boy scout non ti obbliga a ripulire il casino degli altri. Solo tuo.