J'ai un projet qui a une longue histoire. Je veux montrer le premier commit sur git.
Comment puis-je faire cela?
J'ai un projet qui a une longue histoire. Je veux montrer le premier commit sur git.
Comment puis-je faire cela?
Réponses:
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.)
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.git
ré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 e83c516
c'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.git
a 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-parents
n'é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-rev
pourrait vous donner un aperçu rapide de l'historique:
git rev-list --parents HEAD | egrep "^[a-f0-9]{40}$" | git name-rev --stdin
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
git rev-list --max-parents=0 HEAD
qu'il fera de même et est un peu plus simple.
Je l'ai trouvé:
git log --reverse
affiche les commits depuis le début.
git log --reverse -5
fait intéressant de le faire ignorer --reverse
pour une raison quelconque
Vous pouvez simplement inverser votre journal et le diriger pour le premier résultat.
git log --pretty=oneline --reverse | head -1
git log --reverse
inverse l'historique, vous devez donc utiliser head -1
au lieu de tail -1
pour obtenir le premier commit.
-n
drapeau quand --reverse
est donné.
git log --format="%h" | tail -1
vous 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.
git log -1
.