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-parents
stato 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.git
repository 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.git
ha 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-parents
non fosse disponibile, funziona anche:
git rev-list --parents HEAD | egrep "^[a-f0-9]{40}$"
Se disponi di tag utili, git name-rev
potrebbe 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 HEAD
che farà lo stesso, ed è un po 'più semplice.
L'ho trovato:
git log --reverse
mostra i commit dall'inizio.
git log --reverse -5
fa in modo interessante ignorarlo --reverse
per qualche motivo
Puoi semplicemente invertire il registro e dirigerlo per il primo risultato.
git log --pretty=oneline --reverse | head -1
git log --reverse
inverte la cronologia, quindi è necessario utilizzare head -1
invece di tail -1
ottenere il primo commit.
-n
bandiera quando --reverse
viene 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 -1
ti 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
.