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

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

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

12 ответов

Решение

В 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

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

meld directory1 directory2

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

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

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

git remote add other_name PATH_TO_OTHER_REPO

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

git fetch other_name branch_name:branch_name

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

git diff branch_name

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

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

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

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

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

Это неверно remotes/b это удаленная, но не ветка.

Чтобы заставить это работать, я должен был сделать:

git diff master remotes/b/master

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

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

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


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

Вы можете использовать следующую команду:

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

или бок о бок вы можете использовать:

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

В случае раскрашивания каждого файла diff вы можете использовать:

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

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

diff -r repo-A repo-B

Чтобы продолжить ответ @iamamac, чтобы получить хорошее резюме после этого:

      git remote add -f b path/to/repo_b.git
git remote update

Я бы использовал diff-tree:

      git diff-tree master remotes/b/master --compact-summary

Напоминание для себя... сначала получить, иначе в репозитории нет локального хэша (я думаю).

Шаг 1. Настройте восходящий пульт и выше ^

сравнение одного файла происходит по этой схеме:

git diff localBranch uptreamBranch --spacepath / singlefile

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

Другие вопросы по тегам