Voir les différences de branches avec meld?

159

Je sais que je peux voir la différence entre HEAD et l'état actuel avec meld .. Mais comment puis-je voir les différences entre les branches, par exemple masteretdevel avec meld?

Pour le moment, je fais les étapes suivantes:

  1. Renommer le dossier de la copie de travail
    Par exemplemv /projectA /projectA_master )
  2. Cloner à nouveau le projet
    git clone url
  3. Passer en develsuccursale
    cd projectA && git -b devel origin/devel
  4. Voir les différences avec meld
    meld /projectA_Master projectA

N'y a-t-il pas un moyen plus simple d'obtenir le même résultat en fusion? Je n'en ai besoin que pour examiner les changements et pas principalement pour la fusion.

Marten Bauer
la source
Est-ce que cela répond à votre question? Configurer et utiliser Meld comme git difftool et mergetool
evan.bovie

Réponses:

55

J'ai également trouvé ce problème ennuyeux, j'ai donc créé git meld qui permet un moyen plus confortable de différencier les commits arbitraires par rapport à l'arbre de travail ou à la zone de préparation. Vous pouvez le trouver sur https://github.com/wmanley/git-meld . C'est un peu comme le script de Mark mais fonctionne pour comparer n'importe quel commit arbitraire ou la zone de préparation ou le répertoire de travail avec l'un des autres. Si l'une des choses que vous comparez est l'arbre de travail, alors c'est également en lecture-écriture pour que vous ne perdiez pas vos modifications.

Will Manley
la source
1
Excellent outil, Will. Merci! Vivement recommandé ... maintenant si seulement cela fonctionnait également sur les fusions.
Jauge de niveau
TYVM pour un excellent outil - (rappel à soi-même d'ajouter! À l'alias)
kfmfe04
26
Citant Will, du référentiel hit github: "REMARQUE: git-meld est obsolète depuis que git difftool a appris l'option --dir-diff dans git 1.7.11."
oluc
318

Court et doux:

git config --global diff.tool meld

Cela configure Git pour l'utiliser meldcomme outil de comparaison. (Vous n'avez pas besoin de spécifier les arguments de ligne de commande, la prise en charge de meldest intégrée à Git.)

Ensuite, si vous voulez un diff graphique au lieu d'un texte, vous appelez simplement à la git difftoolplace de git diff(ils prennent tous les deux les mêmes arguments). Dans ton cas:

git difftool master..devel

Mise à jour: Si vous ne voulez pas le diff un fichier à la fois, mais que vous voulez plutôt utiliser la vue «sous-répertoire» de meld avec toutes les modifications entre les deux branches, notez l' option -dou --dir-diffpour git difftool. Par exemple, lorsque je suis sur la branche XYZ et que je veux voir ce qui est différent entre ceci et la branche ABC, je lance ceci:

git difftool -d ABC
Jörg W Mittag
la source
3
ce n'est pas ce que je recherche. Il me montre les différences fichier par fichier. Je l'ai archivé avec un script diff.py et 'git diff master..devel' avant. Je veux voir toutes les différences et l'arborescence des répertoires comme le fait 'meld folderA / folderB /'.
Marten Bauer
Marten, c'est comme ça que ça marche. Il ne suit que le fichier, vous ne pouvez donc voir que les différences fichier par fichier. Dans git, vous ne pouvez pas valider un répertoire vide seul. Une raison particulière pour laquelle vous souhaitez afficher les différences entre les répertoires?
Donny Kurnia
@DonnyKurnia: Il m'a fallu un peu de temps pour comprendre ce qu'OP essaie de faire: Meld a une interface utilisateur distincte pour afficher toutes les modifications dans un répertoire. Vous pouvez filtrer l'affichage des fichiers en fonction de s'ils sont identiques, modifiés ou nouveaux. OP souhaite utiliser cette interface utilisateur pour afficher les modifications. (Cela vous permet de voir une liste de toutes les modifications et de choisir celles que vous souhaitez modifier.) Il ne s'agit donc pas d'une comparaison entre les répertoires, mais d'une comparaison entre les validations mais vues dans leur ensemble.
idbrii
17
@MartenBauer Je pense que c'est ce que vous voulez: git difftool --dir-diff master devel
Stéphane
3
Cela peut-il être fait pour que la branche actuelle ne se trouve pas dans un dossier tmp et permette ainsi les modifications?
zkent
100

À partir de git v1.7.11, vous pouvez utiliser git difftool --dir-diffpour effectuer une différence de répertoire. Ce qui fonctionne assez bien avec les scripts meld wihout https://github.com/wmanley/git-meld .

Configurer git

git config --global diff.tool meld

Utilise le

git difftool -d topic             // -d is --dir-diff
git difftool -d master..topic

Pour macOS

