Получение разницы между двумя репозиториями

Как мы можем получить разницу между двумя репозиториями git?

Сценарий: У нас есть repo_a и repo_b. Последний был создан как копия repo_a. После этого были параллельные разработки в обоих хранилищах. Есть ли способ перечислить различия в текущих версиях этих двух репозиториев?

Ответ 1

В 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

Ответ 2

Мелд может сравнить каталоги:

meld directory1 directory2

Просто используйте каталоги двух репозиториев git, и вы получите хорошее графическое сравнение:

enter image description here

Когда вы нажимаете на один из синих элементов, вы можете увидеть, что изменилось.

Ответ 3

Как только у вас есть две ветки в одном репозитории, вы можете сделать git diff. И получение их в одном репозитории так же просто, как

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

Ответ 4

git diff master remotes/b

Это неверно. remotes/b является удаленной, но не ветвью.

Чтобы заставить его работать, мне пришлось:

git diff master remotes/b/master

Ответ 5

Вы можете добавить другое репо сначала как удаленное для своего текущего репо:

git remote add other_name PATH_TO_OTHER_REPO

затем возьмитесь за плечо с этого пульта:

git fetch other_name branch_name:branch_name

это создает эту ветвь как новую ветвь в вашем текущем репо, тогда вы можете разделить эту ветвь с любой из ваших ветвей, например, сравнить текущую ветку с новой веткой (имя_индустрии):

git diff branch_name

Ответ 6

См. http://git.or.cz/gitwiki/GitTips, раздел "Как сравнить два локальных репозитория" в "Общие".

Короче говоря, вы используете переменную окружения GIT_ALTERNATE_OBJECT_DIRECTORIES, чтобы иметь доступ к объектной базе данных другого репозитория и используя git rev-parse с помощью --git-dir/GIT_DIR для преобразования символического имени в другой репозиторий в идентификатор SHA-1.

Современная версия будет выглядеть примерно так (предполагая, что вы находитесь в '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 - это путь к объектной базе данных в repo_b (это был бы repo_b.git, если бы это был голый репозиторий). Конечно, вы можете сравнивать произвольные версии, а не только HEAD.


Обратите внимание, что если repo_a и repo_b являются одним и тем же репозиторием, может возникнуть смысл разместить оба из них в одном репозитории, либо используя "git remote add -f ..." для создания псевдонимов для репозитория для повторных обновлений, либо obe off "git fetch ..."; как описано в других ответах.

Ответ 7

Я использую PyCharm, который обладает большими возможностями для сравнения между папками и файлами.

Просто откройте родительскую папку для обоих репозиториев и подождите, пока она не индексирует. Затем вы можете щелкнуть правой кнопкой мыши по папке или файлу и Compare to... и выбрать соответствующую папку/файл на другой стороне.

В нем отображаются не только файлы, но и их содержимое. Гораздо проще, чем командная строка.

Ответ 8

Лучше всего иметь оба репозитория на локальном компьютере и использовать команду linux diff с двумя каталогами в качестве параметров:

diff -r repo-A repo-B

Ответ 9

Простой способ сделать это, не касаясь конфигурации вашего пульта. Из репо А в мастер (предположим, вы хотите сравнить основные ветки):

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