Comment comparer des fichiers de deux branches différentes?

1538

J'ai un script qui fonctionne bien dans une branche et qui est cassé dans une autre. Je veux regarder les deux versions côte à côte et voir ce qui est différent. Existe-t-il des moyens de procéder?

Pour être clair, je ne recherche pas d'outil de comparaison (j'utilise Beyond Compare). Je cherche une commande git diff qui me permettra de comparer la version principale à ma version de branche actuelle pour voir ce qui a changé. Je ne suis pas au milieu d'une fusion ou quoi que ce soit. Je veux juste dire quelque chose comme

git diff mybranch/myfile.cs master/myfile.cs
Michée
la source

Réponses:

2208

git diff peut vous montrer la différence entre deux commits:

git diff mybranch master -- myfile.cs

Ou équivalent:

git diff mybranch..master -- myfile.cs

En utilisant cette dernière syntaxe, si l'un ou l'autre côté est, HEADil peut être omis (par exemple, se master..compare masterà HEAD).

Vous pouvez également être intéressé par mybranch...master(à partir de git diffdocuments ):

Ce formulaire permet d'afficher 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...Best équivalent à git diff $(git-merge-base A B) B.

En d'autres termes, cela donnera un diff de changements masterdepuis qu'il a divergé de mybranch(mais sans nouveaux changements depuis lors mybranch).


Dans tous les cas, le --séparateur avant le nom du fichier indique la fin des indicateurs de ligne de commande. C'est facultatif à moins que Git ne devienne confus si l'argument fait référence à un commit ou à un fichier, mais l'inclure n'est pas une mauvaise habitude. Voir https://stackoverflow.com/a/13321491/54249 pour quelques exemples.


Les mêmes arguments peuvent être transmis à git difftoolsi vous en avez configuré un.

dahlbyk
la source
44
Et si aucune des deux versions que vous souhaitez comparer n'est l'arborescence de travail, vous pouvez l'utiliser git diff branch1 branch2 myfile.cs. (Le --ne devrait plus être nécessaire, car il ne peut prendre que deux arguments de révision.)
Cascabel
8
J'ai essayé toutes les versions et rien ne se passe. J'ai mon difftool configuré (cela fonctionne pour la fusion). J'ai un fichier appelé bd.ps1. Chaque version de la commande que je tape ne fait rien. Ne donne même pas une erreur. WTH!?!?!
Micah
3
@Micah: L'essayez-vous également avec un diff simple? Tapez-vous correctement le chemin d'accès par rapport au répertoire actuel? (Il ne montrera silencieusement aucune différence si le fichier n'existe pas, et vous utilisez l' --erreur. Commune et facile à faire.)
Cascabel
5
Cela ne fonctionnait pas pour moi à moins que j'inclue le chemin complet du fichier, comme indiqué par git diff --name-status branch1..branch2(probablement évident, mais pensais que je le mentionnerais au cas où quelqu'un d'autre aurait le même problème que moi).
hBrent
4
L'ordre de mybranch et master est également important. Le fichier dans la première branche sera affiché avec les préfixes «-», le fichier dans la deuxième branche sera affiché avec les préfixes «+».
timbo
414

Tu peux le faire: git diff branch1:path/to/file branch2:path/to/file

Si vous avez configuré difftool, vous pouvez également: git difftool branch1:path/to/file branch2:path/to/file

Question connexe: Comment puis-je afficher la sortie git diff avec le programme visual diff

Tim Henigan
la source
4
L'utilisation des deux-points n'est pas vraiment un excellent moyen - cela signifie que vous faites référence aux fichiers via les objets de l'arborescence, vous devez donc taper le chemin complet, plutôt que par rapport à votre répertoire actuel.
Cascabel
13
@Jefromi, cela peut avoir changé dans une version plus récente, mais au moins maintenant vous pouvez utiliser des chemins relatifs (par exemple branch1:./file). Ceci est également utile si le fichier se trouve dans un emplacement séparé entre les branches (par exemple git diff branch1:old/path/to/file branch2:new/path/to/file).
redbmk
4
@redbmk Ouais, c'était entre 2010 et maintenant! Pourtant, si c'est le même fichier sur les deux branches, pas besoin de le faire comme ça, juste git diff branch1 branch2 path/to/file.
Cascabel
3
@jefromi cool, je n'étais pas sûr de la chronologie de l'ajout. Oui, j'utiliserais normalement la syntaxe que vous avez mentionnée, mais la réponse de Tim m'a aidé à comprendre comment comparer des fichiers avec des chemins différents, même si ce n'est pas vraiment ce que la question demandait
redbmk
1
Bien que j'adore cette idée, je n'arrive pas à faire fonctionner cette syntaxe ni à en trouver mention dans les documents de git diff. Qu'est-ce que je rate? Merci!
yoyo
160

Syntaxe plus moderne:

git diff ..master path/to/file

