Как мне использовать git diff для определенного каталога?

132

git diffфактически запускает сравнение всего исходного кода. Как мне сделать это в определенном каталоге, чтобы я мог просматривать изменения в файлах под ним?

прийа
источник
2
stackoverflow.com/a/12123669/1815624 git diff master..yourbranch path/to/folder
CrandellWS

Ответы:

126

Укажите путь (в данном случае myfolder) и просто запустите:

git diff myfolder/
Geo
источник
28
Я хотел бы использовать git diff -- myfolderдля минимизации двусмысленности git. Общая нотация для git diff (и многих команд git) заключается в том, что для git diff [commit-ish] -- [path]фиксации по умолчанию используется значение HEAD (где вы сейчас находитесь), а по [path]умолчанию - корневой каталог git, но может быть любым, относящимся к вашему текущему каталогу. Без него --git угадает, что вы имеете в виду, [commit-ish]или [path]. В некоторых случаях это приводит к тому, что git называет обозначение «неоднозначным». Если я правильно помню.
L0LN1NJ4
2
Это ничего не выводит, когда я пробую использовать метод в ответе и метод в комментарии.
Ray
@ray, что означает, что у вас нет различий между рабочим деревом и последним коммитом
валерий васильченко
3
Для @ray и будущих людей, видящих это, вы можете включить ветки, между git diff master..develop myfolder/которыми вы пытаетесь различать, как сказал @CrandellWS в комментарии к исходному вопросу. Статус Git покажет вам изменения, если это то, что вы ищете.
BVBAccelerate
2
@ray убедитесь, что вы находитесь в корневом каталоге. Путь будет относительно вашего текущего каталога.
Nickofthyme
59

Если вы сравниваете разные ветки, вам необходимо --отделить ревизию Git от пути файловой системы. Например, с двумя локальными филиалами masterи bryan-working:

$ git diff master -- AFolderOfCode/ bryan-working -- AFolderOfCode/

Или из локального филиала на удаленный:

$ git diff master -- AFolderOfCode/ origin/master -- AFolderOfCode/
bcattle
источник
29
После перечисления обеих веток требуется только одно предложение, например: git diff branch1 branch2 - path / to / dir
emery
4

Вы должны иметь привычку смотреть документацию на подобные вещи. Это очень полезно и очень быстро улучшит ваши навыки. Вот соответствующий момент, когда вы делаетеgit help diff

   git diff [options] [--no-index] [--] <path> <path>

Эти два <path>s - это то, что вам нужно изменить в рассматриваемые каталоги.

Нуфаль Ибрагим
источник
3

Добавьте Beyond Compare в качестве инструмента сравнения в Git и добавьте псевдоним для diffdir как:

git config --global alias.diffdir = "difftool --dir-diff --tool=bc3 --no-prompt"

Получите gitdiff как:

git diffdir 4bc7ba80edf6  7f566710c7

Ссылка: Сравните целые каталоги с git difftool + Beyond Compare

Барани
источник
1
Знак равенства кажется неправильным для git 2.17.1. Используйте git config --global alias.diffdir = "difftool --dir-diff --tool=bc3 --no-prompt"вместо этого
Марк Шефер
Обратите внимание, что при использовании Beyond Compare для dir diff вам необходимо либо настроить его для следования символическим ссылкам (в представлении сравнения папок -> Правила (значок рефери) -> Обработка -> следовать символическим ссылкам) ИЛИ добавить --no-symlinksпараметр, чтобы команда читалаgit difftool --dir-diff --no-symlinks
Ашутош Джиндал
1

Вы можете не только добавить путь, но и git diff --relativeполучить результат относительно этой папки.

git -C a/folder diff --relative

А с Git 2.28 (третий квартал 2020 г.) команды семейства " diff" научились diff.relativeучитывать переменную конфигурации " ".

См. Коммит c28ded8 (22 мая 2020 г.) Лорана Арно ( spk) .
(Объединено Junio ​​C Hamano - gitster- в коммите e34df9a , 02 июня 2020 г.)

diff: добавить параметр конфигурации relative

Подписано: Лоран Арну.
Подтверждено: oàn Trần Công Danh

diff.relativeЛогический набор опции trueпоказывает изменения только в текущей директории / значении , указанном в pathаргументе relativeопции и шоу имен путей относительно вышеупомянутого каталога.

Учите --no-relativeотменять раньше--relative

Добавьте для документации по параметрам git-format-patch (1) --relativeи--no-relative

Документация в настоящее время включает в себя :

diff.relative:

Если установлено значение ' true', ' git diff' не показывает изменений за пределами каталога и показывает пути относительно текущего каталога.

VonC
источник
0

Если вы хотите исключить подкаталоги, вы можете использовать

git diff <ref1>..<ref2> -- $(git diff <ref1>..<ref2> --name-only | grep -v /)
Сальвиан Рейнальди
источник
0

Чтобы использовать Beyond Compare в качестве инструмента для сравнения каталогов, не забудьте включить следующие символические ссылки:

В представлении сравнения папокПравила (значок рефери):

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

А затем включите переход по символическим ссылкам и обновите настройки сеанса по умолчанию:

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


ИЛИ,

настройте псевдоним так:

git config --global alias.diffdir "difftool --dir-diff --tool=bc3 --no-prompt --no-symlinks"

Обратите внимание, что в любом случае любые изменения, сделанные сбоку (слева или справа), которые относятся к текущему рабочему дереву, сохраняются.

Ашутош Джиндал
источник