Perché dovrei scrivere un messaggio di commit?


18

Perché dovrei scrivere un messaggio di commit? Non voglio e penso che sia stupido ogni volta.

Un frontend GUI che uso e che diventerà senza nome ti costringe a farlo. Sento altri farlo ogni volta anche se stanno usando il VCS sulla riga di comando.

Se mi impegno più volte al giorno e non ho finito una funzione di cosa sto scrivendo? Scrivo SOLO un messaggio dopo molti commit e sento che è tempo di un mini tag o quando faccio un tag vero.

Ho ragione o mi sto perdendo qualcosa? anche io sto usando un sistema distribuito


1
Non preoccuparti, dì "blah" nella riga dei commenti. Fintanto che non condividi mai il codice con nessun altro e fintanto che nessun altro ci lavorerà mai e finché non avrai mai bisogno di ripristinare il codice e fintanto che non commetterai mai un singolo errore di codice e ... aspetta un minuto, perché stai usando di nuovo il controllo versione?
Michael Durrant,

Risposte:


24

A tutte le persone che dicono "commetti solo quando hai un messaggio utile e ben ponderato da scrivere e quando la tua funzione è completa al 100% e hai dei test unitari per questo", dico: sei ancora nella mentalità SVN .

Se stai usando git , questo è ciò che definirei un flusso di lavoro intelligente:

  1. Impegnati tutte le volte che vuoi . Scrivi qualsiasi vecchio messaggio veloce lì. Nessuno lo vedrà comunque.
  2. Dopo dire, 10 commit, hai finito quella funzione su cui stavi lavorando. Ora scrivi i test e commetti quei test. O qualunque altra cosa tu voglia. Se ti piace TDD, scrivi prima i test, non mi interessa, né git.
  3. git rebase -idal primo "disordinato" impegno aggiunto e corretto la cronologia locale comprimendo, modificando, omettendo e pulendo in altro modo la cronologia recente in commit logici e puliti con messaggi gradevoli .
  4. Dopo la pulizia, chiedi a qualcuno di ritirarti.
  5. Risciacqua e ripeti.

Nota che il passaggio 3 è quando finisci con quei bei commit che stavi cercando e che usando SVN dovresti astenervi dal commettere fino a quando non hai fatto i primi due passaggi, che è ciò che la maggior parte delle altre risposte sta suggerendo. IOW, non vuoi infliggere il tuo codice non scritto e non testato su altri, quindi non ti impegni per una settimana, fino a quando la tua funzione non sarà terminata. Non stai utilizzando il controllo versione al suo pieno potenziale.

Si noti inoltre che ovunque tra i passaggi 1 e 3, è possibile git pushapportare modifiche al proprio mirror repo privato sul server per ottenere backup gratuiti se l'HDD del laptop si spegne.


Buona risposta, mi piace. Ho un po 'paura di usare rebase. Ecco un articolo su come andare storto e su come ripristinarlo bluemangolearning.com/blog/2009/03/…

@acid, se stai modificando le tue modifiche private, non dovrebbero esserci conflitti. Inoltre, devi sforzarti di perdere qualsiasi cosa in git.
Alex Budovski,

4
il mio flusso di lavoro, git rocks
Nazgob,

1
@Boris: Perché sta chiaramente parlando di git che NON è chiaramente una sovversione

3
Non dovrebbe davvero essere un lavoro significativo scrivere una frase che affermi ciò che hai appena fatto e distruggere la storia con rebase sembra odioso. Supponiamo di aver introdotto un bug nel quinto di quei dieci commit che non viene rilevato fino a una settimana dopo. Essere in grado di appuntarlo su un singolo piccolo commit ti aiuterà molto.
Gort il robot,

55

Perché quando un povero manutentore sta cercando un bug e scopre che è stato aggiunto in rev. xyz, vorrà sapere quale rev. xyz avrebbe dovuto farlo.


38
Bene, allora può leggere le 5.000 righe di spaghetti che ho appena registrato, JEESH !!! Alcune persone sono semplicemente pigre!
Edward Strange,

9
Perché quando il povero succhiatore ti segue (tra 3 anni) e guarda la storia e va ... WTF .. WTF .. WTF, almeno avrà un'idea di quello che stava succedendo. Puoi facilmente aggiungere un commento come "check-in di routine, funzione X, incompleta".
Velocemente il

