Faire la différence entre deux référentiels


203

Comment pouvons-nous faire la différence entre deux référentiels git?

Le scénario: Nous avons un repo_a et repo_b. Ce dernier a été créé comme une copie de repo_a. Il y a eu un développement parallèle dans les deux référentiels par la suite. Existe-t-il un moyen de répertorier les différences entre les versions actuelles de ces deux référentiels?


Réponses:


264

Dans repo_a:

git remote add -f b path/to/repo_b.git
git remote update
git diff master remotes/b/master
git remote rm b

3
Et si vous avez besoin de comparer repo_a / master avec une balise spécifique repo_b?
David Torres

2
ne fonctionne pas pour moi, ça lance: fatal: argument ambigu 'remotes / b / master': révision inconnue ou chemin pas dans l'arbre de travail. Utilisez '-' pour séparer les chemins des révisions, comme ceci: 'git <command> [<revision> ...] - [<file> ...]' Des idées ici?
Andrew Heekin le

2
J'obtiens la même chose que @AndrewHeekin. Quelqu'un a-t-il une solution?
parlement

4
Il me semble que j'ai besoin de préciser origin/masterplutôt qu'un simple master. En outre, cela permet de trouver la différence entre les branches principales, alors que faire si vous voulez trouver toutes les branches différentes? Par exemple, pour vérifier l'état d'une sauvegarde de référentiel?
davidA

1
Pouvez-vous expliquer ce que fait chaque ligne? Merci !
Enrique

40

Meld peut comparer des répertoires:

meld directory1 directory2

Utilisez simplement les répertoires des deux dépôts git et vous obtiendrez une belle comparaison graphique:

entrez la description de l'image ici

Lorsque vous cliquez sur l'un des éléments bleus, vous pouvez voir ce qui a changé.


2
Meld se fige tout en comparant les projets dans ma solution VS, BeyondCompare ne l'est pas.
Sasha Bond

4
sous OSX: diff -rq folder1 folder2
Mark

1
Magnifique lien! Programme très simple, je l'utilise maintenant comme programme de diff pour OSX.
dmanexe

2
C'est absolument adorable! Merci d'avoir partagé.
Shihab Khan

1
C'était la solution pour moi. Comparaison très simple des référentiels git.
Kostas Raptis

13

Vous pouvez d'abord ajouter un autre dépôt en tant que télécommande à votre dépôt actuel:

git remote add other_name PATH_TO_OTHER_REPO

puis récupérez brach de cette télécommande:

git fetch other_name branch_name:branch_name

cela crée cette branche en tant que nouvelle branche dans votre dépôt actuel, puis vous pouvez comparer cette branche avec n'importe laquelle de vos branches, par exemple, pour comparer la branche actuelle avec la nouvelle branche (nom_branche):

git diff branch_name

9

Une fois que vous avez les deux branches dans un référentiel, vous pouvez faire un git diff. Et les obtenir dans un référentiel est aussi simple que

git fetch /the/other/repo/.git refs/heads/*:refs/remotes/other/*

Existe-t-il un moyen de sélectionner l'historique avec un petit changement: par exemple, dans le référentiel distant, le fichier est placé dans un répertoire, mais je veux appliquer les modifications au même fichier mais qui est placé dans un répertoire différent du dépôt local?
Eugen Konkov

Si vous parlez d'un petit changement, je pense que le plus simple serait simplement de faire un diff et de le réappliquer à l'autre fichier en utilisant le patch.
Michael Krelin - hacker

Le correctif n'est pas appliqué en raison de noms de fichiers différents malgré les mêmes fichiers
Eugen Konkov

Oh, je ne pensais qu'à différents répertoires, pas aux noms de fichiers (les répertoires peuvent être facilement gérés via les options de patch). Eh bien, pour les noms de fichiers, je les changerais simplement manuellement ou via le script. Cela dit, je ne dis pas qu'il n'y a pas de meilleure solution, juste ce que je peux trouver sans creuser nulle part.
Michael Krelin - hacker

Et si je veux comparer toutes les branches?
endolith

7
git diff master remotes/b

C'est incorrect. remotes/best une télécommande, mais pas une succursale.

Pour le faire fonctionner, je devais faire:

git diff master remotes/b/master

3
Cela devrait vraiment être un commentaire sur la réponse pertinente.
EntangledLoops le

6

J'utilise PyCharm qui a de grandes capacités pour comparer entre les dossiers et les fichiers.

Ouvrez simplement le dossier parent des deux dépôts et attendez qu'il indexe. Ensuite, vous pouvez utiliser un clic droit sur un dossier ou un fichier Compare to...et choisir le dossier / fichier correspondant de l'autre côté.

Il montre non seulement quels fichiers sont différents, mais également leur contenu. Beaucoup plus facile que la ligne de commande.


6

Voir http://git.or.cz/gitwiki/GitTips , section "Comment comparer deux dépôts locaux" dans "Général".

En bref, vous utilisez la variable d'environnement GIT_ALTERNATE_OBJECT_DIRECTORIES pour avoir accès à la base de données d'objets de l'autre référentiel, et utilisez git rev-parse avec --git-dir/ GIT_DIR pour convertir le nom symbolique d'un autre référentiel en identifiant SHA-1.

La version moderne ressemblerait à quelque chose comme ceci (en supposant que vous soyez dans 'repo_a'):

GIT_ALTERNATE_OBJECT_DIRECTORIES = .. / repo_b / .git / objets \
   git diff $ (git --git-dir = .. / repo_b / .git rev-parse --verify HEAD) HEAD

../repo_b/.gitest le chemin de la base de données d'objets dans repo_b (ce serait repo_b.git s'il s'agissait d'un référentiel nu). Bien sûr, vous pouvez comparer des versions arbitraires, pas seulement des HEAD.


Notez que si repo_a et repo_b sont le même référentiel, il peut être plus judicieux de les mettre tous les deux dans le même référentiel, soit en utilisant " git remote add -f ..." pour créer des pseudonymes pour le référentiel pour les mises à jour répétées, soit en désactivant " git fetch ..."; comme décrit dans d'autres réponses.


3

Un moyen simple de le faire sans toucher à la configuration de vos télécommandes. À partir du repo A, dans master (supposons que vous souhaitiez comparer les branches master):

git fetch path/to/repo_b.git master
git diff FETCH_HEAD

2

Votre meilleur pari est d'avoir les deux repos sur votre machine locale et d'utiliser la commande linux diff avec les deux répertoires comme paramètres:

diff -r repo-A repo-B


2
La seule façon de rendre cela utilisable est de renommer l'un des répertoires .git. cela réduit à deux lignes des pages de différences qui n'ont pas d'importance. J'y suis allé, j'ai fait ça, je suis venu ici pour chercher une meilleure réponse.
hildred

0

Vous pouvez utiliser la commande suivante:

diff -x .git -r repo-A repo-B

ou pour le côte à côte, vous pouvez utiliser:

diff -x .git -W200 -y -r repo-A repo-B

En cas de colorisation de chaque fichier de différence, vous pouvez utiliser:

diff -x .git -W200 -y -r repo-A repo-B | sed -e "s/\(^diff .*\)/\x1b[31m\1\x1b[0m/"

basé sur la solution @ andrew-heekin
Gerard

0

Rappel à soi-même ... récupérez d'abord, sinon le référentiel n'a pas de hachage local (je suppose).

étape 1. Configurez la télécommande en amont et au-dessus ^

la différence d'un seul fichier suit ce modèle:

git diff localBranch uptreamBranch --spacepath / singlefile

git diff master upstream/nameofrepo -- src/index.js

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.