Le préfixe à deux points signifie "du répertoire de travail actuel à". Vous pouvez également dire:

  • master.., c'est-à-dire l'inverse de ce qui précède. C'est la même chose que master.
  • mybranch..master, référençant explicitement un état autre que l'arborescence de travail actuelle.
  • v2.0.1..master, c'est-à-dire référencer une balise.
  • [refspec]..[refspec], fondamentalement tout ce qui peut être identifié comme un état de code à git.
Joe Atzberger
la source
33

Il existe de nombreuses façons de comparer des fichiers de deux branches différentes:

  • Option 1: Si vous souhaitez comparer le fichier de n branche spécifique à une autre branche spécifique:

    git diff branch1name branch2name path/to/file
    

    Exemple:

    git diff mybranch/myfile.cs mysecondbranch/myfile.cs
    

    Dans cet exemple, vous comparez le fichier de la branche «mybranch» au fichier de la branche «mysecondbranch».

  • Option 2: manière simple:

     git diff branch1:file branch2:file
    

    Exemple:

     git diff mybranch:myfile.cs mysecondbranch:myfile.cs
    

    Cet exemple est similaire à l'option 1.

  • Option 3: Si vous souhaitez comparer votre répertoire de travail actuel à une branche:

    git diff ..someBranch path/to/file
    

    Exemple:

    git diff ..master myfile.cs
    

    Dans cet exemple, vous comparez le fichier de votre branche réelle au fichier de la branche principale.

Javier C.
la source
12

Je fais simplement git diff branch1 branch2 path/to/file

Cela vérifie les différences entre les fichiers. Les changements en branch1seraient en rouge. Les changements dans branch2seraient en vert.

On suppose que branch1c'est le passé et branch2l'avenir. Vous pouvez inverser cela en inversant l'ordre des branches dans le diff:git diff branch2 branch1

iGbanam
la source
Quelle version de git diff peut faire cela? Il ne semble pas être pris en charge dans la version que j'utilise (2..9.2.windows.1).
Vince Bowdren du
9

Si vous voulez faire un diff par rapport à la branche courante, vous pouvez l'oublier et utiliser:

git diff $BRANCH -- path/to/file

de cette façon, il diffère de la branche actuelle à la branche référencée ( $BRANCH).

Paulo Fidalgo
la source
5

En accord avec la réponse suggérée par @dahlbyk. Si vous souhaitez que le diff soit écrit dans un fichier diff pour des révisions de code, utilisez la commande suivante.

git diff branch master -- filepath/filename.extension > filename.diff --cached
Azad
la source
2

Dans mon cas, j'utilise la commande ci-dessous:

git diff <branch name> -- <path + file name>

Cette commande peut vous aider à comparer le même fichier dans deux branches différentes

SKT
la source
1

La meilleure façon de le faire est d'utiliser git diffde la manière suivante: git diff <source_branch> <target_branch> -- file_path

Il vérifiera la différence entre les fichiers de ces branches. Jetez un œil à cet article pour plus d'informations sur les commandes git et leur fonctionnement.

Nesha Zoric
la source
1

Utilisez des hachages de validation comme ceci:

git diff <hash1> <hash2> <filename>

hash1 peut être n'importe quel commit de n'importe quelle branche, de même pour hash2 .

prometeu
la source
1

Il existe deux scénarios pour comparer des fichiers:

Scénario 1: comparer les fichiers dans les succursales distantes (les deux succursales devraient exister dans le référentiel distant)

Scénario 2: comparer les fichiers locaux (sur la copie de la zone de travail locale) aux fichiers du référentiel distant.

La logique est simple. Si vous fournissez deux noms de branche à diff, il comparera toujours les branches distantes et si vous ne fournissez qu'un seul nom de branche, il comparera toujours votre copie de travail locale avec le référentiel distant (celui que vous avez fourni). Vous pouvez utiliser range pour fournir des référentiels distants.

p.ex. commander une succursale

git checkout branch1
git diff branch2 [filename]

dans ce cas, si vous fournissez un nom de fichier, il comparera votre copie locale du nom de fichier avec la branche distante nommée " branch2 ".

git diff branch1 branch2 [filename]

dans ce cas, il comparera le nom de fichier des branches distantes nommées " branch1 " vs " branch2 "

git diff ..branch2 [filename]

dans ce cas également, il comparera le nom de fichier des branches distantes nommées " branch1 " vs " branch2 ". Donc, c'est la même chose que ci-dessus. Cependant, si vous venez de créer une branche à partir d'une autre branche, dites "maître" et que votre branche actuelle n'existe pas sur le référentiel distant, elle comparera à distance " maître " distant contre la " branche2 " distante .

J'espère que c'est utile.

Dharmender Rawat
la source
0

Afin de comparer deux fichiers dans le git bash, vous devez utiliser la commande:

git diff <Branch name>..master -- Filename.extension   

Cette commande montrera la différence entre les deux fichiers dans le bash lui-même.

Rishav_SO
la source