web-dev-qa-db-fra.com

Quelles sont les différences entre le point double ".." et le point triple "..." dans les plages de validation Git diff?

Quelles sont les différences entre les commandes suivantes?:

git diff foo master   # a 
git diff foo..master  # b
git diff foo...master # c

Le manuel du diff en parle:

Comparaison des branches

$ git diff topic master    <1>
$ git diff topic..master   <2>
$ git diff topic...master  <3>
  1. Changements entre les conseils du sujet et les branches principales.
  2. Comme ci-dessus.
  3. Modifications apportées à la branche principale depuis le démarrage de la branche de rubrique.

mais ce n'est pas totalement clair pour moi.

167
chrisjlee

Étant donné que j'avais déjà créé ces images, j'ai pensé qu'il pourrait être utile de les utiliser dans une autre réponse, bien que la description de la différence entre .. (point à point) et ... (point-point-point) est essentiellement le même que dans réponse de manojlds .

La commande git diff typiquement¹ vous montre uniquement la différence entre les états de l'arborescence entre exactement deux points dans le graphique de validation. Le .. et ... notations dans git diff ont les significations suivantes:

An illustration of the different ways of specifying commits for git diff

En d'autres termes, git diff foo..bar est exactement le même que git diff foo bar; les deux vous montreront la différence entre les pointes des deux branches foo et bar. D'autre part, git diff foo...bar vous montrera la différence entre la "base de fusion" des deux branches et la pointe de bar. La "base de fusion" est généralement le dernier commit en commun entre ces deux branches, donc cette commande vous montrera les changements que votre travail sur bar a introduits, tout en ignorant tout ce qui a été fait sur foo pendant ce temps.

C'est tout ce que vous devez savoir sur le .. et ... notations dans git diff. Toutefois...


... une source courante de confusion ici est que .. et ... signifie des choses subtilement différentes lorsqu'elles sont utilisées dans une commande telle que git log qui attend un ensemble de validations comme un ou plusieurs arguments. (Ces commandes finissent toutes par utiliser git rev-list pour analyser une liste de validations à partir de leurs arguments.)

Le sens de .. et ... pour git log peut être représenté graphiquement comme ci-dessous:

An illustration of the different ways of specifying ranges of commits for git log

Alors, git rev-list foo..bar vous montre tout sur la branche bar qui ne l'est pas également sur la branche foo. D'autre part, git rev-list foo...bar vous montre toutes les validations qui sont dans foo ou bar, mais pas les deux . Le troisième diagramme montre simplement que si vous répertoriez les deux branches, vous obtenez les commits qui se trouvent dans l'une ou les deux.

Eh bien, je trouve cela un peu déroutant, de toute façon, et je pense que les diagrammes de graphique de validation aident :)

¹ Je dis seulement "typiquement" car lors de la résolution des conflits de fusion, par exemple, git diff vous montrera une fusion à trois.

284
Mark Longair

Ma version consolidée de .. vs ... avec diff vs log

Diff vs Log & .. vs ..

42
DolphinDream

git diff foo master Diff entre les commits top (head) de foo et master.

git diff foo..master Une autre façon de faire la même chose.

git diff foo...master Diff de l'ancêtre commun (git merge-base foo master) de foo et master à tip of master. En d'autres termes, ne montre que les changements que la branche principale a introduits depuis son ancêtre commun avec foo.

Cet exemple de GitHub explique quand utiliser les deux:

Par exemple, si vous créez une branche "dev" et ajoutez une fonction à un fichier, revenez à votre branche "master" et supprimez une ligne du fichier README, puis exécutez quelque chose comme ceci:

$ git diff master dev

Il vous indiquera qu'une fonction a été ajoutée à partir du premier fichier et qu'une ligne a été ajoutée au fichier README. Pourquoi? Parce que sur la branche, le README a toujours la ligne d'origine, mais sur ‘master’ vous l’avez supprimée - donc la comparaison directe des instantanés ressemble à ‘dev’ l’a ajoutée.

Ce que vous voulez vraiment comparer, c'est ce que le "dev" a changé depuis la divergence de vos branches. Pour ce faire, Git a un joli petit raccourci:

$ git diff master...dev
26
manojlds
git diff foo master

montrera les différences entre le sujet et la branche principale à ce moment-là

git diff foo..master

cela montrera également les différences entre le sujet et la branche principale à ce moment-là

git diff foo...master

cela montrera toutes les différences entre le moment où le sujet a été créé à partir de la branche et après

donc les 2 premières commandes sont les mêmes et la dernière montre juste une vue plus large dans l'historique des différences

6
italiano40