269 votes

Quelles sont les différences entre le double-point ".." et trois points "..." dans Git diff commettre des plages?

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

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

La diff manuel en parle:

La comparaison des branches

$ git diff topic master    <1>
$ git diff topic..master   <2>
$ git diff topic...master  <3>
  1. Les changements entre les conseils du sujet, et le maître de branches.
  2. Même que ci-dessus.
  3. Les changements qui ont eu lieu sur la branche master depuis quand le sujet de la succursale a été commencé.

mais ce n'est pas totalement clair pour moi.

433voto

Mark Longair Points 93104

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

La commande git diff typically1 seulement vous montre la différence entre les états de l'arbre entre les deux points dans le commit graphique. L' .. et ... de notations en 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, ce qui va vous montrer la différence entre les extrémités des deux branches foo et bar. D'autre part, git diff foo...bar va vous montrer la différence entre la "fusion de la base de" l'une des deux branches et la pointe de l' bar. La "fusion" de base est généralement le dernier commit en commun entre ces deux branches, de sorte que cette commande va vous montrer les changements que votre travail sur bar a introduit, en ignorant tout ce qui a été fait sur foo dans le temps de le dire.

C'est tout ce que vous devez savoir à propos de l' .. et ... de notations en git diff. Cependant...


... une source fréquente de confusion ici, c'est qu' .. et ... moyenne subtilement différentes choses lorsqu'utilisé dans une commande telle que git log qui s'attend à un ensemble de commits qu'un ou plusieurs arguments. (Ces commandes tous fin à l'aide de git rev-list d'analyser une liste des commits de leurs arguments.)

Le sens de l' .. et ... pour git log peuvent être représentées graphiquement ci-dessous:

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

Donc, git rev-list foo..bar vous montre tout sur la branche bar qui n'est pas également sur la branche foo. D'autre part, git rev-list foo...bar vous montre tous les commits qui sont soit en foo ou bar, mais pas les deux. Le troisième diagramme montre simplement que si vous listez les deux branches, vous obtenez les commits qui sont dans un seul ou les deux d'entre eux.

Eh bien, je trouve que tout est un peu confus, de toute façon, et je pense que la validation graphique des diagrammes de l'aide :)

1 je dis "généralement" car lors de la résolution des conflits de fusion, par exemple, git diff va vous montrer une trois voies de fusion.

38voto

manojlds Points 96599

git diff foo master - Diff entre le haut ( la tête) s'engage de foo et maître.

git diff foo..master - C'est une autre façon de faire la même chose.

git diff foo...master - Diff à partir de l'ancêtre commun ( git merge-base foo master) de foo et maître à la pointe de maître. En d'autres termes, montre seulement les changements qui foo direction générale a adopté, depuis son ancêtre commun avec le master.

Cet exemple de GitHub explique comment utiliser les deux:

Par exemple, si vous créez un " dev "de la branche et ajouter une fonction dans un fichier, puis revenir à votre "maître" de la branche et de supprimer une ligne dans le fichier README, puis exécuter quelque chose comme ceci:

$ git diff master dev

Il vous dira qu'une fonction a été ajoutée dans le premier fichier et une ligne a été ajoutée au fichier README. Pourquoi? Parce que sur la branche, le fichier lisez-moi toujours a la ligne d'origine, mais de "maître", vous avez supprimé, de sorte comparant directement les instantanés ressemble à " dev " ajouta-t-il.

Ce que vous voulez vraiment comparer est ce que les " dev " a changé depuis vos branches divergent. Pour ce faire, Git a une jolie petite abrégée:

$ git diff master...dev

http://learn.github.com/p/diff.html

6voto

italiano40 Points 140
git diff foo master

permettra de montrer les différences entre le sujet et la branche principale de ce point dans le temps

git diff foo..master

cela permettra également de montrer les différences entre le sujet et la branche principale, de ce point dans le temps

git diff foo...master

cela permettra de montrer toutes les différences entre le moment où le sujet a été fait, provenant de la direction générale et après

donc les 2 premières commandes sont les mêmes et la dernière montre une vue plus large dans le diff histoire

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X