Comment afficher le premier commit par 'git log'?


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

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.


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

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)

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>

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.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.