Come posso elencare tutti i commit che hanno cambiato un file specifico?


804

C'è un modo per elencare tutti i commit che hanno cambiato un file specifico?


1
Stai cercando modifiche a un file su un singolo ramo; attraverso tutte le filiali locali; attraverso tutti i rami su un singolo telecomando; o attraverso tutto? Penso che tutto ciò richiederà una sceneggiatura.
benhorgen,

Risposte:


1083

I --followlavori 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).


32
+1 --followrappresenta i nomi, quindi è più robusto digit log -- path
Gabe Moothart il

42
Nota che --followaccetta 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.)
StvnW

5
Qual è la differenza tra quello e sologit log filename?
Va

8
@SaulOrtega, git log filenamenon segue la ridenominazione dei file, ovvero mostrerà tutti i commit relativi a quel nome file (non al file effettivo). Se si creano file Xe Y, cambiati entrambi, quindi eliminato Ye rinominato Xper Ye poi anche cambiato, e si corre git log Y, si otterrà i messaggi sia vecchio Y e nuovo uno. E al contrario, con --followte otterrai dei commit riguardo a quel file quando è stato nominato X e quando è stato nominato Y.
MarSoft,

7
usa "git log --all nomefile" per visualizzare tutti i commit in tutti i rami
Lebnik

122

git log pathdovrebbe fare quello che vuoi. Dal git loguomo :

[--] <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.

11
Non funziona se il percorso del file è cambiato. La risposta di Jackrabbit funziona per questo caso.
kwahn,

1
Questo funziona se è necessario limitare il registro in un ramo specifico
AMS

64

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

11
Questo è perfetto per quando qualcuno apporta modifiche ma dimentica dove ha effettuato le modifiche.
earthmeLon

2
Molto utile. Include anche stash commit
Juan Antonio Tubío,

Questa dovrebbe essere la risposta preferita. La domanda era trovare tutti gli impegni, questo lo fa.
Carl verbiest,

Si noti che --refloginclude i commit che sono stati rielaborati / modificati o altrimenti scartati. Forse dovrebbe essere ovvio, ma ho provato a usarlo con git loge stavo cercando di capire perché stavo vedendo commit apparentemente duplicati!
Soren Bjornstad,

43

Utilizzare il comando seguente per ottenere commit per un file specifico:

git log -p filename

8
Capisco che questo non risponde esattamente alla domanda poiché voleva un elenco di commit, ma questo è oro e va nel mio file.
zkent,

3
Questo non funzionerà affatto se il file non esiste nel ramo attualmente estratto. Puoi aggiungere il ramo come git log -p mybranch -- filenameo semplicemente usare git log --all -- filenameper cercare in tutti i rami.
Soren Bjornstad,

37

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.


9
O anche -pse vuoi vedere il diff completo, non solo che è stato modificato un certo numero di righe.
Cascabel,

È vero, ma è piuttosto rumoroso considerando che la maggior parte dei file sono stati cambiati molte volte nel corso della loro vita. Non voglio vedere le differenze complete di ogni singolo commit che abbia mai toccato un file. Di solito cerco una cosa specifica, quindi posso ottenere un registro con solo impatti e quindi git showsui commit specifici che sembrano importanti.
rfunduk,

git log --stat --follow - * .html => lista di output di commit con esattamente un file in ogni commit. Molto bella!
Sergio Belevskij,

18

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_numbered lowerLimitè ilending_line_number

Ulteriori informazioni - https://www.techpurohit.com/list-some-useful-git-commands


17

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 --followfunziona solo per un singolo file.


4
--followfunziona 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.
StvnW,

10

Se si sta tentando di - seguire un file eliminato in un precedente commit

git log --follow -- filename

3
Per i gitneofiti: utilizzare anche git log -p --follow -- filenameper visualizzare le modifiche. Nota anche: "nome file" può essere un file, una directory o un sottomodulo.
Tino,

8

Se vuoi visualizzare tutti i commit che hanno cambiato un file, in tutti i rami, usa questo:

git log --follow --all <filepath>


6

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>

o senza il[branch]
Anentropic

1
@Anentropic Le parentesi quadre dovevano indicare che l'argomento è facoltativo.
Cubico,

È tutto ciò di cui ho bisogno, mostra il cambiamento completo, include alcuni cambiamenti dall'unione.
ThanhLD,

5

Utilizzare git log --all <filename>per visualizzare i commit che influenzano <filename>in tutti i rami.


4
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.


Per gli utenti Windows, tenere presente che gitkè in bundle con Git per Windows.
Soren Bjornstad,

2

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.


1

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>".


1
# 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>

Riferimento

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.