C'è un modo per elencare tutti i commit che hanno cambiato un file specifico?
C'è un modo per elencare tutti i commit che hanno cambiato un file specifico?
Risposte:
I --follow
lavori per un particolare file
git log --follow -- filename
Differenza rispetto ad altre soluzioni fornite
Si noti che altre soluzioni includono git log path
(senza --follow
). Tale approccio è utile se si desidera tenere traccia, ad esempio, delle modifiche in una directory , ma inciampa quando i file sono stati rinominati (quindi utilizzare --follow filename
).
--follow
rappresenta i nomi, quindi è più robusto digit log -- path
--follow
accetta un percorso , che può essere un file ma anche una directory. Nel caso di quest'ultimo verrà eseguito in modo ricorsivo e riporterà le modifiche a tutti i file al di sotto di quel punto. (Questo comportamento non è documentato nella manpage e potrebbe non essere permanente.)
git log filename?
git log filename
non segue la ridenominazione dei file, ovvero mostrerà tutti i commit relativi a quel nome file (non al file effettivo). Se si creano file X
e Y
, cambiati entrambi, quindi eliminato Y
e rinominato X
per Y
e poi anche cambiato, e si corre git log Y
, si otterrà i messaggi sia vecchio Y
e nuovo uno. E al contrario, con --follow
te otterrai dei commit riguardo a quel file quando è stato nominato X
e quando è stato nominato Y
.
git log path
dovrebbe fare quello che vuoi. Dal git log
uomo :
[--] <path>…
Show only commits that affect any of the specified paths. To prevent confusion with
options and branch names, paths may need to be prefixed with "-- " to separate them
from options or refnames.
L'ho osservato da vicino e tutte queste risposte non sembrano davvero mostrarmi tutti gli impegni in tutti i settori.
Ecco cosa mi è venuto in mente facendo un casino con le opzioni di visualizzazione di modifica di Gitk. Questo mi mostra tutti i commit per un file indipendentemente da branch, local, reflog e remote.
gitk --all --first-parent --remotes --reflog --author-date-order -- filename
Funziona anche con git log
:
git log --all --first-parent --remotes --reflog --author-date-order -- filename
--reflog
include i commit che sono stati rielaborati / modificati o altrimenti scartati. Forse dovrebbe essere ovvio, ma ho provato a usarlo con git log
e stavo cercando di capire perché stavo vedendo commit apparentemente duplicati!
Utilizzare il comando seguente per ottenere commit per un file specifico:
git log -p filename
git log -p mybranch -- filename
o semplicemente usare git log --all -- filename
per cercare in tutti i rami.
Dovrebbe essere semplice come git log <somepath>
; controlla la manpage (git-log(1)
).
Personalmente mi piace usare in git log --stat <path>
modo da poter vedere l'impatto di ogni commit sul file.
-p
se vuoi vedere il diff completo, non solo che è stato modificato un certo numero di righe.
git show
sui commit specifici che sembrano importanti.
In alternativa (da Git 1.8.4), è anche possibile ottenere tutti i commit che hanno cambiato una parte specifica di un file. Puoi ottenerlo passando la riga iniziale e il numero della riga finale.
Il risultato restituito sarebbe l'elenco di commit che ha modificato questa particolare parte. Il comando va come:
git log --pretty=short -u -L <upperLimit>,<lowerLimit>:<path_to_filename>
dove upperLimit
è il start_line_number
ed lowerLimit
è ilending_line_number
Ulteriori informazioni - https://www.techpurohit.com/list-some-useful-git-commands
Come ha sottolineato jackrabb1t, --follow
è più robusto poiché continua a elencare la storia oltre i nomi / le mosse. Quindi, se stai cercando un file che non è attualmente nello stesso percorso o un file che è stato rinominato in vari commit, --follow lo seguirà.
Questa può essere un'opzione migliore se si desidera visualizzare le modifiche al nome / percorso:
git log --follow --name-status -- <path>
Ma se vuoi un elenco più compatto con solo ciò che conta:
git log --follow --name-status --format='%H' -- <path>
o anche
git log --follow --name-only --format='%H' -- <path>
Il rovescio della medaglia è che --follow
funziona solo per un singolo file.
--follow
funziona per un singolo percorso , che potrebbe essere una directory. Se viene passata una directory, verrà eseguita in modo ricorsivo e riporterà le modifiche a tutti i file al di sotto di quel punto.
Se si sta tentando di - seguire un file eliminato in un precedente commit
git log --follow -- filename
git
neofiti: utilizzare anche git log -p --follow -- filename
per visualizzare le modifiche. Nota anche: "nome file" può essere un file, una directory o un sottomodulo.
Se vuoi visualizzare tutti i commit che hanno cambiato un file, in tutti i rami, usa questo:
git log --follow --all <filepath>
Se vuoi cercare tutti i commit per filename
e non per filepath
, usa:
git log --all -- '*.wmv'
Se desideri visualizzare tutte le modifiche apportate a commit che hanno modificato un determinato file (anziché solo le modifiche al file stesso), puoi passare --full-diff
:
git log -p --full-diff [branch] -- <path>
[branch]
gitk <path_to_filename>
Supponendo che il pacchetto "gitk" sia già installato.
Se non è installato, procedere come segue:
sudo apt-get install gitk
E quindi provare il comando sopra. È per Linux ... Potrebbe aiutare gli utenti Linux se vogliono una GUI.
gitk
è in bundle con Git per Windows.
Per ottenere un elenco degli hash di commit utilizzare git rev-list
git rev-list HEAD <filename>
Produzione:
b7c4f0d7ebc3e4c61155c76b5ebc940e697600b1
e3920ac6c08a4502d1c27cea157750bd978b6443
ea62422870ea51ef21d1629420c6441927b0d3ea
4b1eb462b74c309053909ab83451e42a7239c0db
4df2b0b581e55f3d41381f035c0c2c9bd31ee98d
il che significa che 5 commit hanno toccato questo file. È in ordine cronologico inverso, quindi il primo commit nell'elenco b7c4f0d7
è il più recente.
Su Linux puoi usare gitk per questo.
Può essere installato usando "sudo apt-get install git-gui gitk". Può essere utilizzato per visualizzare i commit di un file specifico tramite "gitk <nome file>".
# Shows commit history with patch
git log -p -<no_of_commits> --follow <file_name>
# Shows brief details like "1 file changed, 6 insertions(+), 1 deletion(-)"
git log --stat --follow <file_name>