Как вывести только имена файлов, которые изменились между двумя коммитами в Git
У меня есть репозиторий с несколькими коммитами, и мне нужно определить, какие файлы были изменены между двумя конкретными коммитами, идентифицированными их хэшами SHA1 и SHA2. Какую команду Git следует использовать для отображения только имен измененных файлов без какой-либо дополнительной информации?
Чтобы вывести только имена файлов, измененных между двумя конкретными коммитами в Git, используйте команду git diff --name-only, за которой следуют два хэша коммитов. Например: git diff --name-only SHA1 SHA2 отобразит только пути к файлам без какого-либо содержимого diff, номеров строк или другой метаданных.
Содержание
- Базовое использование git diff --name-only
- Дополнительные параметры и вариации
- Практические примеры и варианты использования
- Альтернативные команды для выполнения похожих задач
- Распространенные проблемы и устранение неполадок
Базовое использование git diff --name-only
Команда git diff --name-only является основным инструментом для перечисления измененных файлов между коммитами. Ее базовый синтаксис прост:
git diff --name-only <коммит1> <коммит2>
Где:
<коммит1>- это первый хэш коммита (SHA1)<коммит2>- это второй хэш коммита (SHA2)
Эта команда выведет только пути к файлам, которые были изменены между этими двумя коммитами, причем каждое имя файла будет отображаться на отдельной строке.
Понимание вывода
Вывод показывает относительные пути к файлам от корня репозитория. Например:
src/main.js
components/Header.jsx
README.md
Каждая строка представляет файл, который был добавлен, изменен или удален между двумя коммитами. Команда не показывает фактические изменения в содержимом, только имена файлов.
Работа с диапазонами коммитов
Вы также можете использовать имена веток или теги вместо хэшей коммитов:
git diff --name-only main develop git diff --name-only v1.0.0 v2.0.0
Если вы опустите второй коммит, Git сравнит с рабочей директорией:
git diff --name-only HEAD~5 # Сравнить с коммитом, сделанным 5 коммитов назад
Дополнительные параметры и вариации
Команда git diff --name-only поддерживает несколько полезных параметров, которые могут расширить ее функциональность:
Фильтрация типов файлов
Вы можете объединить git diff --name-only с другими инструментами Git для фильтрации результатов:
# Показать только измененные JavaScript файлы
git diff --name-only SHA1 SHA2 | grep '\.js$'
# Показать только измененные файлы в определенных директориях
git diff --name-only SHA1 SHA2 | grep '^src/'
Использование с другими командами Git
Вывод команды git diff --name-only можно передавать в другие команды:
# Подсчитать количество измененных файлов
git diff --name-only SHA1 SHA2 | wc -l
# Обработать каждый измененный файл
git diff --name-only SHA1 SHA2 | while read file; do
echo "Обработка: $file"
done
Дополнительные полезные флаги
# Показать только файлы, существовавшие в обоих коммитах (без переименований)
git diff --name-only --no-renames SHA1 SHA2
# Показать файлы из обоих коммитов (включая удаленные файлы)
git diff --name-only --diff-filter=ACMRT SHA1 SHA2
Параметр --diff-filter позволяет указать типы изменений для отображения:
- A: Добавлен (Added)
- C: Скопирован (Copied)
- D: Удален (Deleted)
- M: Изменен (Modified)
- R: Переименован (Renamed)
- T: Тип изменен (Type changed)
Практические примеры и варианты использования
Скрипты сборки и развертывания
# Создать пакет развертывания только с измененными файлами
git diff --name-only v1.0.0 HEAD | tar -czf deployment.tar.gz -T -
Подготовка к код-ревью
# Перечислить измененные файлы для ревью
echo "Файлы, измененные с последнего релиза:"
git diff --name-only v1.0.0 HEAD
# Или с сравнением веток
echo "Файлы, измененные в feature-branch:"
git diff --name-only main feature-branch
Интеграция в CI/CD конвейеры
# В CI-скрипте для запуска тестов только для измененных файлов
CHANGED_FILES=$(git diff --name-only origin/main HEAD)
for file in $CHANGED_FILES; do
if [[ $file == *.py ]]; then
echo "Запуск Python тестов для: $file"
python -m pytest "$file"
fi
done
Обновление документации
# Проверить, был ли изменен README.md в последних 5 коммитах
if git diff --name-only HEAD~5 HEAD | grep -q README.md; then
echo "README.md был изменен - обновление документации"
fi
Альтернативные команды для выполнения похожих задач
git diff --name-status
Эта команда показывает статус измененных файлов (добавлен, изменен, удален) вместе с именами файлов:
git diff --name-status SHA1 SHA2
Пример вывода:
M src/main.js
A new-feature.js
D old-feature.js
git show --name-only
Чтобы увидеть файлы, измененные в одном коммите:
git show --name-only SHA1
git log --name-only
Чтобы увидеть файлы, измененные в нескольких коммитах в диапазоне:
git log --name-only SHA1..SHA2 --oneline
git diff-tree --no-commit-id --name-only -r
Альтернативный подход с использованием git diff-tree:
git diff-tree --no-commit-id --name-only -r SHA1 SHA2
Это может быть полезно в скриптах, где вам нужны только имена файлов без дополнительного форматирования.
Распространенные проблемы и устранение неполадок
Коммиты в обратном порядке
Если вы получаете неожиданные результаты, порядок коммитов имеет значение:
# Неправильный порядок (может показать пустые результаты)
git diff --name-only недавний-коммит старый-коммит
# Правильный порядок
git diff --name-only старый-коммит недавний-коммит
Работа с merge-коммитами
Для merge-коммитов может потребоваться указать родительский коммит:
git diff --name-only SHA1^ SHA2
Работа с большими репозиториями
В очень больших репозиториях команда может выполняться медленно. Можно оптимизировать, используя:
# Использовать сокращенные хэши коммитов
git diff --name-only $(git rev-parse --short SHA1) $(git rev-parse --short SHA2)
Бинарные файлы
git diff --name-only также работает с бинарными файлами, показывая их как измененные без попытки отображения различий в содержимом.
Неиндексированные изменения
Если вы хотите увидеть файлы, измененные в вашей рабочей директории по сравнению с коммитом:
git diff --name-only SHA1
Это покажет все файлы, которые вы изменили с того коммита.
Источники
- Документация Git - git diff
- Книга Pro Git - Просмотр истории коммитов
- Git SCM - параметры git diff
- Учебник Atlassian Git - Сравнение коммитов
- Документация GitHub - Просмотр коммитов
Заключение
Команда git diff --name-only является незаменимым инструментом для эффективного вывода только имен файлов, измененных между двумя коммитами в Git. Ее простой синтаксис и сфокусированный вывод делают ее идеальной для автоматизации, скриптов развертывания и подготовки к код-ревью.
Ключевые выводы:
- Используйте
git diff --name-only SHA1 SHA2для базового перечисления файлов между коммитами - Комбинируйте с
grepи другими инструментами для фильтрации и обработки - Команда без проблем обрабатывает добавленные, измененные и удаленные файлы
- Альтернативные команды, такие как
git show --name-only, полезны для работы с отдельными коммитами - Вывод можно легко интегрировать в скрипты и CI/CD конвейеры
В большинстве случаев git diff --name-only обеспечивает идеальный баланс простоты и функциональности, когда вам нужно быстро определить, какие файлы были изменены между конкретными коммитами в истории вашего Git-репозитория.