Получение разницы между двумя репозиториями
Как мы можем получить разницу между двумя 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