Как увидеть, какие файлы изменились между двумя ветками Git?
Я хочу объединить две ветки, которые были разделены некоторое время, и мне нужно определить, какие файлы были изменены. Я пробовал следующие команды Git для сравнения веток:
git diff master..branchgit log master..branchgit shortlog master..branch
Существует ли команда, похожая на git status master..branch, которая бы показывала только файлы, отличающиеся между двумя ветками?
В настоящее время я использую:
git diff master..branch | grep "^diff"
Но это показывает повторяющиеся записи, если файл изменялся несколько раз. Существует ли более эффективный способ выполнить эту задачу?
Вы можете увидеть, какие файлы изменились между двумя ветками Git, с помощью нескольких эффективных команд. Прямой подход - использовать git diff с флагом --name-only, который показывает только имена измененных файлов.
Самая простая команда для получения уникального списка измененных файлов:
git diff --name-only master..branch
Это отобразит только имена файлов, которые отличаются между ветками, без какого-либо содержимого diff.
Содержание
- Базовые команды сравнения файлов
- Получение уникальных списков измененных файлов
- Расширенные параметры сравнения
- Визуализация изменений
- Практические примеры
- Лучшие практики
Базовые команды сравнения файлов
git diff --name-only
Наиболее прямое решение вашей проблемы:
git diff --name-only master..branch
Эта команда выводит только имена файлов, которые были изменены, добавлены или удалены между двумя ветками.
git diff --name-status
Для получения более подробной информации о типе изменений:
git diff --name-status master..branch
Это показывает:
M- Измененные файлыA- Добавленные файлыD- Удаленные файлыR- Переименованные файлыC- Скопированные файлы
Синтаксис с двумя и тремя точками
git diff master..branch- Показывает изменения вbranchс момента разделения сmastergit diff master...branch- Показывает изменения, уникальные дляbranch, а также изменения вmaster, которых нет вbranch
git diff --name-only master...branch
Получение уникальных списков измененных файлов
Простой уникальный список
Если вы видите дублирующиеся записи (когда файл изменялся несколько раз), используйте sort -u:
git diff --name-only master..branch | sort -u
Альтернативные методы получения уникальных записей
# Использование awk для удаления дубликатов
git diff --name-only master..branch | awk '!x[$0]++'
# Использование sort с флагом уникальности
git diff --name-only master..branch | sort -u
# Использование команды uniq (после сортировки)
git diff --name-only master..branch | sort | uniq
Фильтрация по статусу файла
Чтобы получить только измененные файлы:
git diff --name-status master..branch | grep '^M' | cut -f2
Чтобы получить только добавленные файлы:
git diff --name-status master..branch | grep '^A' | cut -f2
Расширенные параметры сравнения
Количество измененных файлов
Получить только количество измененных файлов:
git diff --name-only master..branch | wc -l
Файлы, которые действительно существуют
Иногда вы можете получить ссылки на удаленные файлы. Чтобы увидеть только файлы, которые существуют в настоящее время:
git diff --name-only master..branch | xargs ls -1 2>/dev/null
Фильтрация по регулярному выражению
Фильтрация файлов по расширению или шаблону:
# Только .js файлы
git diff --name-only master..branch | grep '\.js$'
# Только файлы в директории src
git diff --name-only master..branch | grep '^src/'
Использование Git Log
Вы также можете использовать git log с фильтрацией по имени файла:
git log --name-only master..branch | grep -v '^$' | sort -u
Визуализация изменений
Статистика в сводке
Получить сводку изменений:
git diff --stat master..branch
Граф в ASCII
Визуальное представление изменений:
git log --oneline --graph --name-only master..branch
Практические примеры
Пример 1: Базовое сравнение
# Список всех измененных файлов между master и feature-branch
git diff --name-only master..feature-branch
Пример 2: Уникальные измененные файлы
# Получить уникальный список измененных файлов (без дубликатов)
git diff --name-only master..feature-branch | sort -u
Пример 3: Подготовка к слиянию
# Список всех измененных файлов, проверка哪些需要 просмотреть
git diff --name-status master..feature-branch
# Получить только файлы, которые были изменены (не добавлены или удалены)
git diff --name-only master..feature-branch | xargs ls -1 2>/dev/null
Пример 4: Создание скрипта
#!/bin/bash
BRANCH1=$1
BRANCH2=$2
echo "Файлы, измененные между $BRANCH1 и $BRANCH2:"
git diff --name-only $BRANCH1..$BRANCH2 | sort -u
echo -e "\nВсего: $(git diff --name-only $BRANCH1..$BRANCH2 | wc -l) файлов"
Лучшие практики
- Используйте
--name-only- Это наиболее эффективный способ получить только имена файлов - Сортируйте и удаляйте дубликаты - Используйте
| sort -uдля устранения дубликатов из нескольких коммитов - Проверяйте существование файлов - Используйте
| xargs ls -1 2>/dev/nullдля просмотра только существующих файлов - Фильтруйте по статусу - Используйте
--name-statusдля понимания типа изменений - Используйте синтаксис с тремя точками когда это уместно -
git diff master...branchпоказывает изменения, уникальные для каждой ветки
Наиболее эффективное решение для вашего текущего подхода:
git diff --name-only master..branch | sort -u
Это дает вам чистый, уникальный список измененных файлов без накладных расходов на парсинг вывода diff с помощью grep.
Источники
- Официальная документация Git - git diff
- Учебник Git от Atlassian - Сравнение веток
- Книга Git Pro - Просмотр истории
- Stack Overflow - Получить уникальный список измененных файлов между ветками
Заключение
Чтобы кратко изложить наиболее эффективные способы просмотра измененных файлов между двумя ветками Git:
- Простое решение:
git diff --name-only master..branchдля быстрого списка измененных файлов - Для уникальных результатов:
git diff --name-only master..branch | sort -uдля устранения дубликатов - Для подробного статуса:
git diff --name-status master..branchдля просмотра типов изменений - Только для существующих файлов: Объедините с
xargs ls -1 2>/dev/nullдля фильтрации удаленных файлов
Ваш текущий подход с использованием git diff master..branch | grep "^diff" работает, но менее эффективен по сравнению со встроенным флагом --name-only. Команда git diff специально разработана для этого случая использования и будет работать лучше, будучи более читаемой.
Для подготовки к слиянию я рекомендую начать с git diff --name-status master..branch, чтобы понять, какие файлы изменились и как они изменились, а затем использовать показанные выше методы фильтрации для фокусировки на конкретной информации, которая вам нужна.