3
@ acidzombie24: Poiché ogni commit dovrebbe dire a cosa serviva, anche se si tratta di un "errore di battitura corretto in ....", non ha senso nella cronologia delle revisioni, a meno che non si sappia a cosa servono le revisioni.
Orbling,

11
@quickly_now, il povero succhiatore potrebbe persino essere te stesso. Purtroppo questa è una delle cose che devi sperimentare per apprezzarlo appieno.

2
@acidzombie - perché stai controllando le modifiche incomplete ??
Edward Strange,

35

Commenta il tuo codice sorgente, giusto?

Scrivi i migliori commenti, quelli che dicono perché il codice dice solo come ?

Il messaggio di commit è un tale commento, quindi è molto importante e più si pensa a farlo nel modo giusto, più è utile per un futuro manutentore del software.

Per qualsiasi software attivo, questo particolare commento finirà per essere mostrato in qualcosa del genere

gitk: tutto il campione

(disponibile su http://longair.net/blog/2009/04/25/a-few-git-tips/ ). Ciò consente una visione a volo d'uccello di chi ha lavorato al software quando e cosa hanno fatto.

Si noti che questo è l'obiettivo finale del commento di commit, ovvero presentarsi in tale elenco che dice " cosa " al proprio sé futuro o al proprio collega, e QUESTO è il motivo per cui si dovrebbe occuparsi di scrivere buoni messaggi di commit.


2
@acidzombie, posso parlare solo per git, ma puoi impegnarti in piccoli passi localmente e poi raggrupparli tutti in un unico commit quando spingi a monte. Tale messaggio di commit può quindi essere descrittivo.

2
@acidzombie, perché ti impegni se non hai apportato abbastanza modifiche per giustificare un commento? Spiega per favore.

2
@Thor: poiché il controllo della versione protegge il tuo codice dalle perdite e anche il codice a metà deve essere protetto.
Ben Voigt,

1
@Ben, i commit sono per l'archiviazione a lungo termine e dovrebbero riflettere accuratamente i "blocchi" di lavoro. La protezione contro la perdita è secondo me ortogonale al controllo della versione e dovrebbe essere gestita da un sistema di backup adeguato. Ho trovato Time Machine per Mac estremamente adatto a questo scopo - spero che un sistema simile sia disponibile per Windows.

2
+1 Sono un fan di non inquinare il mio controllo del codice sorgente con commit senza significato. Rende più facile la ricerca di un particolare commit (tramite commenti utili) e so che quando controllo il codice, è sempre funzionante. Il software di backup tradizionale è un'opzione migliore per proteggere il mio repository locale tra gli commit. Funziona bene con un DVCS, ma devi ricordare che un check-in locale non è in realtà un backup del tuo codice.
Adam Lear

15

Se il messaggio di commit ti sembra stupido, sembra che tu stia usando i commit errati.

Gli impegni dovrebbero essere effettuati per una buona ragione: dovrebbero essere correlati alle attività che hai suddiviso per la funzione su cui stai lavorando. Indipendentemente dal fatto che tali compiti siano formali o solo nella tua mente, ogni modifica che commetti dovrebbe più o meno completare un'attività e quindi essere funzionale in qualche modo.

Quindi i tuoi messaggi di commit hanno uno scopo molto migliore. Descrivi l'attività che hai completato e se non è stata rintracciata da qualche altra parte, perché tale attività era necessaria o quale scopo serve:

  • Rifattorizzata la classe utente per un migliore incapsulamento
  • Stub API creati in modo che le interfacce possano essere utilizzate nella classe controller
  • Conversione della classe del database in una classe astratta in modo che un database simulato possa essere utilizzato in casi di test

Quindi tu o altri sviluppatori potete navigare nel repository o nella cronologia dei file e vedere abbastanza facilmente dove sono avvenute determinate evoluzioni e perché. Oppure, se una particolare revisione viene dichiarata colpevole di un bug, il messaggio di commit fornirà un indizio sul motivo per cui quella linea è stata inserita, in modo da non solo strapparla e possibile rigirare qualcosa che si pensava fosse risolto e puoi invece risolverlo nel modo giusto.


1
+1, sembra che stia commettendo troppo frequentemente o in punti di arresto difettosi. Se desidera solo un buon punto di backup per alcune modifiche sperimentali, può utilizzare l'indice, un ramo temporaneo, modificare i precedenti commit invece di crearne di nuovi o persino utilizzare il buffer di annullamento nel suo editor.
Karl Bielefeldt,

1
@Karl: IIRC linus nel suo git google talk ha detto che in media vengono eseguiti 6 commit al giorno. Ora, non so quanto sia considerato troppo, ma in questo progetto in questo momento mi sono impegnato quando ho avuto un po 'di riflessione (ho fatto il ciclo dei dati giusti, non ho fatto nulla con esso), dopo aver generato l'interfaccia ma prima che la serializzazione funzioni. e ora sto lavorando per far funzionare la serializzazione anche se ho avuto l'interfaccia 2 ore fa. Mi impegnerò e dirò "basi di riflessione" una volta che funziona, ma sui primi tre perché dovrei mai lasciare un commento quando posso facilmente vedere quando una funzionalità "funziona" ogni x commette.

In realtà potrei trattenermi fino a quando non avrò qualche test di base perché altrimenti, se commento ogni commit come faccio a sapere quale di questi ha una riflessione stabile? "nozioni di base sulla riflessione", "serializzazione della riflessione" "test di serializzazione della riflessione" Supponendo che la serializzazione sia un must, potrebbe essere la seconda o la terza. Test può significare unit test o test può significare test se si lavora sulle classi di base di cui ho bisogno. Penso che commentare abbia senso quando posso dire "nozioni di base sulla riflessione" piuttosto che indovinare quale di queste in realtà significhi che le basi stanno funzionando. Inoltre è più facile da sfogliare / trovare quando c'è meno da leggere.

@acid, l'intero scopo di un commit è quello di essere in grado di ripristinarlo o confrontare le modifiche con esso. Se mai hai bisogno di farlo con i tuoi precedenti impegni, come fai a sapere quale scegliere? Non devi scrivere romanzi, qui. "funzionamento dell'interfaccia", "funzionamento della serializzazione" e "funzionamento della riflessione" vanno bene secondo me. Non esiste un numero massimo fisso di commit al giorno, ma se i tuoi messaggi indicano "lavoro sull'interfaccia" "lavoro sull'interfaccia" "interfaccia quasi completata", ti impegni troppo spesso e dovresti semplicemente usare l'indice.
Karl Bielefeldt,

@Karl: qual è l'indice tra? so che git ha una scorta ma non credo che tu ne stia parlando. Che cosa fa?

12

I commenti di commit non risolvono tutto. C'è sempre la possibilità che possano fuorviare tanto quanto aiutano, specialmente quando gli sviluppatori sono arrabbiati di doverli inserire. Prova questo: considerali come una scia di briciole di pane nei boschi o un waypoint alpinistico o proiettili traccianti. Fatto bene, possono delineare un percorso altrimenti confuso.

Non farne un grosso problema. Essere onesti:

  • "Modifica entità dell'indice spaziale, Daos e UI per gestire la funzione X"
  • "Check-in incrementale per richiesta funzionalità # 1234 e bug # 5678"
  • "Ho rotto l'ultima build. Questi sono i file che ho perso."

Tienilo breve e "quadro generale". Se possibile, fare riferimento a un numero di problema nel sistema di funzionalità / bug. Alcune UI di controllo versione includono un campo per questo tipo di cose.


2
+1 per l'idea di mantenerlo breve. Breve, semplice e abbastanza buono va perfettamente bene.
Velocemente il

1
Secondo me una guida ancora migliore sarebbe la ricetta comune "il più breve possibile, il più a lungo necessario"; poiché a volte semplicemente non è possibile mantenerlo breve senza sacrificare le informazioni essenziali
hvr

11

Riduce il numero di WTF / minuto;)

