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:
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 :)
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.
git log -1
.Réponses:
Réponse courte
(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.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 quee83c516
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 (enbar.git
), mais pas depuis aussi longtemps libfoo (la validation avec la date la plus ancienne enlibfoo.git
a une date qui précède la validation avec la date la plus ancienne enbar.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» commitbar.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:
Pour mémoire, si elles
--max-parents
n'étaient pas disponibles, cela fonctionne également:Si vous avez des balises utiles en place, cela
git name-rev
pourrait vous donner un aperçu rapide de l'historique:Prime
Utilisez-le souvent? Difficile à retenir? Ajouter un alias git pour un accès rapide
Maintenant, vous pouvez simplement faire
la source
git rev-list --max-parents=0 HEAD
qu'il fera de même et est un peu plus simple.Je l'ai trouvé:
affiche les commits depuis le début.
la source
git log --reverse -5
fait intéressant de le faire ignorer--reverse
pour une raison quelconqueVous pouvez simplement inverser votre journal et le diriger pour le premier résultat.
la source
git log --reverse
inverse l'historique, vous devez donc utiliserhead -1
au lieu detail -1
pour obtenir le premier commit.-n
drapeau quand--reverse
est donné.la source
git log $(git log --reverse --pretty=format:%H|head -1)
Ce n'est pas la plus belle façon de le faire, je suppose:
Cela vous donne alors un numéro
la source
git log --format="%h" | tail -1
vous donne le hachage de validation (c'est-à-dire0dd89fb
), que vous pouvez alimenter dans d'autres commandes, en faisant quelque chose commegit diff `git log --format="%h" --after="1 day"| tail -1`..HEAD
pour afficher tous les commits du dernier jour.la source