Affichage des fichiers qui ont changé entre deux révisions

2105

Je veux fusionner deux branches qui ont été séparées pendant un certain temps et je voulais savoir quels fichiers ont été modifiés.

Je suis tombé sur ce lien: http://linux.yyz.us/git-howto.html qui était assez utile.

Les outils pour comparer les branches que j'ai rencontrées sont:

  • git diff master..branch
  • git log master..branch
  • git shortlog master..branch

Je me demandais s'il y avait quelque chose comme "git status master..branch" pour ne voir que les fichiers qui sont différents entre les deux branches.

Sans créer un nouvel outil, je pense que c'est le plus proche que vous pouvez faire maintenant (qui bien sûr affichera des répétitions si un fichier a été modifié plusieurs fois):

  • git diff master..branch | grep "^diff"

Je me demandais s'il y avait quelque chose qui me manquait ...

johannix
la source
12
Combien d'autres trouvent le titre de cette question trompeur? Il s'agit en fait de trouver les différences de fichier entre deux branches. Ce que je suis venu ici, c'est comment voir les différences de fichiers entre deux révisions sur la même branche. Ou suis-je le seul?
Sandeepan Nath
4
@SandeepanNath: avec git il n'y a pas de différence. Vous faites TOUJOURS référence à des commits individuels.
Samuel O'Malley
@ SamuelO'Malley Je suis nouveau sur git et je considère la stratégie de branchement apparemment courante dans laquelle toutes les branches sont finalement fusionnées avec la branche principale et finalement le maître est déployé. Maintenant, compte tenu de l'événement d'un déploiement, où la production est déjà en master, mais derrière la pointe (par une révision si le dernier déploiement s'est produit après la dernière fusion du master), je voudrais voir les différences entre ces deux révisions, pour savoir ce qui serait déployé. Je ne voudrais pas regarder la branche qui a été fusionnée pour la dernière fois. Corrigez-moi si je me trompe.
Sandeepan Nath
2
@SandeepanNath: au lieu d'utiliser les noms de branche, vous pouvez prendre les réponses ci-dessous et simplement spécifier les ID de validation à la place. Ou référez même les validations par leurs noms de balises si vous créez des balises lors du déploiement.
Samuel O'Malley
1
@SandeepanNath Vous ne pouvez pas comparer 2 branches, vous devez spécifier la révision. Donc, comparer 2 branches, c'est comparer 2 révisions.
Bastien Vandamme

Réponses:

2575

Pour comparer la branche actuelle avec une masterbranche:

$ git diff --name-status master

Pour comparer deux branches:

$ git diff --name-status firstbranch..yourBranchName

Lisez la suite git diffdans la documentation officielle .

JasonSmith
la source
2
Que signifient chacun des indices sur le côté gauche (je vois beaucoup de M et D)?
gogogadgetinternet
15
@ user446936 - vous pouvez voir la signification des lettres dans la page de manuel git status @ kernel.org/pub/software/scm/git/docs/git-status.html - en particulier, M == modifié, D == supprimé
James Manning
12
git diff --name-status your_branch...masteraffiche les modifications qui se sont produites sur le maître depuis la création de your_branch
Radu
1
L'opérateur à double point est superflu, ici, car les différences sont par paire.
jub0bs
2
J'obtiens une révision ou un chemin inconnu qui ne se trouve pas dans l'arborescence de travail.
SuperUberDuper
408

Essayer

$ git diff --stat --color master..branchName

Cela vous donnera plus d'informations sur chaque modification, tout en utilisant le même nombre de lignes.

Vous pouvez également inverser les branches pour obtenir une image encore plus claire de la différence si vous fusionniez dans l'autre sens:

