Отримання різниці між двома сховищами


184

Як ми можемо отримати різницю між двома сховищами git?

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


Відповіді:


250

У репо_а:

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

3
Що робити, якщо вам потрібно порівняти repo_a / master з конкретним тегом repo_b?
Девід Торрес

2
не працює для мене, це кидання: fatal: неоднозначний аргумент 'remotes / b / master': невідома редакція або шлях не в робочому дереві. Використовуйте '-', щоб відокремити шляхи від редагувань, як-от так: 'git <command> [<revision> ...] - [<file> ...]' Тут є якісь ідеї?
Ендрю Хікін

2
Я отримую те саме, що і @AndrewHeekin. Хтось має рішення?
парламент

4
Мені здається, потрібно уточнити, origin/masterа не голою master. Також це виявляє різницю між головними гілками, то що робити, якщо ви хочете знайти всі гілки, які відрізняються? Наприклад, щоб перевірити стан резервної копії сховища?
davidA

1
Чи можете ви пояснити, що робить кожен рядок? Дякую !
Енріке

34

Meld може порівнювати каталоги:

meld directory1 directory2

Просто використовуйте каталоги двох git repos, і ви отримаєте гарне графічне порівняння:

введіть тут опис зображення

Натиснувши на один із синіх елементів, ви побачите, що змінилося.


1
Meld замерзає, коли порівнювати проекти в моєму VS-рішенні, BeyondCompare - ні.
Саша Бонд

4
в OSX: diff -rq folder1 folder2
Марк

1
Чудове посилання! Дуже проста програма, я зараз використовую це як свою програму diff для OSX.
dmanexe

1
Це абсолютно мило! Дякую, що поділились.
Шихаб-хан

Я не впевнений, чи meld здатний обробляти файли, які ігноруються git - вам слід врахувати це під час його використання
noamgot

11

Спочатку ви можете додати інше репо як віддалене місце до поточного репо:

git remote add other_name PATH_TO_OTHER_REPO

потім вийміть бреч із цього віддаленого пристрою:

git fetch other_name branch_name:branch_name

це створює цю гілку як нову гілку у вашому поточному репо, тоді ви можете відрізняти її з будь-якою з ваших гілок, наприклад, для порівняння поточної гілки з новою гілкою (назва гілки):

git diff branch_name

8

Після того як ви маєте обидві гілки в одному сховищі, ви можете зробити це git diff. А отримати їх в одному сховищі так само просто

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

Чи існує спосіб вибору історії вишень з невеликою зміною: Наприклад, у віддаленому репо-файлі розміщується в одному каталозі, але я хочу застосувати зміни до того ж файлу, але який розміщений в іншому каталозі в локальному репо?
Євген Конков

Якщо ви говорите про невелику зміну, я думаю, що найпростіше було б просто зробити розмноження, а потім повторно застосувати його до іншого файлу за допомогою патча.
Майкл Крелін - хакер

Патч не застосовується через різні імена файлів, незважаючи на те, що вони є одними і тими ж файлами
Євген Конков,

О, я думав лише про різні каталоги, а не імена файлів (каталоги легко обробляються за допомогою параметрів патчу). Що ж, для імен файлів я б просто змінив їх вручну або через сценарій. Однак, я не кажу, що немає кращого рішення, просто те, що я можу придумати, не копаючи ніде.
Майкл Крелін - хакер

що робити, якщо я хочу порівняти всі галузі?
ендоліт

7
git diff master remotes/b

Це неправильно. remotes/bє віддаленим, але не галуззю.

Щоб змусити його працювати, мені довелося зробити:

git diff master remotes/b/master

2
Це дійсно має бути коментарем до відповідної відповіді.
EntangledLoops

6

Див. Http://git.or.cz/gitwiki/GitTips , розділ "Як порівняти два локальні сховища" у "Загальні".

Якщо коротко, ви використовуєте змінну середовища GIT_ALTERNATE_OBJECT_DIRECTORIES для доступу до бази даних об'єктів іншого сховища, а git rev-синтаксичний аналіз з --git-dir/ GIT_DIR для перетворення символічного імені в іншому сховищі до ідентифікатора SHA-1.

Сучасна версія виглядатиме приблизно так (якщо припустити, що ви перебуваєте у "repo_a"):

GIT_ALTERNATE_OBJECT_DIRECTORIES = .. / repo_b / .git / об'єкти \
   git diff $ (git --git-dir = .. / repo_b / .git rev-parse - перевірити ГОЛОВУ)

де ../repo_b/.gitшлях до об’єктної бази даних в repo_b (це було б repo_b.git, якби це було голове сховище). Звичайно, ви можете порівнювати довільні версії, а не лише головні.


Зауважте, що якщо repo_a та repo_b є одним і тим же сховищем, може бути доцільніше розмістити їх обох у одному сховищі, використовуючи " git remote add -f ..." для створення псевдоніму (-ів) для сховища для повторних оновлень, або вимкнути " git fetch ..."; як описано в інших відповідях.


5

Я використовую PyCharm, який має чудові можливості для порівняння між папками та файлами.

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

Він показує не тільки різні файли, але і їх зміст. Набагато простіше, ніж командний рядок.


2

Ваша найкраща ставка - зробити обидві репозиції на локальній машині та використовувати команду linux diff з двома каталогами як параметри:

diff -r repo-A repo-B


2
Єдиний спосіб зробити це корисним - це перейменувати один із каталогів .git. це зводиться до сторінок відмінностей, які не мають значення. Побувши там, зробив це, прийшов сюди, шукаючи кращої відповіді.
hildred

2

Простий спосіб зробити це, не торкаючись віддаленої конфігурації. З репо A, в master (припустимо, ви хочете порівняти основні гілки):

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

0

Можна використовувати таку команду:

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

або поруч можна використовувати:

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

У разі розфарбовування кожного різного файлу, ви можете використовувати:

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

на основі рішення @ andrew-heekin
Джерард

0

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

крок 1. Налаштуйте віддалене вище та вище ^

відрізняється один файл за цією схемою:

git diff localBranch uptreamBranch --спацепт / однофайл

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.