Ho un progetto che ha una lunga storia. Voglio mostrare il primo commit su git.
Come faccio a fare questo?
Ho un progetto che ha una lunga storia. Voglio mostrare il primo commit su git.
Come faccio a fare questo?
Risposte:
git rev-list --max-parents=0 HEAD
(dal commento di tiho . Come nota Chris Johnsen , è --max-parentsstato introdotto dopo che questa risposta è stata pubblicata.)
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
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
git rev-list --max-parents=0 HEADche farà lo stesso, ed è un po 'più semplice.
L'ho trovato:
git log --reverse
mostra i commit dall'inizio.
git log --reverse -5fa in modo interessante ignorarlo --reverseper qualche motivo
Puoi semplicemente invertire il registro e dirigerlo per il primo risultato.
git log --pretty=oneline --reverse | head -1
git log --reverseinverte la cronologia, quindi è necessario utilizzare head -1invece di tail -1ottenere il primo commit.
-nbandiera quando --reverseviene data.
git log $(git log --pretty=format:%H|tail -1)
git log $(git log --reverse --pretty=format:%H|head -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.
git log -1.