↓Перейти к содержанию
  1. Git: руководства и команды/

Сравнение коммитов в GitLab: compare commits и просмотр diff

·8 минут·

Сравнение коммитов в GitLab — это одна из самых полезных операций при разработке. Нужно проверить, какие изменения попали в новый релиз? Сравнить две ветки перед слиянием? Увидеть, что изменилось в конкретном файле? Для всего этого существуют несколько способов, и сегодня мы разберемся в каждом.

Три основных способа сравнить коммиты #

Прежде всего, давайте определимся, где искать нужный инструмент:

  1. GitLab UI (Repository → Compare) — самый удобный способ, если вы работаете через браузер. Визуально видны все изменения, можно просматривать файлы прямо в интерфейсе.

  2. git diff в командной строке — мощный инструмент для локальной работы. Позволяет видеть точные различия между коммитами, использовать фильтры и форматирование.

  3. git log в командной строке — лучший выбор, если вам нужно посмотреть, какие коммиты присутствуют в одной ветке, но отсутствуют в другой.

Когда что использовать? Если вы просто хотите увидеть, что изменилось между двумя точками истории, выбирайте GitLab UI или git diff. Если нужна история коммитов с авторами и сообщениями, тогда git log. Для сложных аналитических задач комбинируйте несколько инструментов.

GitLab Compare: сравнение через веб-интерфейс #

GitLab предоставляет удобный встроенный инструмент для сравнения коммитов, веток и тегов прямо в браузере.

Как открыть Compare #

  1. Откройте проект в GitLab
  2. В левом меню выберите Repository → Compare
  3. Перед вами откроется форма с двумя полями: 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):

  1. В правом углу вкладки Changes найдите опцию Compare revisions
  2. Выберите, какие две версии MR сравнить
  3. Увидите только изменения между этими версиями

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

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 — это ежедневный инструмент разработчика. Запомните три основных команды:

  1. GitLab UI для визуального просмотра через браузер
  2. git diff для локального сравнения файлов
  3. git log для просмотра истории коммитов

Комбинируя эти инструменты, вы сможете разобраться с любой ситуацией: от простого сравнения веток до анализа всей истории проекта.

Если вы только начинаете работать с git, рекомендуем сначала прочитать про основные команды git и что такое коммит. Для более глубокого погружения в diff смотрите подробное руководство по git diff. И если вы готовитесь к слиянию веток, пригодится статья про git merge.

Удачи в разработке! 🚀

По теме #