inserisci qui la descrizione dell'immagine

che si traduce in una squadra più felice (che non ti odia) e in una migliore produzione di squadra potenzialmente a costi inferiori


4
Vorrei votare questo se approfondissi il motivo per cui è vero.
SingleNegationElimination,

@TokenMacGuy - Mi dispiace, non sto seguendo.
Arriva il

1
In che modo i messaggi di commit espressivi riducono i WTF / minuti (lo fanno certamente)
SingleNegationElimination,

@TokenMacGuy - Pensavo fosse ovvio.
Arriva il

9

Quindi il resto del tuo team sa che WTF stai facendo il check-in delle modifiche all'albero del progetto.


7
Aggiungo messaggi di commit per i miei progetti, quando sono l'UNICO SVILUPPATORE! Perché quando torno tra 2 anni a guardare queste cose, voglio sapere WTF che stavo facendo in quel momento. So perfettamente che il 99% delle volte non verrà esaminato. L'1% delle volte mi farà risparmiare 2 settimane di agonia e penso che il prezzo di inserimento di un messaggio di commit di 10 secondi valga il beneficio a lungo termine che otterrò.
Velocemente il

@quickly_now, anche l' agonia ? Il tuo codice è così male?

1
@quickly_now: Amen a quello. Nel giro di un anno o due, mi esce un sacco di codice, cosa dovrebbe fare l'ultimo bit dopo mesi, solo Dio lo sa. Dio, e la mia cronologia delle revisioni.
orbita il

