Comment afficher le premier commit par 'git log'?

288

J'ai un projet qui a une longue histoire. Je veux montrer le premier commit sur git.

Comment puis-je faire cela?

Nyambaa
la source
2
Je n'ai trouvé qu'un moyen de montrer le dernier git log -1.
alex
5
doublon possible de git: comment référencer le commit initial?
Chris Johnsen

Réponses:

298

Réponse courte

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

(d' après le commentaire de tiho . Comme le remarque Chris Johnsen , a --max-parentsété présenté après la publication de cette réponse.)

Explication

Techniquement, il peut y avoir plus d'un commit racine. Cela se produit lorsque plusieurs historiques précédemment indépendants sont fusionnés. Il est courant lorsqu'un projet est intégré via une fusion de sous - arborescences .

Le git.gitréférentiel a six validations racine dans son graphique d'historique (une pour la validation initiale de Linus, gitk , certains outils initialement séparés, git-gui , gitweb et git-p4 ). Dans ce cas, nous savons que e83c516c'est celui qui nous intéresse probablement. Il s'agit à la fois du premier commit et d'un commit racine.

Ce n'est pas si simple dans le cas général.

Imaginez que libfoo est en développement depuis un certain temps et conserve son historique dans un référentiel Git ( libfoo.git). Indépendamment, le projet «bar» est également en cours de développement (en bar.git), mais pas depuis aussi longtemps libfoo (la validation avec la date la plus ancienne en libfoo.gita une date qui précède la validation avec la date la plus ancienne en bar.git). À un moment donné, les développeurs de «bar» décident d'incorporer libfoo dans leur projet en utilisant une fusion de sous-arborescences. Avant cette fusion, il aurait pu être trivial de déterminer le «premier» commit bar.git(il n'y avait probablement qu'un seul commit root). Après la fusion, cependant, il y a plusieurs validations racine et la première validation racine vient en fait de l'histoire de libfoo, pas «bar».

Vous pouvez trouver tous les validations racine de l'historique DAG comme ceci:

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

Pour mémoire, si elles --max-parentsn'étaient pas disponibles, cela fonctionne également:

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

Si vous avez des balises utiles en place, cela git name-revpourrait vous donner un aperçu rapide de l'historique:

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

Prime

Utilisez-le souvent? Difficile à retenir? Ajouter un alias git pour un accès rapide

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

Maintenant, vous pouvez simplement faire

git first
Chris Johnsen
la source
49
Je pense git rev-list --max-parents=0 HEADqu'il fera de même et est un peu plus simple.
tiho
3
@tiho: Oui, il fait de même et est plus simple; bien que cette option n'ait pas été tout à fait «inventée» au moment de cette question / réponse.
Chris Johnsen
Il me semble que le premier commit est plus un commit de feuille qu'un commit racine
tiwo
@tiho Je pense que votre réponse devrait être sa propre réponse et pas seulement un commentaire. De cette façon, il sera plus important et vous obtiendrez des points bien mérités.
Russell Silva
@RussellSilva Je ne me soucie pas des points, mais je pense qu'il est possible de modifier les réponses des autres, ce qui serait probablement mieux que d'en ajouter une nouvelle. Je ne suis pas vraiment à l'aise de le faire moi-même, n'hésitez pas à le faire :)
tiho
414

Je l'ai trouvé:

git log --reverse

affiche les commits depuis le début.

Nyambaa
la source
19
git log --reverse -5fait intéressant de le faire ignorer --reversepour une raison quelconque
Dan2552
6
@ Dan2552 Ressemble à un bug, doit être signalé?
saeedgnu
23
semble limiter d'abord les résultats à 5 entrées, puis inverser
non
3
@ 太極 者 無極 而 生 a raison, c'est le comportement documenté.
seriousdev
43

Vous pouvez simplement inverser votre journal et le diriger pour le premier résultat.

git log --pretty=oneline --reverse | head -1
Mohamed Mansour
la source
7
git log --reverseinverse l'historique, vous devez donc utiliser head -1au lieu de tail -1pour obtenir le premier commit.
rubiii
4
il serait préférable que git n'ignore pas le -ndrapeau quand --reverseest donné.
Frederick Nord
12
git log $(git log --pretty=format:%H|tail -1)
Matthew Flaschen
la source
1
ougit log $(git log --reverse --pretty=format:%H|head -1)
non
aide pour moi. vrai "premier commit"
kangear
6

Ce n'est pas la plus belle façon de le faire, je suppose:

git log --pretty=oneline | wc -l

Cela vous donne alors un numéro

git log HEAD~<The number minus one>
MHC
la source
1

git log --format="%h" | tail -1vous donne le hachage de validation (c'est-à-dire 0dd89fb), que vous pouvez alimenter dans d'autres commandes, en faisant quelque chose comme

git diff `git log --format="%h" --after="1 day"| tail -1`..HEAD pour afficher tous les commits du dernier jour.

TankorSmash
la source