НейроАгент

Git Diff Name Only: Список изменённых файлов между коммитами

Узнайте, как использовать git diff --name-only для вывода только имён файлов, изменённых между двумя Git-коммитами. Идеально для автоматизации, скриптов развертывания и подготовки к обзору кода.

Вопрос

Как вывести только имена файлов, которые изменились между двумя коммитами в Git

У меня есть репозиторий с несколькими коммитами, и мне нужно определить, какие файлы были изменены между двумя конкретными коммитами, идентифицированными их хэшами SHA1 и SHA2. Какую команду Git следует использовать для отображения только имен измененных файлов без какой-либо дополнительной информации?

НейроАгент

Чтобы вывести только имена файлов, измененных между двумя конкретными коммитами в Git, используйте команду git diff --name-only, за которой следуют два хэша коммитов. Например: git diff --name-only SHA1 SHA2 отобразит только пути к файлам без какого-либо содержимого diff, номеров строк или другой метаданных.

Содержание

Базовое использование git diff --name-only

Команда git diff --name-only является основным инструментом для перечисления измененных файлов между коммитами. Ее базовый синтаксис прост:

bash
git diff --name-only <коммит1> <коммит2>

Где:

  • <коммит1> - это первый хэш коммита (SHA1)
  • <коммит2> - это второй хэш коммита (SHA2)

Эта команда выведет только пути к файлам, которые были изменены между этими двумя коммитами, причем каждое имя файла будет отображаться на отдельной строке.

Понимание вывода

Вывод показывает относительные пути к файлам от корня репозитория. Например:

src/main.js
components/Header.jsx
README.md

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

Работа с диапазонами коммитов

Вы также можете использовать имена веток или теги вместо хэшей коммитов:

bash
git diff --name-only main develop
git diff --name-only v1.0.0 v2.0.0

Если вы опустите второй коммит, Git сравнит с рабочей директорией:

bash
git diff --name-only HEAD~5  # Сравнить с коммитом, сделанным 5 коммитов назад

Дополнительные параметры и вариации

Команда git diff --name-only поддерживает несколько полезных параметров, которые могут расширить ее функциональность:

Фильтрация типов файлов

Вы можете объединить git diff --name-only с другими инструментами Git для фильтрации результатов:

bash
# Показать только измененные JavaScript файлы
git diff --name-only SHA1 SHA2 | grep '\.js$'

# Показать только измененные файлы в определенных директориях
git diff --name-only SHA1 SHA2 | grep '^src/'

Использование с другими командами Git

Вывод команды git diff --name-only можно передавать в другие команды:

bash
# Подсчитать количество измененных файлов
git diff --name-only SHA1 SHA2 | wc -l

# Обработать каждый измененный файл
git diff --name-only SHA1 SHA2 | while read file; do
    echo "Обработка: $file"
done

Дополнительные полезные флаги

bash
# Показать только файлы, существовавшие в обоих коммитах (без переименований)
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)

Практические примеры и варианты использования

Скрипты сборки и развертывания

bash
# Создать пакет развертывания только с измененными файлами
git diff --name-only v1.0.0 HEAD | tar -czf deployment.tar.gz -T -

Подготовка к код-ревью

bash
# Перечислить измененные файлы для ревью
echo "Файлы, измененные с последнего релиза:"
git diff --name-only v1.0.0 HEAD

# Или с сравнением веток
echo "Файлы, измененные в feature-branch:"
git diff --name-only main feature-branch

Интеграция в CI/CD конвейеры

bash
# В 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

Обновление документации

bash
# Проверить, был ли изменен README.md в последних 5 коммитах
if git diff --name-only HEAD~5 HEAD | grep -q README.md; then
    echo "README.md был изменен - обновление документации"
fi

Альтернативные команды для выполнения похожих задач

git diff --name-status

Эта команда показывает статус измененных файлов (добавлен, изменен, удален) вместе с именами файлов:

bash
git diff --name-status SHA1 SHA2

Пример вывода:

M   src/main.js
A   new-feature.js
D   old-feature.js

git show --name-only

Чтобы увидеть файлы, измененные в одном коммите:

bash
git show --name-only SHA1

git log --name-only

Чтобы увидеть файлы, измененные в нескольких коммитах в диапазоне:

bash
git log --name-only SHA1..SHA2 --oneline

git diff-tree --no-commit-id --name-only -r

Альтернативный подход с использованием git diff-tree:

bash
git diff-tree --no-commit-id --name-only -r SHA1 SHA2

Это может быть полезно в скриптах, где вам нужны только имена файлов без дополнительного форматирования.


Распространенные проблемы и устранение неполадок

Коммиты в обратном порядке

Если вы получаете неожиданные результаты, порядок коммитов имеет значение:

bash
# Неправильный порядок (может показать пустые результаты)
git diff --name-only недавний-коммит старый-коммит

# Правильный порядок
git diff --name-only старый-коммит недавний-коммит

Работа с merge-коммитами

Для merge-коммитов может потребоваться указать родительский коммит:

bash
git diff --name-only SHA1^ SHA2

Работа с большими репозиториями

В очень больших репозиториях команда может выполняться медленно. Можно оптимизировать, используя:

bash
# Использовать сокращенные хэши коммитов
git diff --name-only $(git rev-parse --short SHA1) $(git rev-parse --short SHA2)

Бинарные файлы

git diff --name-only также работает с бинарными файлами, показывая их как измененные без попытки отображения различий в содержимом.

Неиндексированные изменения

Если вы хотите увидеть файлы, измененные в вашей рабочей директории по сравнению с коммитом:

bash
git diff --name-only SHA1

Это покажет все файлы, которые вы изменили с того коммита.

Источники

  1. Документация Git - git diff
  2. Книга Pro Git - Просмотр истории коммитов
  3. Git SCM - параметры git diff
  4. Учебник Atlassian Git - Сравнение коммитов
  5. Документация GitHub - Просмотр коммитов

Заключение

Команда git diff --name-only является незаменимым инструментом для эффективного вывода только имен файлов, измененных между двумя коммитами в Git. Ее простой синтаксис и сфокусированный вывод делают ее идеальной для автоматизации, скриптов развертывания и подготовки к код-ревью.

Ключевые выводы:

  • Используйте git diff --name-only SHA1 SHA2 для базового перечисления файлов между коммитами
  • Комбинируйте с grep и другими инструментами для фильтрации и обработки
  • Команда без проблем обрабатывает добавленные, измененные и удаленные файлы
  • Альтернативные команды, такие как git show --name-only, полезны для работы с отдельными коммитами
  • Вывод можно легко интегрировать в скрипты и CI/CD конвейеры

В большинстве случаев git diff --name-only обеспечивает идеальный баланс простоты и функциональности, когда вам нужно быстро определить, какие файлы были изменены между конкретными коммитами в истории вашего Git-репозитория.