web-dev-qa-db-fra.com

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

Comment pouvons-nous faire la différence entre deux dépôts git?

Le scénario: nous avons un repo_a et un repo_b. Ce dernier a été créé en tant que copie de repo_a. Des développements parallèles ont eu lieu par la suite dans les deux dépôts. Existe-t-il un moyen de lister les différences entre les versions actuelles de ces deux référentiels?

150
sanjayav

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
213
iamamac

Meld peut comparer les annuaires:

meld directory1 directory2

Utilisez simplement les répertoires des deux dépôts Git et vous obtiendrez une comparaison graphique intéressante:

enter image description here

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

17
Martin Thoma

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/*
7

Vous pouvez ajouter d’abord 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 chercher 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 référentiel actuel. Vous pouvez ensuite la comparer à n'importe laquelle de vos branches, par exemple, pour comparer la branche actuelle à une nouvelle branche (nom de la branche):

git diff branch_name
6
M.Kouchi

Voir http://git.or.cz/gitwiki/GitTips , section "Comment comparer deux référentiels locaux" dans "Général".

En bref, vous utilisez la variable d’environnement GIT_ALTERNATE_OBJECT_DIRECTORIES pour accéder à la base de données objets de l’autre référentiel, et vous 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 à ceci (en supposant que vous êtes dans 'repo_a'):

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

../repo_b/.git est le chemin d'accès à la base de données objet 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 HEADs.


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

5
Jakub Narębski
git diff master remotes/b

C'est faux. remotes/b est une télécommande, mais pas une branche.

Pour que cela fonctionne, je devais faire:

git diff master remotes/b/master
5
James

J'utilise PyCharm qui offre d'excellentes possibilités de comparaison 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 et Compare to... et choisissez 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.

2
MrE

Votre meilleur choix 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

1
Andrew Heekin

Un moyen simple de le faire sans toucher à la configuration de vos télécommandes. Depuis le référentiel A, en maître (supposons que vous souhaitiez comparer les branches principales):

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