La cronologia delle versioni è davvero sacra o è meglio ribasare?

25

Sono sempre d'accordo con il mantra di Mercurial 1 , tuttavia, ora che Mercurial viene fornito in bundle con l'estensione di rebase ed è una pratica popolare in git, mi chiedo se possa davvero essere considerato come una "cattiva pratica", o almeno abbastanza brutta da non usare. In ogni caso, sono consapevole del fatto che il ribellarsi sia pericoloso dopo aver spinto.

OTOH, vedo il punto di provare a impacchettare 5 commit in uno solo per renderlo più accattivante (specialmente in un ramo di produzione), tuttavia, personalmente, penso che sarebbe meglio essere in grado di vedere i commit parziali ad un funzione in cui è fatta qualche sperimentazione, anche se non è così elegante, ma vedere qualcosa come "Ho provato a farlo in modo X ma non è ottimale come Y, dopotutto, facendo Z prendendo Y come base" IMHO avrebbe un buon valore a quelli che studiano il codice base e seguono il pensiero del programmatore.

Il mio punto di vista molto opinato (come in ottuso, viscerale, parziale) è che i programmatori amano rebase per nascondere gli errori ... e non penso che questo sia positivo per il progetto.

Quindi la mia domanda è: hai davvero trovato utile avere tali "commit organici" (cioè la storia non controllata) nella pratica? o, al contrario, preferisci imbattersi in commessi ben confezionati e ignorare il processo di sperimentazione dei programmatori? ?; quale dei due hai scelto, perché questo funziona per te? (avere altri membri del team per conservare la cronologia, o in alternativa, ridistribuirla).

1 per Analisi di Google DVCS , in Mercurial "La storia è sacra ".

    
posta dukeofgaming 04.06.2012 - 21:59
fonte

6 risposte

21

La cronologia è sacra, il presente non lo è. Puoi dividere il tuo "albero" DVCS in due parti:

  • La passata / history che contiene una visualizzazione accurata di come hai raggiunto lo stato corrente del codice. Questa parte della cronologia cresce nel tempo

  • Il presente a quale parte stai lavorando per far evolvere il tuo codice. Questo suggerimento per la maggior parte della cronologia ha sempre le stesse dimensioni.

Ogni codice che hai pubblicato o usato in qualche modo fa parte del passato . Il passato è sacro perché è necessario essere in grado di riprodurre una configurazione o capire cosa ha introdotto una regressione. Non dovrai mai riscrivere il passato . In git di solito non riscrivi mai nulla una volta che è in master: master è la parte passata della cronologia. In Mercurial hai questo concetto di fase pubblica che tiene traccia della parte passata del tuo "albero" "e applica la sua immutabilità.

La parte presente del codice è il changeset su cui stai lavorando. Il ramo di funzionalità che stai cercando di rendere utilizzabile, privo di bug e correttamente refactored. È perfettamente corretto riscriverlo è anche una buona idea perché rende la parte precedente più carina, semplice e utilizzabile. Mercurial traccia questo nella fase bozza .

Quindi sì, ti preghiamo di rebase se migliora la tua cronologia. Mercurial ti impedirà di spararti ai piedi se stai rifondando cose che non dovresti.

    
risposta data 08.06.2012 - 11:38
fonte
7

Non tutti gli errori sono del tipo che è necessario nascondere, ad esempio, una volta ho accidentalmente eseguito un file binario nel mio repository. La manomissione della cronologia è solo negativa quando l'errore non è esclusivamente nella cronologia stessa, come i file impegnati che non dovrebbero essere.

    
risposta data 04.06.2012 - 22:44
fonte
7

La revisione del codice è molto più semplice quando c'è un grosso cambiamento coesivo rispetto a molti piccoli dipendenti.

Quando lavoro su una nuova funzione, mi piace commettere un sacco di piccoli cambiamenti nella mia filiale. Quando sono pronto per inviare la patch, collasso quei piccoli commit in un grosso commit che rappresenta tutto il nuovo codice richiesto per quella funzionalità. Qui è dove rebase è utile.