Oh si. Anch'io sono d'accordo. Lo considero un'esperienza == umiltà.
Michael Durrant,

8

perché se non ti eserciti a inserire messaggi di commit decenti, finirai come il mio collega che inserisce messaggi come

no changes

o

testing

per commit con oltre un centinaio di file modificati (non scherzo qui !!).

Se diventi un tale sviluppatore, sembrerai stupido agli occhi del resto del mondo, non importa quanto pensi che sia stupido semplicemente inserire un messaggio.


1
sembra un candidato perfetto per la revisione tra pari prima di impegnarsi, se mai ne avessi sentito uno.

2
oh amico, ho lavorato con questo tipo di persone. Mi fa impazzire.
sevenseacat,

4

Perché ti impegni se le modifiche non sono significative?

Impegna solo le modifiche che hanno un significato. Ad esempio ho fatto un refactoring piuttosto grande l'altra settimana che mi ha richiesto circa 3 giorni. Avrei avuto un sacco di impegni durante quel periodo. Alcuni erano cambiamenti piuttosto piccoli ("ribattezzato la classe da X a Y per riflettere le nuove responsabilità" o "spostato il metodo Z () nella classe Q") e altri erano molto grandi. Quando ho finito con una caratteristica / refactoring, controllo se alcuni commit potrebbero essere schiacciati (almeno git lo supporta, non so altri strumenti), ma di solito li lascio così com'è perché aiuta in seguito.

Immagino che non ti impegneresti a modificare una linea, quindi dovrebbe avere un significato. Descrivi semplicemente cosa hai fatto dall'ultimo commit.


3

immagina una condizione quando hai rotto il sistema apportando alcune modifiche e realizzalo dopo diversi impegni da parte del team. Non ricordi quale sia stata la modifica, ma ricordi che qualcosa potrebbe andare storto quando stavi migliorando la funzione X o rimuovendo un file dal modulo Y.

Ma sfortunatamente il numero di revisione non ti dice quando hai cambiato X o Y. Quindi la tua scelta o leggi tutti i codici impegnati negli ultimi N giorni o semplicemente leggi i messaggi di commit dettagliati che hai scritto (molto più leggibili del codice).

Quindi, se scrivi lo stesso, noioso, inutile testo non correlato nel messaggio di commit, perché devi farlo, è più dannoso che avere un messaggio di commit. Perché invece di trovare la radice del bug, il messaggio sbagliato ti guiderà.

Quindi prova a scrivere messaggi di commit significativi ogni volta che commetti, il che può aiutare te e anche il manutentore.


Perché dovrei farlo durante ogni commit anziché alla fine della giornata, a giorni alterni o quando finisco una funzione?

1
perché lo commetti spesso, se non ha una ragione "naturale"?

Mi impegno ogni volta che apporto alcune modifiche significative, quindi può riflettersi nel repository e altri sviluppatori possono verificarle. Ma la risposta che hai dato aiuta ad avere un occhio d'uccello su ciò che viene fatto da chi e quando.
GG01,

@ acidzombie24 Beh, non commettere cose finite a metà a meno che tu non debba davvero farlo. E così le altre persone possono vedere cosa stai facendo / lavorando quando chiami un giorno malato e niente funziona. Almeno così puoi ricordare da dove eri rimasto quando devi sederti nelle riunioni per 2 giorni. O così puoi individuare più facilmente quale revisione ha rotto una build e guardare il diff.
nn.

@ Thorbjørn: Perché non dovrei commettere un cambiamento che non voglio ripetere?

3

