Sono uno sviluppatore di software recentemente responsabile di tutto il progetto (project manager). Il progetto su cui sto lavorando (con altre 6 persone) è una complessa applicazione basata su Java che viene sviluppata da oltre 5 anni. L'intero periodo in cui stavamo usando SVN, senza diramazioni. Ora, vorrei passare a Git perché credo che Git fornirà una ramificazione superiore e faciliterà lo sviluppo.
Ad ogni modo, prima di passare, devo parlarti dell'attuale flusso di lavoro che stiamo avendo con SVN, devo ascoltare l'opinione delle persone esperte con Git e dirti quali sono le cose che mi aspetto da Git. Per favore dimmi se Git può fornire le cose di cui ho bisogno nel modo in cui ho bisogno di loro, perché se cambio l'intero progetto in Git e poi si scopre che devo ripristinarlo in SVN (per qualsiasi motivo) , Sarei morto :).
Il principio che seguiamo con SVN è:
-
Ogni membro del team sta lavorando su una singola funzione. Al termine di tale funzionalità, una copia locale del codice dello sviluppatore viene aggiornata rispetto al master SVN e la funzionalità viene distribuita per il test. Se la verifica da parte dei client è passata, la persona che sviluppa il codice lo spinge al nostro ramo principale (e solo) con un messaggio di commit appropriato che spiega la funzione, il numero di ticket e così via.
-
Se, durante "aggiornamento prima della distribuzione per il test", il membro del team entra in conflitto, seleziona i file in conflitto riga per riga.
- Quando arriva il momento in cui distribuiamo nuove funzionalità alla produzione, carico il codice di produzione da una particolare cartella sul disco (come "ramo fisico"), sincronizzo quel codice allo stato corrente di SVN, andando classe per classe , revisione del commit cambiata e presa del codice pensato per quella particolare implementazione. Di solito, accade che su 230 classi che abbiamo nel repository (e non nello spazio di lavoro di produzione) tra 30 e 50 classi sono in conflitto a causa delle caratteristiche che non abbiamo ancora bisogno di produzione. A volte, i clienti chiedono le ultime funzionalità prima che desiderano alcune funzionalità meno recenti. Se entrambe le funzionalità vogliono e le funzionalità non influenzano lo stesso file, devo saltare manualmente un determinato file dalla versione di commit 3 per eseguire il commit della versione numero 6 senza prendere qualsiasi modifica dai commit 4 o 5 Ora, se anche un altro file è interessato, succede che un altro file dalla versione, diciamo, 35, devo aggiornare alla versione 40 senza prendere alcuna modifica tra 35 e 40. Con SVN, è facile, sincronizzo un particolare file e seleziono solo le righe di codice ignorando tutte le altre. Ci vuole tempo, ma sono in grado di dire ai clienti "rimandiamo questo per X giorni".
Inoltre, se due sviluppatori stanno lavorando su diverse funzionalità che influenzano in gran parte lo stesso sottosistema o il grosso numero degli stessi file, al fine di evitare brutti conflitti e collisioni di solito dico ai clienti "non possiamo sviluppare entrambe le cose nello stesso tempo, posticiperemo la funzione B finché la funzione A non sarà terminata e testata "e uno degli sviluppatori si metterà al lavoro su qualcos'altro.
Ora, da Git l'unica cosa di cui ho fondamentalmente bisogno è:
- Nice Windows GUI (per SVN stiamo usando il plugin "Subclipse" per Eclipse). Non ho intenzione di investire molto tempo solo imparando o ricordando come spingere un ramo o visualizzare la cronologia o fare qualcosa di simile se può essere fatto con un clic di un pulsante. Per me, il sistema di controllo della versione dovrebbe essere solo uno strumento, non qualcosa che i miei sviluppatori dovrebbero dedicare più di un giorno a imparare come utilizzare a causa della CLI e cose avanzate che non useremo o non richiederemo. Con SVN utilizziamo solo 4 comandi: commit, update, synchronize (per vedere le differenze) e "history". Ok, a volte usiamo "confronta con la versione X da repo", ma non così spesso.
- La possibilità di ottenere una buona memorizzazione del codice usando solo pochi comandi di base (clic del pulsante per essere precisi: D): push / pull, fetch / commit, branch / merge, visualizza cronologia. Niente di stravagante o avanzato che richiederebbe molto tempo per imparare o capire.
- La capacità di prendere parzialmente i commit. Ad esempio: commit consiste di 10 file. Prendo tutte le modifiche da 8 file, ma per due file eseguo il cherry-pick in modo che dalla versione 5 di produzione corrente prendo due righe di codice dalla versione 7 del commit del file e poche righe dalla versione 9 del commit del file (mantenendo effettivamente quelle due file in "versione non definita" in modo che possa fornire ai miei clienti le modifiche più recenti senza tutte le modifiche al codice che precedono quella funzionalità più recente che desidero). Per raggiungere questo punto, per me non è un problema allocare un'intera giornata a scavare nella storia e commettere indipendentemente dal fatto che si tratti di SVN o Git. Quella è la mia giornata di "preparazione":)
- Avere versioni di commit numeriche, non quelle basate su HASH!
È possibile con Git? Ho un'esperienza limitata con Git, solo su alcuni piccoli progetti e non posso permettermi di spostare l'intero codice da un sistema all'altro :( Per favore, dammi un consiglio.