Git diff entre la branche actuelle et le master mais n'inclut pas les commits master non fusionnés

171

Je veux un diff de tous les changements dans une branche qui n'est pas encore fusionnée à master.

J'ai essayé:

git diff master
git diff branch..master
git diff branch...master

Cependant, dans chacun de ces cas, le diff contient du contenu dans master qui n'a pas encore été fusionné dans ma branche.

Existe-t-il un moyen de faire une différence entre ma branche et mon maître qui exclut les changements de maître qui n'ont pas encore été fusionnés dans ma branche?

pillarOfLight
la source
9
Si vous retournez dans la deuxième version, vous obtenez ce que vous voulez: git diff master..branch. Vous pouvez le raccourcir git diff master..si vous êtes en succursale. La r1..r2syntaxe est courte pour ^r1 r2ce qui signifie "montre-moi tout ce qui descend r2et n'est pas accessible r1". git help gitrevisionscontient des informations sur les différentes syntaxes que vous pouvez utiliser.
John Szakmeister
1
J'ai développé ma réponse après avoir lu plus sur la ...syntaxe de git diff. Votre commentaire est faux, @jszakmeister, car les plages de révision telles que décrites dans gitrevisionsn'ont rien à voir avec git diff. Diff compare deux points de l'histoire, ne peut pas fonctionner avec une plage.
Palec le
Vous avez raison. J'oublie toujours que cela git difffonctionne différemment des autres commandes ... un fait que je trouve frustrant. :-(
John Szakmeister
assurez-vous de mettre à jour la copie locale du master avant de comparer
joe

Réponses:

232
git diff `git merge-base master branch`..branch

La base de fusion est le point d'où la branchdivergence master.

Git diff prend en charge une syntaxe spéciale pour cela:

git diff master...branch

Vous ne devez pas échanger les côtés, car vous obtiendriez alors l'autre branche. Vous voulez savoir ce qui a changé branchdepuis qu'il a divergé master, et non l'inverse.

Relativement vaguement:


Notez que la syntaxe ..et ...n'a pas la même sémantique que dans les autres outils Git. Il diffère de la signification spécifiée dans man gitrevisions.

Citant man git-diff:

  • git diff [--options] <commit> <commit> [--] [<path>…]

    Il s'agit de visualiser les changements entre deux arbitraires <commit>.

  • git diff [--options] <commit>..<commit> [--] [<path>…]

    C'est également le cas du formulaire précédent. Si <commit>d'un côté est omis, cela aura le même effet que d'utiliser à la HEADplace.

  • git diff [--options] <commit>...<commit> [--] [<path>…]

    Ce formulaire permet de visualiser les modifications sur la branche contenant et jusqu'à la seconde <commit>, en commençant par un ancêtre commun des deux <commit>. " git diff A...B" équivaut à " git diff $(git-merge-base A B) B". Vous pouvez omettre n'importe <commit>lequel de , ce qui a le même effet que d'utiliser à la HEADplace.

Juste au cas où vous feriez quelque chose d'exotique, il convient de noter que tous les éléments <commit>de la description ci-dessus, à l'exception des deux dernières formes qui utilisent des notations "..", peuvent être n'importe lesquels <tree>.

Pour une liste plus complète des méthodes d’orthographe <commit>, reportez-vous à la section «SPÉCIFICATION DES RÉVISIONS» dans gitrevisions[7]. Cependant, "diff" consiste à comparer deux points de terminaison, pas des plages, et les notations de plage (" <commit>..<commit>" et " <commit>...<commit>") ne signifient pas une plage telle que définie dans la section "SPÉCIFICATION DES PLAGES" dans gitrevisions[7].

Palec
la source
Pour moi $ git diff master...branchproduit fatal: ambiguous argument 'master...branch': unknown revision or path not in the working tree.- est-ce une commande dépendante de la version?
Joel Peltonen le
En fait, je viens de réaliser que "branche" doit être le nom de votre branche, je pensais que c'était une référence à la branche actuelle
Joel Peltonen
4
Vous avez raison, ma réponse dépend de la succursale appelée branch. J'ai choisi de m'en tenir au nom que l'OP avait choisi dans la question. Si vous souhaitez utiliser la branche actuelle, remplacez-la branchpar HEAD.
Palec le
14
Notez que vous pouvez utiliser git diff master...pour éviter de spécifier la branche (la branche actuelle sera prise).
VasiliNovikov
1
La commande d'origine fonctionne-t-elle après votre develextraction, @ChrisGuest? Probablement, Git a créé la branche pour vous lors du paiement, en tant que copie locale d'une branche distante (généralement origin/devel). Si tel était le cas, git diff origin/devel...bugfix/API-353-api-allows-database-access-whenaurait fonctionné avant même le paiement.
Palec
45

Voici ce qui a fonctionné pour moi:

git diff origin/master...

Cela montre uniquement les changements entre ma branche locale actuellement sélectionnée et la branche principale distante, et ignore tous les changements dans ma branche locale qui proviennent des commits de fusion.

Jeshurun
la source
Pour référence, si vous avez besoin des références de validation des validations contenant ces modifications, utilisez git cherry origin/master.
jaytibann
Si cela montre un tas de déchets auxquels vous ne vous attendiez pas, il se masterpeut que vous ayez rebasé un ensemble de commits sous vous.
Michael - Où est Clay Shirky
21

Comme l'ont également noté John Szakmeister et VasiliNovikov, la commande la plus courte pour obtenir la différence complète du point de vue du maître sur votre branche est:

git diff master...

Cela utilise votre copie locale de master.

Pour comparer une utilisation de fichier spécifique:

git diff master... filepath

Exemple de sortie:

Exemple d'utilisation

Andrew Schreiber
la source