Se stai lavorando con gli altri, i messaggi di commit sono molto importanti per vedere effettivamente cosa hanno fatto gli altri: cercare le differenze per ognuno di essi è molto più lavoro e potresti non riuscire a capire perché qualcuno lo abbia fatto. Se lavori con altri e qualcuno (forse non tu) deve effettivamente guardare indietro, ad esempio per tenere traccia del modo in cui il comportamento è cambiato dalla versione precedente in modi inaspettati ... stai davvero rendendo la vita difficile non usando un suggerimento utile nel commit Messaggio.

Se lavori da solo ... su un progetto che è per lo più codificato "così com'è" (ad esempio un singolo sito Web o script semplice) posso più o meno vedere da dove vieni. Se lavoro su qualcosa del genere, mi preoccupo solo della data / ora o delle modifiche più recenti quando continuo a lavorare su qualcosa (hai un punto su cui ripristinare, ma che conta solo durante lo sviluppo, non dopo averlo implementato). Il controllo della versione è solo un modo per fare backup con pochi problemi - concordo pienamente sul fatto che non sta facendo un uso completo del sistema - ma su alcuni progetti su piccola scala, che potrebbero non essere necessari.

L'idea mi è venuta in mente prima che il controllo versione venisse utilizzato in due modi diversi, uno per documentare i cambiamenti nel progetto e l'altro come aiuto per gli sviluppatori sul posto ... e quei due sono totalmente diversi l'uno dall'altro. I messaggi di commit sono molto importanti in un modo e potrebbero essere per lo più inutili nell'altro.


3

Ti stai perdendo qualcosa. Ci deve essere un motivo per eseguire un commit altrimenti non lo faresti.

Tutto quello che devi fare nel commento è di esprimere il motivo in parole, anche se solo wip: adding new state objects


Esattamente. Anche se (come accennato in precedenza) è solo un codice che non vuoi ripetere bene, ovviamente significa qualcosa, quindi non dovrebbe essere difficile scrivere un sommario super-rapido di esso.
sevenseacat,

2

Come molti altri, faccio un po 'di codice nel mio tempo libero e utilizzo un sistema di controllo delle revisioni per monitorare sia il mio sviluppo che i miei cambiamenti. La quantità di tempo libero che ho a disposizione varia notevolmente da settimana a settimana e da mese a mese. Molte sono state le occasioni in cui non avrei avuto il tempo di scrivere un codice su un progetto per settimane o addirittura mesi, e il tempo che avevo in genere andava da 10 minuti (giorno tipico) a 40 minuti (buona giornata). Quelle certamente non sono ottime condizioni, soprattutto per problemi di debug.

Era essenziale tenere appunti che non si sarebbero persi e sarebbero stati facilmente recuperabili. Alla fine di ogni sessione, il lavoro della sessione verrebbe eseguito con un messaggio dettagliato. Potrei quindi passare attraverso la cronologia degli impegni e tenere traccia dei miei progressi e del mio processo di pensiero. Questo mi ha permesso di riprendere da dove ero la settimana scorsa, o il mese scorso con il minor tempo prezioso perso.

Il punto che sto cercando di illustrare è che buoni messaggi di commit aiutano te (e chiunque altro venga dopo di te) a capire cosa è successo, cosa sta succedendo, dove stanno andando le cose e soprattutto perché.


2

Pensaci logicamente per un minuto. Quando commetti significa che qualcosa è stato fatto. Se non lasci nessun messaggio, come faranno gli altri a sapere cosa è stato fatto?


Uno sguardo al mio codice incredibilmente ovvio e sapranno immediatamente tutto ciò che fa e tutti i test incredibili che supera il 100%. Scusa, sono di umore umoristico stasera [quindi sto scherzando];)
Michael Durrant,

1

Se non commentate i vostri impegni, potreste essere tentati di commentare il cambiamento nella fonte. Nel tempo, ciò può ingombrare la fonte.


2
non sono tentato di farlo

1

I messaggi di commit sono a modo rapido per sapere cosa sta succedendo in quel check-in e aiuteranno gli altri sviluppatori del tuo team quando vogliono sapere quale aspetto del codice è cambiato in quali revisioni (per motivi diversi).

In una nota correlata, suggerirei di specificare il numero del caso del tracker dei bug (spero che tu ne stia usando uno) nel messaggio di commit, in modo che sia utile per il futuro tracciare facilmente le cose.


1

In modo che il manutentore di quel codice 1 anno dopo sappia chi dare la caccia a quel codice atroce. :)


Ecco a cosa blameserve la funzione di vcs.
Peter Taylor,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.