Quelles sont les différences entre le point double «..» et le point triple «…» dans les plages de validation Git?
412
Certaines commandes Git prennent des plages de validation et une syntaxe valide consiste à séparer deux noms de validation avec deux points .., et une autre syntaxe utilise trois points ....
Cela dépend si vous utilisez une logcommande ou une diffcommande. Dans le logcas, c'est dans la man git-rev-parsedocumentation:
Pour exclure les validations accessibles depuis une validation, une notation de préfixe ^ est utilisée. Par exemple, ^ r1 r2 signifie que les commits accessibles depuis r2 mais excluent ceux accessibles depuis r1.
Cette opération d'ensemble apparaît si souvent qu'il y a un raccourci pour cela. Lorsque vous avez deux validations r1 et r2 (nommées selon la syntaxe expliquée dans SPÉCIFICATION DES RÉVISIONS ci-dessus), vous pouvez demander des validations qui sont accessibles à partir de r2 à l'exclusion de celles qui sont accessibles à partir de r1 par "^ r1 r2" et elles peuvent être écrites comme "r1..r2".
Une notation similaire "r1 ... r2" est appelée différence symétrique de r1 et r2 et est définie comme "r1 r2 --not $ (git merge-base --all r1 r2)". C'est l'ensemble des commits qui sont accessibles depuis l'un des r1 ou r2 mais pas des deux.
Ce qui signifie essentiellement que vous obtiendrez tous les commits qui se trouvent dans l'une des deux branches, mais pas dans les deux.
Dans le diffcas, c'est dans la man git-diffdocumentation:
git diff [--options] <commit>...<commit> [--] [<path>...]
This form is to view the changes on the branch containing and up to
the second <commit>, starting at a common ancestor of both
<commit>. "git diff A...B" is equivalent to "git diff
$(git-merge-base A B) B". You can omit any one of <commit>, which
has the same effect as using HEAD instead.
Ce qui est un peu flou. Fondamentalement, cela signifie qu'il ne montre que les différences dans cette branche par rapport à une autre branche: il recherche le dernier commit commun avec le premier commit que vous lui avez donné, puis diffère le deuxième committish. C'est un moyen facile de voir quels changements sont effectués dans cette branche, par rapport à cette branche, sans prendre en compte les changements dans cette branche uniquement.
Le ..est un peu plus simple: dans le git-diffcas, c'est la même chose que a git diff A Bet juste diffère A contre B. Dans le logcas, il montre tous les commits qui sont en B mais pas en A.
C'est assez ridicule de voir comment le sens de ..et ...est exactement échangé pour log et diff: log A..Best le changement de la base de fusion en B, ce qui diff A...Bfait
phiresky
1
@phiresky Ouais, c'est vraiment une mauvaise utilisation. Je recommande de ne pas utiliser les notations de points pour git diff.
wisbucky
2
Est-ce à dire A...B== A..B + B..A?
Danon
2
@Danon car git logc'est absolument oui
maoizm
659
Utilisation des plages de validation avec le journal Git
Lorsque vous utilisez des plages de validation comme ..et ...avec git log, la différence entre elles est que, pour les branches A et B,
git log A..B
vous montrera tous les commits que B a que A n'a pas , tandis que
git log A...B
vous montrera à la fois les validations que A a et que B n'a pas, et les validations que B a que A n'a pas, ou en d'autres termes, il filtrera toutes les validations que A et B partagent, montrant uniquement les engagements qu'ils ne partagent pas tous les deux .
Visualisation avec les diagrammes de Venn et les arbres de validation
Voici une représentation visuelle de git log A..B. Les validations que contient la branche B qui n'existent pas dans A sont ce qui est retourné par la plage de validation, et sont surlignées en rouge dans le diagramme de Venn, et entourées en bleu dans l'arborescence de validation:
Ce sont les diagrammes pour git log A...B. Notez que les commits partagés par les deux branches ne sont pas renvoyés par la commande:
Création de la plage de validation à trois points ... plus utile
Vous pouvez rendre la plage de validation à trois points ...plus utile dans une commande de journal en utilisant l' --left-rightoption pour afficher les validations appartenant à quelle branche:
Dans la sortie ci-dessus, vous verrez les validations qui appartiennent à mastersont préfixées avec <, tandis que les validations qui appartiennent à origin/mastersont préfixées avec >.
Utilisation des plages de validation avec Git Diff
Cette réponse explique en fait la différence avec un texte concis, des exemples et des images. Je l'aime beaucoup mieux que la réponse actuellement la mieux votée qui ne fait que citer la documentation peu claire. (tl; dr grâce à cette réponse je comprends vraiment la différence.)
aerique
4
@Cupcake pourriez-vous ajouter le sens ... dans git diff?
Marius
1
@Marius en fait, maintenant que vous en parlez, je vais continuer et lier à cette autre question dans ma réponse, pour les futurs lecteurs comme vous.
2
N'est-ce pas vraiment le contraire? dig diff a..b est TOUS diffs, ou fondamentalement le même que git diff a b. Alors que git dif a ... b est SEULEMENT les modifications apportées par b depuis la dérivation de a.
Réponses:
Cela dépend si vous utilisez une
log
commande ou unediff
commande. Dans lelog
cas, c'est dans laman git-rev-parse
documentation:Ce qui signifie essentiellement que vous obtiendrez tous les commits qui se trouvent dans l'une des deux branches, mais pas dans les deux.
Dans le
diff
cas, c'est dans laman git-diff
documentation:Ce qui est un peu flou. Fondamentalement, cela signifie qu'il ne montre que les différences dans cette branche par rapport à une autre branche: il recherche le dernier commit commun avec le premier commit que vous lui avez donné, puis diffère le deuxième committish. C'est un moyen facile de voir quels changements sont effectués dans cette branche, par rapport à cette branche, sans prendre en compte les changements dans cette branche uniquement.
Le
..
est un peu plus simple: dans legit-diff
cas, c'est la même chose que agit diff A B
et juste diffère A contre B. Dans lelog
cas, il montre tous les commits qui sont en B mais pas en A.la source
..
et...
est exactement échangé pour log et diff:log A..B
est le changement de la base de fusion en B, ce quidiff A...B
faitgit diff
.A...B
==A..B + B..A
?git log
c'est absolument ouiUtilisation des plages de validation avec le journal Git
Lorsque vous utilisez des plages de validation comme
..
et...
avecgit log
, la différence entre elles est que, pour les branches A et B,vous montrera tous les commits que B a que A n'a pas , tandis que
vous montrera à la fois les validations que A a et que B n'a pas, et les validations que B a que A n'a pas, ou en d'autres termes, il filtrera toutes les validations que A et B partagent, montrant uniquement les engagements qu'ils ne partagent pas tous les deux .
Visualisation avec les diagrammes de Venn et les arbres de validation
Voici une représentation visuelle de
git log A..B
. Les validations que contient la branche B qui n'existent pas dans A sont ce qui est retourné par la plage de validation, et sont surlignées en rouge dans le diagramme de Venn, et entourées en bleu dans l'arborescence de validation:Ce sont les diagrammes pour
git log A...B
. Notez que les commits partagés par les deux branches ne sont pas renvoyés par la commande:Création de la plage de validation à trois points
...
plus utileVous pouvez rendre la plage de validation à trois points
...
plus utile dans une commande de journal en utilisant l'--left-right
option pour afficher les validations appartenant à quelle branche:Dans la sortie ci-dessus, vous verrez les validations qui appartiennent à
master
sont préfixées avec<
, tandis que les validations qui appartiennent àorigin/master
sont préfixées avec>
.Utilisation des plages de validation avec Git Diff
Un jour, je pourrais ajouter ma propre explication sur le fonctionnement des plages de validation
git diff
, mais pour l'instant, vous voudrez peut-être vérifier quelles sont les différences entre le double point ".." et le triple point "..." dans Git diff commit gammes? .Voir également
la source