git - Trova commit dove è stato aggiunto il file


208

Supponiamo di avere un file foo.jsche è stato impegnato qualche tempo fa. Vorrei semplicemente trovare il commit in cui questo file è stato aggiunto per la prima volta.

Dopo aver letto le risposte e il mio armeggiare, questo funziona per me

git log --follow --diff-filter=A --find-renames=40% foo.js

Risposte:


318

Ecco un modo più semplice e "puro Git" per farlo, senza bisogno di una pipeline:

git log --diff-filter=A -- foo.js

Controlla la documentazione. Puoi fare la stessa cosa per Eliminato, Modificato, ecc.

https://git-scm.com/docs/git-log#Documentation/git-log.txt---diff-filterACDMRTUXB82308203

Ho un utile alias per questo, perché lo dimentico sempre:

git config --global alias.whatadded 'log --diff-filter=A'

Questo lo rende semplice come:

git whatadded -- foo.js

Il sotto uno di linea in modo ricorsivo ricerca attraverso sub directory del $PWDper foo.jssenza dover fornire e percorso assoluto o relativo al file, né la necessità di file di essere nella stessa directory del$PWD

git log --diff-filter=A -- **foo.js

27
+1! Tuttavia, il mio file era in una sottocartella, quindi ha funzionato solo dopo aver aggiunto un asterisco nella parte anterioregit log --diff-filter=A -- *subfolder/foo.js
Geo

4
Come funziona su file che vengono uniti da altri rami, ma che non sono stati necessariamente aggiunti al ramo che viene unito dall'utente che esegue l'unione?
g33kz0r,

Il link doc sopra non passa alle informazioni sulla bandiera. Forse è cambiato da quando è stato pubblicato. git-scm.com/docs/git-log#Documentation/…
webbower

1
Sì, hanno cambiato la struttura di ancoraggio nei documenti. Aggiornato, grazie!
stelterd

@geo penso di ottenere quello che stai dicendo, ma non proprio, ma ho un caso d'uso simile, in cui generalmente rimango all'interno della radice del progetto di una directory git e invio comandi da lì, e usando il liner fornito git log --diff-filter=A -- foo.jsnon ho stampato il commetto ID / hash su STDOUT nel mio terminale, invece ho dovuto fornire il percorso relativo al file dalla radice di repository git per ottenere i risultati desiderati
ipatch


1

Potrebbe non interessarti quanto segue, ma penso che ti aiuterà in futuro e fa parte dell'ecosistema di debug in Git:

È possibile utilizzare git-blameper mostrare quale revisione e autore hanno modificato l'ultima riga di ogni riga di un file, in particolare l'annotazione del file. Visita https://git-scm.com/book/en/v2/Git-Tools-Debugging-with-Git

Per esempio,

git blame -L 174,190  xx.py

Potresti spiegare per favore cosa fanno ciascuno degli operandi? Mi rendo conto che hai fornito un link alla RTFM pertinente, ma una piccola spiegazione renderebbe il tuo post uno sportello unico.
rossmcm,

Come dice il libro Pro-Git Se rintracci un bug nel tuo codice e vuoi sapere quando è stato introdotto e perché, l'annotazione dei file è spesso il tuo strumento migliore. Ti mostra quale commit è stato l'ultimo a modificare ogni riga di qualsiasi file, quindi questo esempio che ho mostrato usa l'opzione -L per limitare l'output alle righe da 174 a 190 e l'ultima cosa è solo il file di destinazione che vuoi controllare ( xx.py) in questo caso un file Python @rossmcm
Reidel
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.