Git: come analizzare il codice che ha una storia multi-file?
Domanda
sto per spostare una tonnellata di file intorno a un progetto esistente. Prima di fare questo, mi piacerebbe avere una solida conoscenza su alcune tecniche utilizzate per analizzare il codice che ha una storia multi-file.
Come posso utilizzare git per chiedere: "dove questa riga di codice viene da" quando il contenuto è spostato attraverso più file in essa contenuti del tempo di vita?
Lo so git non tiene rinomina in modo esplicito (per una buona ragione) in modo che sembra che dovrei essere in grado di chiedere questo, io non sono sicuro di come solo. Se ci sono il metodo di visualizzare questa che sarebbe bello sapere troppo.
Soluzione
Vorrei raccomandare a guardare tre strumenti nella casella degli strumenti git. Il primo è colpa, che è molto simile come in cvs. Esso mostra che impegnano ultima toccato ogni riga in un file. Se si vuole guardare vedere quello che c'era prima, si può prendere il commit che ha toccato la linea e guardare il commit precedente.
git show <sha1_of_interesting_commit>^ -- file/path
È possibile ripetere la colpa per vedere quello che è successo prima.
git blame <sha1_of_interesting_commit>^ -- file/path
Il secondo strumento sta usando --follow
per tenere traccia dei file passato rinomina.
git log --follow -- file/path
Il terzo - e forse lo strumento più utile - è l'opzione piccone per il login. Questo cerca la storia per le modifiche le linee rimossi, introdotti o modificati che includono un dato po 'di testo. Ciò è particolarmente utile per il monitoraggio cose come i nomi delle funzioni. Può essere di nuovo in un file in un particolare impegno, ma lo ha fatto venire da un file di origine diversa? Era una chiamata ad esso aggiunto, allo stesso tempo, o prima si muoveva?
git log -S"Interesting_Function"
Se si sta utilizzando una patch o stat opzione (per esempio -p
o --stat
) l'uscita sarà limitato a quei file i cui cambiamenti in realtà coinvolto la stringa di ricerca a meno che non si utilizza anche --pickaxe-all
in cui viene visualizzato l'intero cambiamento.
In combinazione con git grep
per mostrare dove tutte le occorrenze di una stringa attuali sono, piccone è uno strumento di storia mineraria estremamente utile.
Altri suggerimenti
git blame
è quello che si usa per chiedere "dove ha fatto questa riga di codice viene?". Non so se si gestisce rinomina. Probabilmente fa.