D'altro canto, rebase è sconsigliato se i commit non hanno nulla a che fare l'uno con l'altro. Più aggiunte di caratteristiche dovrebbero essere commit separati (e idealmente provengono da rami separati).

    
risposta data 05.06.2012 - 01:48
fonte
4

La tua domanda descrive la cronologia come una serie di modifiche al codice ordinate, e chiede se indizi organici indichino o meno futuri lettori nel processo di sviluppo. Eppure come una versione / ingegnere dell'integrazione, non penso spesso alla storia come al codice. Sono di più assorbito dalla storia che racconta la mia storia, la conoscenza istituzionale mantiene e se mi consente o meno di eseguire rapidamente il debug dei problemi.

Non penso che i flussi di lavoro organici lo facciano bene, anche il mio. Qualità che valore su DVCS quando sto codificando - filiali economiche, commit rapidi, salva in remoto presto e spesso - non sono quello che apprezzo come la integrazione della mia azienda manager. Emetto git rebase , git merge , git diff e git apply molto più spesso in quel ruolo di git add o git commit . Strumenti come rebase mi permettono di trasforma il codice che mi è stato dato da qualcosa in cui funzioni qualcosa che può essere mantenuto.

I commit illogici o vaghi non sono utili, ma sono peccaminosamente facili da scrivere organicamente, quando la preoccupazione principale è far funzionare il codice, non distribuirlo ad altri. Commits come Case 15: Fixed a problem , o Refactored <cranky legacy feature> rendono la mia auto-compiacenza, anche quando li autore. Nessuno, tuttavia, induce la rabbia blackout come commit "incrementale". Considera questo argomento che uno sviluppatore mi ha consegnato l'altro giorno:

$ git log production..topic --oneline
f9a1184 incremental update
156d299 incremental commits
e8d50b0 new incremental updates
511c18c incremental updates, refactor
1b46217 incremental upgrade
9e2b3b8 incremental update
fa68a87 incremental update

Queste cose sono malvagie. È come se il DVCS fosse progettato per il Dr. Faustus. darò controllo sorgente facile e veloce. Tu mi dai il tuo codice anima del manutentore. Tutti i commessi pigri sono atti egoistici. Molti di noi li scrivono, ma dobbiamo anche i nostri sé futuri logici, replicabili, storia debuggable. Non possiamo farlo senza alcuno sforzo a rebase .

Per quanto riguarda gli esperimenti falliti, perché non descriverli nei nostri messaggi di commit (recentemente pristine)? A un anno da ora non ho bisogno di un frammento mezzo finito. Voglio solo una registrazione del tentativo abortito, e forse una breve spiegazione se penso di essere abbastanza sciocco da provare di nuovo. Ci sono molti flussi di lavoro di successo nel mondo, ma non riesco a pensare a nessuna ragione per cui ordinerò deliberatamente codice spezzato a una base di codice di produzione.

    
risposta data 06.07.2012 - 07:26
fonte
2

Niente dovrebbe essere sacro, ma assicurati di avere delle buone ragioni per quello che stai facendo. Rebasing è estremamente potente se usato correttamente, ma come con qualsiasi strumento potente può creare confusione e causare problemi se usato con noncuranza.

Personalmente trovo molto utile rebase di un ramo di funzionalità locale contro trunk (o ramo di sviluppo principale) prima di eseguire i test finali e unire la funzione nel ramo principale. In questo modo riesco a gestire eventuali conflitti di fusione ecc. Prima di fonderci.

    
risposta data 05.06.2012 - 10:55
fonte
1

IMHO, gli esperimenti di solito appartengono agli scaffali o ai rami temporanei, non alle linee di base. Se segui questo, non dovrebbe esserci un problema, poiché tutti i commit saranno logicamente validi e aggiungeranno qualche valore.

    
risposta data 04.06.2012 - 22:33
fonte

Leggi altre domande sui tag