$ git diff --stat --color branchName..master
Gerry
la source
77
Si la couleur git (fortement recommandée, à mon humble avis) est activée ( config --global color.ui true), vous pouvez ignorer --color. (J'ai lks - syndrome du clavier paresseux.)
Art Swri
25
Je suis avec toi sur la couleur! BTW je voulais dire git config --global color.ui true- pour être complet.
Art Swri
2
Ne fonctionne pas, jette des erreurs:fatal: ambiguous argument 'master..branchName': unknown revision or path not in the working tree.
Tomáš Zato - Réintègre Monica le
7
@ TomášZato désolé mais vous devez échanger "branchName" avec le nom de votre branche.
Gerry
161

Gardez également à l'esprit que git a des branchements bon marché et faciles. Si je pense qu'une fusion pourrait être problématique, je crée une branche pour la fusion. Donc simaster j'ai les changements dans balesquels je veux fusionner et que ma branche a besoin du code du maître, je pourrais faire ce qui suit:

git checkout ba
git checkout -b ba-merge
git merge master
.... review new code and fix conflicts....
git commit
git checkout ba
git merge ba-merge
git branch -d ba-merge
git merge master

Le résultat final est que j'ai pu essayer la fusion sur une branche jetable avant de visser avec ma branche. Si je m'embrouille, je peux simplement supprimer la ba-mergebranche et recommencer.

Eric Anderson
la source
4
Impressionnant. Je n'ai jamais pensé à me ramifier de cette façon. Je pense que cela devrait être considéré comme faisant partie des "meilleures pratiques" lors de la fusion.
egelev
Lorsque vous fusionnez à nouveau le ba-marge en ba, n'y a-t-il pas un risque de devoir à nouveau résoudre les conflits?
Josef.B
2
@EricAnderson À droite, c'est un graphique. SVN colle comme de la gomme sous un banc d'école. THX.
Josef.B
1
Pourquoi avez-vous besoin de faire la dernière étape 'git merge master' si ba-merge avait déjà master
qwebek
Vous pourriez le laisser de côté. La seule raison pour laquelle cela serait utile est que de nouveaux éléments arrivent pendant masterque vous travaillez sur la révision du code et la résolution des conflits.
Eric Anderson
58

Si quelqu'un essaie de générer un fichier diff à partir de deux branches:

git diff master..otherbranch > myDiffFile.diff
Paulino III
la source
2
Cela s'est avéré particulièrement utile avec de grandes branches contenant beaucoup de différences.
vandsh
Ceci est utile lorsque la différence est vraiment importante. Par défaut, il ne montrerait pas tous les diff dans la console (je me demandais pourquoi), passer le diff à un fichier est la voie à suivre dans ce cas.
rotimi-best
42

Il existe également une méthode basée sur l'interface graphique.

Vous pouvez utiliser gitk .

  1. Courir:

    $ gitk --all
    
  2. Cliquez avec le bouton droit sur un commit d'une branche et sélectionnez Marquer ce commit dans le menu contextuel.

  3. Faites un clic droit sur un commit d'une autre branche et sélectionnez Diff this -> commit commit ou Diff commit commit -> this .

Ensuite, il y aura une liste de fichiers modifiés dans le panneau inférieur droit et les détails des différences dans le panneau inférieur gauche.

Yantao Xie
la source
3
@Orwellophile Je télécharge une vidéo pour montrer comment le faire. J'espère que cela vous aidera.
Yantao Xie
Wow, juste pour moi, je me sens spécial. Je l'ai mis en favori dans delicious.com pour référence future et google-foo supplémentaire.
Orwellophile
Réponse gravement sous-estimée. Merci!
Koshinae
36

Encore une option, en utilisant meld dans ce cas:

git difftool -d master otherbranch

Cela permet non seulement de voir les différences entre les fichiers, mais fournit également un moyen facile de pointer et de cliquer sur un fichier spécifique.

rsilva4
la source
6
Peut vouloir définir meld comme difftool par défaut: git config --global diff.tool meld
bwv549
1
C'est mon préféré car il utilisera n'importe quel outil différent que vous configurerez.
Josiah
Non pris en charge sur OSX. :-(
Mike S.
@MikeS. veuillez vérifier cette réponse stackoverflow.com/a/12815806/151918 elle contient des instructions pour OSX. Cela fonctionne pour moi au moins, j'espère que cela aide.
rsilva4
Agréable. Mais à quoi sert cette -doption?
Scotty.NET
29

Notez que git vous permet d'essayer simplement la fusion et de vous éloigner de tout problème si vous n'aimez pas le résultat. Cela pourrait être plus facile que de rechercher à l'avance les problèmes potentiels.

David Plumpton
la source
10
David, c'est un bon point, même si ce serait bien de savoir ce qui se passe avant ...
johannix
18

Et si vous recherchez des changements uniquement parmi certains fichiers, alors:

git diff branch1 branch2 -- myfile1.js myfile2.js

branch1 est facultatif et votre branche actuelle (la branche sur laquelle vous vous trouvez) sera considérée par défaut si branch1 n'est pas fourni. par exemple:

git diff master -- controller/index.js
Mannu
la source
15

Lorsque vous travaillez en collaboration, ou sur plusieurs fonctionnalités à la fois, il est courant que l'amont ou même votre maître contienne du travail qui n'est pas inclus dans votre branche et n'apparaisse pas correctement dans les différences de base.

Si votre amont peut avoir bougé, vous devez le faire:

git fetch
git diff origin/master...

Le simple fait d'utiliser git diff master peut inclure ou ne pas inclure les modifications pertinentes.

Alex Brown
la source
8

Il y a deux branches disons

  • A (succursale sur laquelle vous travaillez)
  • B (une autre branche avec laquelle vous souhaitez comparer)

Étant dans la branche A, vous pouvez taper

git diff --color B

alors cela vous donnera une sortie de

entrez la description de l'image ici

Le point important à ce sujet est

  1. Le texte en vert est à l'intérieur présent dans la branche A

  2. Le texte en rouge est présent dans la branche B

selftaught91
la source
8

Il y a beaucoup de réponses ici, mais je voulais ajouter quelque chose que j'utilise couramment. SI vous êtes dans l'une des branches que vous souhaitez comparer, je fais généralement l'une des actions suivantes. Pour cette réponse, nous dirons que nous sommes dans notre branche secondaire. En fonction de la vue dont vous avez besoin à l'époque dépendra de ce que vous choisissez, mais la plupart du temps j'utilise la deuxième option des deux. La première option peut être utile si vous essayez de revenir à une copie originale - de toute façon, les deux font le travail!

Cela comparera le maître à la branche dans laquelle nous sommes (qui est secondaire) et le code d'origine sera les lignes ajoutées et le nouveau code sera considéré comme les lignes supprimées

git diff ..master

OU

Cela comparera également le maître à la branche dans laquelle nous nous trouvons (qui est secondaire) et le code d'origine sera les anciennes lignes et le nouveau code sera les nouvelles lignes

git diff master..
TheCodenator
la source
1

Si vous utilisez Github / Github Enterprise, vous pouvez utiliser l'interface utilisateur Web en appuyant sur l'URL /comparede votre chemin de référentiel, par exemple, https://github.com/http4s/http4s/compare . Vous pouvez sélectionner la branche / commit / tag que vous souhaitez comparer: Capture d'écran de Github Compare

Et le diff sera présenté dans l'interface github à l'url /compare/{x1}...{x2}où sont x2et x1sont la branche / commit / tag que vous souhaitez comparer, par exemple: https://github.com/http4s/http4s/compare/release-0.18.x ...Maître

Vous pouvez en voir plus dans le Github Doc .

Valy Dia
la source
0

Pour les personnes qui recherchent une solution GUI, Git Cola a un très joli "Branch Diff Viewer ( Diff -> Branches .. ).

kerner1000
la source
-1
git diff revision_n revision_m

si revision_net revision_msont des validations successives, il génère la même chose que git show revision_m

Jovo Skorupan
la source
-1

Vous pouvez également utiliser un diff visuel .

Par exemple, si vous utilisez Sourcetree , vous pouvez simplement sélectionner deux validations dans la vue du journal .

(Personnellement, je préfère utiliser une interface graphique dans la plupart des cas pour cela, et je publie ceci pour ceux qui ne connaissent peut-être pas les options de l'interface graphique.)

fiston
la source
-2

Si vous aimez l'interface graphique et utilisez Windows, voici un moyen simple.

  1. Télécharger WinMerge
  2. Découvrez les deux branches dans des dossiers différents
  3. Faites une comparaison dossier par dossier à l'aide de WinMerge. Vous pouvez également facilement apporter des modifications si l'une des branches est celle sur laquelle vous travaillez.
Marius Matioc
la source
Ce n'est pas le moyen le plus simple, il n'est en fait pas nécessaire de télécharger des dépôts pour faire la différence entre les branches.
stefgosselin
Ce n'est en effet pas le moyen le plus simple, mais c'est le moyen GUI, qui est souvent beaucoup plus facile, surtout pour voir les différences dans tous les fichiers
Marius Matioc
-3

Vous pouvez également comparer facilement les branches des fichiers modifiés en utilisant par exemple TortoiseGit . Cliquez simplement sur Parcourir les références et choisissez les branches que vous souhaitez comparer.

Par exemple, si vous comparez votre branche avec master, vous obtiendrez comme résultat une liste de fichiers qui seront modifiés dans master si vous décidez de fusionner votre branche en master .

Rappelez-vous que vous obtiendrez un résultat différent si vous comparez master avec votre branche et votre branche avec master .

Piotr
la source
1
la question semble concerner l'utilitaire git natif
Vladimir Hraban