brew cask install meld
git config --global difftool.meld.cmd 'open -W -a Meld --args \"$LOCAL\" \"$PWD/$REMOTE\"'
git config --global difftool.meld.trustExitCode true
GutenYe
la source
2
Je pense que c'est vraiment ce que voulait l'OP. Notez l'option -g pour utiliser l'outil guidiff et l'option -d pour utiliser un --dir-diff. C'est bien pour faire des révisions de code. Nit: l'option difftool.prompt n'est pas requise lors de la spécification de -d, du moins pour Git 1.8.
Michael Percy
1
Ceci est incroyable. Exactement ce dont j'avais besoin. Je vous remercie!
Nicholas
5
Cela peut-il être fait pour que la branche actuelle ne se trouve pas dans un dossier tmp et permette ainsi les modifications?
zkent
2
J'apprécierais également une réponse à la question @zkent ... :(
tavlima
3
@zkent @tavlima: Cette commande, déjà, permet des modifications sur votre version actuelle. Même si vous voyez un floder tmp dans meld, si vous enregistrez - Ctrl+s- la bonne partie, votre fichier est modifié.
Benjamin
13

Il est important de dire qu'en utilisant, git difftool -dvous pouvez toujours modifier vos fichiers de travail dans Meld et les enregistrer . Pour y parvenir, vous devez comparer une branche à votre arbre de travail actuel, par exemple:

git difftool -d branchname

Meld montrera que les répertoires gauche et droit se trouvent dans / tmp. Cependant, les fichiers dans le bon répertoire sont en fait des liens symboliques vers vos fichiers dans le répertoire de travail actuel (ne s'applique pas à Windows). Vous pouvez donc les modifier directement dans Meld et lorsque vous les enregistrez, vos modifications seront enregistrées dans votre répertoire de travail.

Une option encore plus intéressante est la comparaison du répertoire de travail actuel avec le stash. Vous pouvez le faire en tapant simplement:

git difftool -d stash

Ensuite, vous pouvez transférer certaines modifications de la réserve (fenêtre de gauche) vers votre copie de travail actuelle (fenêtre de droite), sans utiliser git stash pop/apply et éviter la résolution de conflit gênante qui peut être induite par ces commandes.

Je pense que cela peut considérablement augmenter le flux de travail avec des caches. Vous pouvez transférer progressivement les modifications de la réserve à la copie de travail et les valider une par une, en introduisant d'autres modifications si vous le souhaitez.

Piotr Jurkiewicz
la source
Piotr, c'est exactement ce que j'ai essayé de faire, mais dans mon cas (sur CentOS), aucun lien symbolique n'est créé. Existe-t-il une configuration de configuration requise ou une version minimale de meld qui prend en charge cela?
wrjohns
Je pense que Git est responsable de la création des liens symboliques, pas Meld. Consultez le manuel de Git pour la commande difftool. Peut-être devriez-vous le mettre à jour vers une version plus récente?
Piotr Jurkiewicz
2
copier les nouveaux fichiers de la branche vers le répertoire de travail ne fonctionne pas :(
pykiss
5

Bien qu'il semble, d'après les autres réponses, qu'il n'y ait pas de moyen de le faire directement dans le dépôt git pour le moment, il est facile (grâce à la réponse à une autre question :)) d'écrire un script qui extraira les arbres de deux commits dans les répertoires temporaires et exécutez meld sur eux, en supprimant les deux répertoires lorsque meld se termine:

http://gist.github.com/498628

Bien sûr, vous perdrez toutes les modifications apportées via meld, mais c'est assez agréable pour un aperçu rapide des différences, je pense.

Mark Longair
la source
3

Je pense qu'un moyen simple de le faire est d'utiliser git reset --soft:

Objectif: comparer les différences entre branch_a et branch_b avec meld

git checkout branch_a
git checkout -b do_diff
git reset --soft branch_b
meld .
temps réel
la source
0

Dans git V1.7.9, vous pouvez comparer deux commits sans la ligne de commande:

Vous devez configurer dans les options d'édition de 'git gui', globales: "Utiliser l'outil de fusion: meld".

Démarrez gitk , sélectionnez un commit, faites un clic droit sur un autre commit> " diff this -> selected ". Sous 'patch', faites un clic droit sur un fichier> " diff externe ".

meld démarre et affiche le premier commit toujours sélectionné sur le côté droit.

Stefan Forster
la source
0

Pour Meld sur macOS, ajoutez ceci à votre ~/.gitconfigcomme recommandé par le mainteneur de l'application macOS, yousseb :

[diff]
  tool = meld
[difftool]
  prompt = false
[difftool "meld"]
  trustExitCode = true
  cmd = open -W -a Meld --args \"$LOCAL\" \"$REMOTE\"
[merge]
  tool = meld
[mergetool]
  prompt = false
[mergetool "meld"]
  trustExitCode = true
  cmd = open -W -a Meld --args --auto-merge \"$LOCAL\" \"$BASE\" \"$REMOTE\" --output=\"$MERGED\"

Vous pouvez omettre les mergeconfigurations si vous le souhaitez.

La réponse de @ GutenYe n'a pas fonctionné pour moi en raison de l'échappement automatique et / ou de quelque chose avec zsh.

evan.bovie
la source