- Андрей Куманяев/
- Git: руководства и команды/
- Сравнение коммитов в GitLab: compare commits и просмотр diff/
Сравнение коммитов в GitLab: compare commits и просмотр diff
Сравнение коммитов в GitLab — это одна из самых полезных операций при разработке. Нужно проверить, какие изменения попали в новый релиз? Сравнить две ветки перед слиянием? Увидеть, что изменилось в конкретном файле? Для всего этого существуют несколько способов, и сегодня мы разберемся в каждом.
Три основных способа сравнить коммиты #
Прежде всего, давайте определимся, где искать нужный инструмент:
GitLab UI (Repository → Compare) — самый удобный способ, если вы работаете через браузер. Визуально видны все изменения, можно просматривать файлы прямо в интерфейсе.
git diff в командной строке — мощный инструмент для локальной работы. Позволяет видеть точные различия между коммитами, использовать фильтры и форматирование.
git log в командной строке — лучший выбор, если вам нужно посмотреть, какие коммиты присутствуют в одной ветке, но отсутствуют в другой.
Когда что использовать? Если вы просто хотите увидеть, что изменилось между двумя точками истории, выбирайте GitLab UI или git diff. Если нужна история коммитов с авторами и сообщениями, тогда git log. Для сложных аналитических задач комбинируйте несколько инструментов.
GitLab Compare: сравнение через веб-интерфейс #
GitLab предоставляет удобный встроенный инструмент для сравнения коммитов, веток и тегов прямо в браузере.
Как открыть Compare #
- Откройте проект в GitLab
- В левом меню выберите Repository → Compare
- Перед вами откроется форма с двумя полями: Source и Target
┌─────────────────────────────────────────────────┐
│ GitLab Compare Interface │
├─────────────────────────────────────────────────┤
│ Target [main ▼] ← исходная │
│ Source [feature-branch▼] ← что добавили │
│ [Compare] │
├─────────────────────────────────────────────────┤
│ Changes: 5 files changed, 42 additions(+) │
│ 12 deletions(-) │
├─────────────────────────────────────────────────┤
│ Commit a1b2c3d | Добавлена новая функция │
│ Commit d4e5f6g | Исправлены ошибки │
├─────────────────────────────────────────────────┤
│ Измененные файлы: │
│ app/models/user.rb +15 -3 │
│ app/views/home.html.erb +27 -8 │
└─────────────────────────────────────────────────┘
Что такое Source и Target? #
Это может вызвать путаницу, поэтому разберемся внимательно:
- Target — это исходная точка, “базовая” ветка. Обычно это
mainилиdevelop. - Source — это новая ветка, которую вы хотите добавить в Target.
- Результат сравнения показывает, что изменилось от Target к Source.
Например, если Target = main, а Source = feature-new-auth, то вы увидите все изменения, которые будут добавлены в main, когда вы смёржите feature-new-auth.
Что показывает Compare? #
После нажатия кнопки Compare вы получаете:
- Список коммитов между двумя точками с авторами и сообщениями
- Статистику изменений — сколько файлов изменено, сколько строк добавлено/удалено
- Просмотр файлов — можно кликнуть на каждый файл и увидеть diff прямо в интерфейсе
- Ссылка на сравнение — можно скопировать URL и поделиться с коллегами
Очень удобно при подготовке pull request или перед релизом — сразу видите весь объем работы.
Просмотр изменений в Merge Request #
Merge Request в GitLab имеет специальную вкладку для просмотра diff, которая работает по похожим принципам, но с дополнительными возможностями.
Основной diff #
Когда вы открываете MR, переходите на вкладку Changes. Здесь вы видите все файлы, которые будут затронуты, с inline комментариями и возможностью оставлять замечания прямо в коде.
Changes (8)
├─ Modified: app/models/user.rb
│ - def full_name
│ + def full_name
│ + "#{first_name} #{last_name}"
│ + end
├─ Added: spec/models/user_spec.rb
├─ Deleted: app/helpers/old_helper.rb
└─ Modified: README.md
Скрытие пробелов (whitespace) #
Иногда diff сильно “загрязнен” изменениями в пробелах и отступах. Кликните на кнопку Show whitespace changes (или похожую опцию в интерфейсе), чтобы скрыть эти тривиальные различия и сосредоточиться на реальном коде.
Сравнение разных версий MR #
Если вы обновили MR несколько раз, можете сравнить разные версии (iterations):
- В правом углу вкладки Changes найдите опцию Compare revisions
- Выберите, какие две версии MR сравнить
- Увидите только изменения между этими версиями
Это очень помогает, когда нужно быстро понять, что было изменено после замечаний рецензента.
git diff между коммитами: работа в командной строке #
Если вы предпочитаете командную строку или работаете локально, git diff — ваш верный помощник.
Базовый синтаксис #
Два основных формата, которые нужно запомнить:
# Изменения между двумя коммитами (двухточечный синтаксис)
git diff commit1..commit2
# Изменения от общего предка до commit2 (трехточечный синтаксис)
git diff commit1...commit2
Подождите, в чем разница между .. и ...? Это сбивает с толку даже опытных разработчиков, поэтому объясню отдельно — см. раздел FAQ внизу.
Практические примеры #
Сравнить две ветки:
git diff main..feature-branch
Покажет все изменения, которые есть в feature-branch, но нет в main.
Сравнить с конкретным тегом:
git diff v1.0..v1.1
Идеально подходит для просмотра изменений в новом релизе.
Посмотреть изменения последних 3 коммитов:
git diff HEAD~3..HEAD
HEAD~3 означает “коммит, который на 3 шага раньше текущего”.
Сравнить конкретный файл между двумя ветками:
git diff main..feature -- app/models/user.rb
Флаг -- указывает git, что дальше идут пути к файлам.
Посмотреть изменения в рабочей директории по сравнению с последним коммитом:
git diff
Это покажет то, что вы изменили, но еще не заккомитили.
Полезные опции git diff #
# Компактный вывод со статистикой
git diff --stat main..feature
# С контекстом (по умолчанию 3 строки)
git diff -U5 main..feature
# Игнорировать изменения в пробелах
git diff -w main..feature
# Показать только имена измененных файлов
git diff --name-only main..feature
# Цветной вывод для лучшей читаемости
git diff --color main..feature
git log: просмотр коммитов между точками #
Если вам нужна история коммитов, а не просто diff, используйте git log. Это мощный инструмент для аналитики истории проекта.
Коммиты в одной ветке, но не в другой #
git log main..feature
Покажет все коммиты, которые есть в feature, но отсутствуют в main. Очень полезно перед слиянием — хотите увидеть, что именно вы добавляете.
История с полным текстом изменений (патчи) #
git log -p main..feature
Флаг -p показывает полный diff каждого коммита — как при выполнении git diff, но с исторической последовательностью.
Статистика изменений #
git log --stat main..feature
Покажет для каждого коммита, какие файлы изменены и сколько строк добавлено/удалено. Компактнее, чем -p.
Красивый однострочный вывод #
git log --oneline main..feature
Идеально для быстрого обзора. Увидите автора и первую строку сообщения коммита в одной строке.
Комбинирование опций #
# Однострочная история с графиком веток
git log --oneline --graph main..feature
# История с авторами и датами
git log --oneline --date=short --pretty=format:"%h %s (%an, %ad)" main..feature
GitLab API для сравнения коммитов #
Если вы автоматизируете процессы или пишете скрипты, GitLab предоставляет API endpoint для сравнения:
GET /projects/:id/repository/compare?from=main&to=feature-branch
Вернет JSON с информацией о коммитах, файлах и diffstat. Документация доступна в официальном API GitLab.
Это полезно, если вы строите собственные инструменты или интеграции.
Типичные задачи и их решения #
Задача: Что изменилось в новой версии? #
Тег v1.0 выпущен, теперь готовим v1.1. Нужно понять объем работы.
Решение:
git diff v1.0..v1.1 --stat
Или через GitLab UI: Repository → Compare → Target: v1.0, Source: v1.1.
Задача: Какие коммиты еще не слиты в main? #
Вы работаете в feature-new-api, нужно проверить, что еще не попало в main.
Решение:
git log main..feature-new-api --oneline
Или в GitLab UI создайте Compare между этими ветками.
Задача: Посмотреть историю конкретного файла #
Нужно увидеть, как изменялся config/database.yml между версиями.
Решение:
git log v1.0..v1.1 -- config/database.yml
С полным diff:
git log -p v1.0..v1.1 -- config/database.yml
Задача: Сравнить свой коммит с веткой #
Вы сделали коммит abc123, нужно посмотреть, чем он отличается от main.
Решение:
git diff main..abc123
Или более читаемо:
git diff main abc123
FAQ: Частые вопросы #
Чем отличается git diff a..b от git diff a...b? #
Это самый частый источник путаницы. Вот краткое объяснение:
a..b(двухточечный) — показывает все различия между коммитом a и коммитом b.a...b(трехточечный) — показывает изменения, которые произошли в b с момента, когда a и b имели общего предка (merge base).
Пример:
main
↓
← ← ← C ← ← ← D
/
M (merge base)
\
→ → → E → → → F
↑
feature
git diff main..feature # Показывает: C, D, E, F
git diff main...feature # Показывает: E, F (только уникальные изменения feature)
В большинстве случаев вам нужна трехточечная версия ..., особенно при работе с ветками, которые разошлись.
Как скопировать прямую ссылку на коммит в GitLab? #
Откройте коммит в GitLab, кликните на хеш коммита в заголовке — появится кнопка копирования. Либо просто наведите на хеш в списке коммитов, и появится кнопка для копирования ссылки.
Можно ли сравнить 3 и более коммитов одновременно? #
Git и GitLab работают с парами точек. Если нужно сравнить несколько коммитов, используйте:
# Посмотреть коммиты в диапазоне
git log commit1..commit2
# Или все коммиты, которые затронули файл
git log --all -- path/to/file
Или создайте несколько Compare в GitLab UI — это совсем не сложно.
Как сравнить с конкретным тегом? #
Работает точно так же, как с ветками и хешами:
git diff v1.0..v1.1
git diff v1.0..HEAD
GitLab UI тоже поддерживает теги — просто начните вводить название тега в поле Source или Target.
Почему git показывает другие строки, чем я ожидал? #
Убедитесь, что у вас актуальная локальная копия:
git fetch origin
Это обновит информацию об удаленных ветках. Часто проблема именно в этом.
Заключение #
Сравнение коммитов в GitLab и git — это ежедневный инструмент разработчика. Запомните три основных команды:
- GitLab UI для визуального просмотра через браузер
git diffдля локального сравнения файловgit logдля просмотра истории коммитов
Комбинируя эти инструменты, вы сможете разобраться с любой ситуацией: от простого сравнения веток до анализа всей истории проекта.
Если вы только начинаете работать с git, рекомендуем сначала прочитать про основные команды git и что такое коммит. Для более глубокого погружения в diff смотрите подробное руководство по git diff. И если вы готовитесь к слиянию веток, пригодится статья про git merge.
Удачи в разработке! 🚀