НейроАгент

Как увидеть изменённые файлы между ветками Git

Изучите эффективные способы сравнения веток Git и определения изменённых файлов. Полное руководство с командами git diff, практическими примерами и лучшими практиками подготовки к слиянию.

Вопрос

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

Я хочу объединить две ветки, которые были разделены некоторое время, и мне нужно определить, какие файлы были изменены. Я пробовал следующие команды Git для сравнения веток:

  • git diff master..branch
  • git log master..branch
  • git shortlog master..branch

Существует ли команда, похожая на git status master..branch, которая бы показывала только файлы, отличающиеся между двумя ветками?

В настоящее время я использую:

git diff master..branch | grep "^diff"

Но это показывает повторяющиеся записи, если файл изменялся несколько раз. Существует ли более эффективный способ выполнить эту задачу?

НейроАгент

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

Самая простая команда для получения уникального списка измененных файлов:

bash
git diff --name-only master..branch

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


Содержание

Базовые команды сравнения файлов

git diff --name-only

Наиболее прямое решение вашей проблемы:

bash
git diff --name-only master..branch

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

git diff --name-status

Для получения более подробной информации о типе изменений:

bash
git diff --name-status master..branch

Это показывает:

  • M - Измененные файлы
  • A - Добавленные файлы
  • D - Удаленные файлы
  • R - Переименованные файлы
  • C - Скопированные файлы

Синтаксис с двумя и тремя точками

  • git diff master..branch - Показывает изменения в branch с момента разделения с master
  • git diff master...branch - Показывает изменения, уникальные для branch, а также изменения в master, которых нет в branch
bash
git diff --name-only master...branch

Получение уникальных списков измененных файлов

Простой уникальный список

Если вы видите дублирующиеся записи (когда файл изменялся несколько раз), используйте sort -u:

bash
git diff --name-only master..branch | sort -u

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

bash
# Использование 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

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

Чтобы получить только измененные файлы:

bash
git diff --name-status master..branch | grep '^M' | cut -f2

Чтобы получить только добавленные файлы:

bash
git diff --name-status master..branch | grep '^A' | cut -f2

Расширенные параметры сравнения

Количество измененных файлов

Получить только количество измененных файлов:

bash
git diff --name-only master..branch | wc -l

Файлы, которые действительно существуют

Иногда вы можете получить ссылки на удаленные файлы. Чтобы увидеть только файлы, которые существуют в настоящее время:

bash
git diff --name-only master..branch | xargs ls -1 2>/dev/null

Фильтрация по регулярному выражению

Фильтрация файлов по расширению или шаблону:

bash
# Только .js файлы
git diff --name-only master..branch | grep '\.js$'

# Только файлы в директории src
git diff --name-only master..branch | grep '^src/'

Использование Git Log

Вы также можете использовать git log с фильтрацией по имени файла:

bash
git log --name-only master..branch | grep -v '^$' | sort -u

Визуализация изменений

Статистика в сводке

Получить сводку изменений:

bash
git diff --stat master..branch

Граф в ASCII

Визуальное представление изменений:

bash
git log --oneline --graph --name-only master..branch

Практические примеры

Пример 1: Базовое сравнение

bash
# Список всех измененных файлов между master и feature-branch
git diff --name-only master..feature-branch

Пример 2: Уникальные измененные файлы

bash
# Получить уникальный список измененных файлов (без дубликатов)
git diff --name-only master..feature-branch | sort -u

Пример 3: Подготовка к слиянию

bash
# Список всех измененных файлов, проверка哪些需要 просмотреть
git diff --name-status master..feature-branch

# Получить только файлы, которые были изменены (не добавлены или удалены)
git diff --name-only master..feature-branch | xargs ls -1 2>/dev/null

Пример 4: Создание скрипта

bash
#!/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) файлов"

Лучшие практики

  1. Используйте --name-only - Это наиболее эффективный способ получить только имена файлов
  2. Сортируйте и удаляйте дубликаты - Используйте | sort -u для устранения дубликатов из нескольких коммитов
  3. Проверяйте существование файлов - Используйте | xargs ls -1 2>/dev/null для просмотра только существующих файлов
  4. Фильтруйте по статусу - Используйте --name-status для понимания типа изменений
  5. Используйте синтаксис с тремя точками когда это уместно - git diff master...branch показывает изменения, уникальные для каждой ветки

Наиболее эффективное решение для вашего текущего подхода:

bash
git diff --name-only master..branch | sort -u

Это дает вам чистый, уникальный список измененных файлов без накладных расходов на парсинг вывода diff с помощью grep.


Источники

  1. Официальная документация Git - git diff
  2. Учебник Git от Atlassian - Сравнение веток
  3. Книга Git Pro - Просмотр истории
  4. 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, чтобы понять, какие файлы изменились и как они изменились, а затем использовать показанные выше методы фильтрации для фокусировки на конкретной информации, которая вам нужна.