web-dev-qa-db-fra.com

Signification de git log - en ligne - sortie graphique

J'apprends les références de validation relatives et j'essaie de comprendre les éléments suivants git log --oneline --graph sortie fournie dans une leçon.

git graph

Dans la leçon, il est dit que, étant donné HEAD pointe vers le 9ec05ca commit, HEAD ^^^ (signifiant le commit de l'arrière-grand-parent) est le 0c5975a commit. Mais il me semble 4c9749e devrait être l'arrière-grand-parent, si chacun SHA est un descendant direct de celui en dessous. Toute clarification appréciée.

6
Natalie

La validation peut avoir plusieurs parents. ^ 1 signifie premier parent. ^ 2 signifie deuxième parent et continuez. ^ Par défaut, ^ 1 est le premier parent.

De même ~ donne accès à la traversée vers le haut pour un ancêtre. Par exemple, si vous voulez 3 générations jusqu'à 3. Si vous voulez que le 7e dernier commit dans la même branche favorise le premier parent pendant la traversée.

Toute fusion aura deux parents avec la fusion vers la branche devenant le premier parent. Fusion de la branche devenant le deuxième parent.

2
code707

la réponse de setia_ reste la plus appropriée mais votre question est significative car un historique git peut être considéré sous deux angles distincts: soit vous le voyez totalement comme un graphique (mathématique) dans lequel l'ordre des parents est censé être non significatif, OR vous considérez une opération de fusion comme l'intégration d'une branche externe dans un tronc commun (c'est-à-dire votre branche actuelle, très souvent "maître"). C'est aussi l'hypothèse faite par git merge.

Ceci est important non seulement parce que parcourir rapidement un arbre à croissance exponentielle devient difficile, mais aussi parce qu'avoir un "maître" de branche qui contient un produit fini et intégrer des soumissions externes est un modèle suivi de nombreux workflows.

Ces deux points de vue étant valides, ils provoquent --first-parent pour être une option fréquemment utilisée, mais pas une commande principale ni un comportement par défaut.

Par exemple, parcourir le référentiel principal du noyau Linux (pour lequel Git a été initialement conçu) avec un simple git log --graph peut prendre jusqu'à une minute avant d'afficher quelque chose, mais git log --graph --first-parent vous montrera la branche principale et vous permettra de constater qu'elle est principalement composée de fusions, avec des commits directs occasionnels.

Une autre chose que vous devez garder à l'esprit est que vous pouvez demander à ce que vos validations soient affichées par ordre chronologique en utilisant --date-order ou ordre topologique avec --topo-order. Supposons que vous ayez deux branches distinctes et que vous vous engagiez alternativement dans l'une ou l'autre avant de les fusionner. Selon l'ordre, le graphique résultant ressemblerait à l'un de ces éléments:

Chronological order                     Topological order

*   ec9a124 Merge branch 'B' into A     *   ec9a124 Merge branch 'B' into A
|\                                      |\
* | e5314f2 Ninth                       | * e3e2435 Eighth
| * e3e2435 Eighth                      | * af3bac5 Sixth
* | 308228b Seventh                     | * 3a2f0b9 Fourth
| * af3bac5 Sixth                       | * d901c9f Second
* | ab11578 Fifth                       * | e5314f2 Ninth
| * 3a2f0b9 Fourth                      * | 308228b Seventh
* | 344bd0f Third                       * | ab11578 Fifth
| * d901c9f Second                      * | 344bd0f Third
|/                                      |/
* 0f029bc First                         * 0f029bc First

Tous les commits restent sur leur ligne respective mais cette dernière est une recherche en profondeur. Et depuis git log (tout comme git rev-list) affiche une collection de révisions pré-recueillies, cet ordre sera le même si vous utilisez --graph ou les afficher sous forme de liste plate (en fait, si non spécifié, git log utilise l'ordre chronologique inverse par défaut et topologique lors de l'utilisation de --graph).

Pour cette raison, vous ne pouvez pas simplement compter sur la première ligne pour décider quel parent choisir.

Cela peut également entraîner l'apparition de certains commits plus anciens avant les nouveaux, ce qui peut être très déroutant lorsque vous commencez avec Git, et vous donner l'impression que votre travail a disparu (jusqu'à ce qu'il vous vienne à l'esprit d'effectuer une recherche, puis de le récupérer enterré). quelque part dans l'histoire).

3
Obsidian