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>
- Changements entre les conseils du sujet et les branches principales.
- Comme ci-dessus.
- Modifications apportées à la branche principale depuis le démarrage de la branche de rubrique.
mais ce n'est pas totalement clair pour moi.
É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:
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:
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.
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
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