Come mostrare il primo commit con 'git log'?


Risposte:


298

Risposta breve

git rev-list --max-parents=0 HEAD

(dal commento di tiho . Come nota Chris Johnsen , è --max-parentsstato introdotto dopo che questa risposta è stata pubblicata.)

Spiegazione

Tecnicamente, potrebbe esserci più di un commit root. Ciò accade quando più storie precedentemente indipendenti vengono unite insieme. È comune quando un progetto è integrato tramite un'unione di sottostruttura .

Il git.gitrepository ha sei commit root nel suo grafico cronologico (uno ciascuno per il commit iniziale di Linus, gitk , alcuni strumenti inizialmente separati, git-gui , gitweb e git-p4 ). In questo caso, sappiamo che e83c516è probabilmente quello a cui siamo interessati. È sia il primo commit sia un commit root.

Non è così semplice nel caso generale.

Immagina che libfoo sia in sviluppo da un po 'e conservi la sua storia in un repository Git ( libfoo.git). Indipendentemente, anche il progetto "bar" è stato in fase di sviluppo (in bar.git), ma non da tanto tempo libfoo (il commit con la prima data in libfoo.githa una data che precede il commit con la prima data in bar.git). Ad un certo punto gli sviluppatori di "bar" decidono di incorporare libfoo nel loro progetto usando una fusione di sottostruttura. Prima di questa fusione, sarebbe stato banale determinare il "primo" commit bar.git(probabilmente c'era un solo commit root). Dopo l'unione, tuttavia, ci sono più commit di root e il primo commit di root proviene in realtà dalla storia di libfoo, non "bar".

Puoi trovare tutti i commit di root del DAG della storia in questo modo:

git rev-list --max-parents=0 HEAD

Per la cronaca, se --max-parentsnon fosse disponibile, funziona anche:

git rev-list --parents HEAD | egrep "^[a-f0-9]{40}$"

Se disponi di tag utili, git name-revpotrebbe darti una rapida panoramica della cronologia:

git rev-list --parents HEAD | egrep "^[a-f0-9]{40}$" | git name-rev --stdin

indennità

Usalo spesso? Difficile da ricordare? Aggiungi un alias git per un accesso rapido

git config --global alias.first "rev-list --max-parents=0 HEAD"

Ora puoi semplicemente farlo

git first

49
Credo git rev-list --max-parents=0 HEADche farà lo stesso, ed è un po 'più semplice.
Tiho,

3
@tiho: Sì, fa lo stesso ed è più semplice; sebbene quell'opzione non fosse stata del tutto "inventata" al momento di questa domanda / risposta.
Chris Johnsen,

Mi viene in mente che il primo commit è più un commit foglia che un commit root
sei

@tiho Penso che la tua risposta dovrebbe essere la sua risposta e non solo un commento. In questo modo sarà più importante e otterrai punti meritati.
Russell Silva,

@RussellSilva Non mi interessano i punti, ma credo che sia possibile modificare le risposte degli altri, il che probabilmente sarebbe meglio che aggiungerne uno nuovo. Non mi sento davvero a mio agio nel farlo da solo, sentiti libero di farlo :)
tiho,

414

L'ho trovato:

git log --reverse

mostra i commit dall'inizio.


19
git log --reverse -5fa in modo interessante ignorarlo --reverseper qualche motivo
Dan2552,

6
@ Dan2552 Sembra un bug, dovrebbe essere segnalato?
Saeedgnu,

23
sembra che per prima cosa limiti i risultati a 5 voci, e poi al contrario
polarità

3
@ 太極 者 無極 而 生 ha ragione, questo è il comportamento documentato.
seriousdev,

43

Puoi semplicemente invertire il registro e dirigerlo per il primo risultato.

git log --pretty=oneline --reverse | head -1

7
git log --reverseinverte la cronologia, quindi è necessario utilizzare head -1invece di tail -1ottenere il primo commit.
rubiii,

4
sarebbe meglio se git non ignorasse la -nbandiera quando --reverseviene data.
Federico Nord,


6

Non è il modo più bello di farlo immagino:

git log --pretty=oneline | wc -l

Questo ti dà un numero allora

git log HEAD~<The number minus one>

1

git log --format="%h" | tail -1ti dà l'hash di commit (cioè 0dd89fb), che puoi inserire in altri comandi, facendo qualcosa di simile

git diff `git log --format="%h" --after="1 day"| tail -1`..HEAD per visualizzare tutti i commit nell'ultimo giorno.

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.