Что такое difftastic?
difftastic — команда называется difft — это структурный diff. Вместо построчного сравнения он разбирает оба файла с помощью tree-sitter, строит синтаксическое дерево для каждой стороны и показывает, какие именно части синтаксиса изменились. Переформатирование блока, перенос списка аргументов или сдвинутая скобка перестают быть изменением, а переименованная переменная среди переформатированного кода сразу бросается в глаза.
⚡ Ключевые возможности difftastic
🌳 Diff с учётом синтаксиса
Обе стороны разбираются в синтаксические деревья и сравниваются как структура: шум форматирования исчезает, реальные изменения видны.
🧩 Более 30 языков
Rust, Python, TypeScript, Go, C, C++, Java, Ruby, YAML, JSON, HTML, CSS, Markdown и многие другие — difft --list-languages печатает полный список с расширениями.
🪟 Рядом или в одну колонку
--display выбирает side-by-side, side-by-side-show-both, inline или машиночитаемый JSON.
🔗 Прямая замена в Git
Работает как внешняя команда diff для git, а также для Mercurial, Jujutsu и Fossil.
🚦 Честный откат
Неизвестное расширение, огромный файл или слишком много ошибок разбора — вместо отказа будет построчный diff с подсветкой по словам.
🗂️ Каталоги и конфликты
Сравнивайте два каталога одной командой или передайте файл с маркерами конфликта слияния и читайте конфликт как diff.
apt upgrade держит вас на последней версии.
📦 Установка из deb.griffo.io
Шаг 1: Добавить репозиторий
sudo install -d -m 0755 /etc/apt/keyrings
curl -fsSL https://deb.griffo.io/EA0F721D231FDD3A0A17B9AC7808B4DD62C41256.asc | sudo gpg --dearmor --yes -o /etc/apt/keyrings/deb.griffo.io.gpg
echo "deb [signed-by=/etc/apt/keyrings/deb.griffo.io.gpg] https://deb.griffo.io/apt $(lsb_release -sc 2>/dev/null) main" | sudo tee /etc/apt/sources.list.d/deb.griffo.io.list > /dev/null
sudo apt updateinstall -d -m 0755 /etc/apt/keyrings
curl -fsSL https://deb.griffo.io/EA0F721D231FDD3A0A17B9AC7808B4DD62C41256.asc | gpg --dearmor --yes -o /etc/apt/keyrings/deb.griffo.io.gpg
echo "deb [signed-by=/etc/apt/keyrings/deb.griffo.io.gpg] https://deb.griffo.io/apt $(lsb_release -sc 2>/dev/null) main" | tee /etc/apt/sources.list.d/deb.griffo.io.list > /dev/null
apt update🆓 Есть вечно бесплатное зеркало. deb-free.griffo.io раздаёт пакеты бесплатно навсегда — без аккаунта, без подписки, не более 2 месяцев позади upstream, исправления безопасности сразу. Сейчас там cliamp, Ghostty, lazydocker, Oh My Posh и Zed; difftastic среди них нет, поэтому репозиторий выше — единственный способ установить его сегодня; попросите, и его можно добавить.
Шаг 2: Установить difftastic
# Установить последнюю версию difftastic
sudo apt install difftastic
# Проверить установку
difft --version# Установить последнюю версию difftastic
apt install difftastic
# Проверить установку
difft --versionШаг 3: Подключить к git
# Сравнить два файла напрямую
difft old.py new.py
# Или пусть git вызывает difftastic для каждого diff
git config --global diff.external difft
# Обычный git diff по-прежнему в одном флаге
git --no-ext-diff diff
# Man-страница входит в пакет
man difft🎯 Базовые примеры использования
Сравнение файлов и каталогов:
# Два файла, рядом
difft before.rs after.rs
# Одна колонка, ближе к традиционному diff
difft --display inline before.ts after.ts
# Два каталога, пропуская неизменившиеся файлы
difft old/ new/ --skip-unchanged --sort-paths
# Какие языки понимает эта сборка?
difft --list-languagesВ роли git diff:
# Разово: difftastic только для этого diff
GIT_EXTERNAL_DIFF=difft git diff
# Структурные diff по всей истории
GIT_EXTERNAL_DIFF=difft git log -p --ext-diff
# Зарегистрировать как difftool
git config --global difftool.difftastic.cmd 'difft "$LOCAL" "$REMOTE"'
git difftool --tool difftastic
# Псевдоним git для структурного лога
git config --global alias.dlog '!GIT_EXTERNAL_DIFF=difft git log -p --ext-diff'Настройка вывода:
# Игнорировать изменения только в комментариях
difft --ignore-comments a.go b.go
# Больше контекста и табуляция в два пробела
difft --context 5 --tab-width 2 a.py b.py
# Для скриптов: было ли синтаксическое изменение?
difft --check-only --exit-code a.json b.json
# Значения по умолчанию для каждого запуска — из окружения
export DFT_DISPLAY=inline DFT_BACKGROUND=light🔧 Интеграция с другими инструментами
difftastic встраивается в инструменты, которые и так показывают вам diff:
- git:
GIT_EXTERNAL_DIFF,diff.externalили записьdifftool— с--ext-diffэто работает и дляgit log -p, и дляgit show - Jujutsu: задайте его командой diff в
jjи получите структурные diff в Git-совместимом процессе - Mercurial и Fossil: оба принимают внешнюю команду diff, так что один бинарник обслуживает все ваши репозитории
- Переменные окружения:
DFT_DISPLAY,DFT_BACKGROUND,DFT_WIDTHи прочие задают ваши значения по умолчанию - CI и скрипты:
--check-onlyс--exit-codeотвечает «изменился ли синтаксис?» без вывода diff, а--display jsonсделан для разбора
🚀 Почему стоит выбрать deb.griffo.io?
- Официальный Ubuntu: вообще не содержит difftastic — на стандартной системе устанавливать нечего
- cargo install difftastic: свежая версия, но это долгая сборка с множеством грамматик tree-sitter, вне apt и без man-страницы
- Архив upstream: официальный бинарник, который придётся скачивать вручную к каждому выпуску
- deb.griffo.io: последняя версия с автоматическими обновлениями
- ✅ Актуальные грамматики: самый свежий выпуск с грамматиками tree-sitter, которые понимают версии языков, на которых вы пишете сейчас
- ✅ Единственный источник apt: difftastic нет ни в архивах Debian, ни в архивах Ubuntu; этот репозиторий пакует официальную сборку upstream
- ✅ Автоматические обновления: пакеты обновляются в течение нескольких часов после релиза upstream
- ✅ Полный пакет: бинарник upstream как
/usr/bin/difftплюс man-страницаdifft.1 - ✅ Две архитектуры: amd64 (статическая сборка musl без зависимостей) и arm64
- ✅ Много дистрибутивов: работает на Ubuntu 22.04, 24.04, 25.10 и 26.04
- ✅ Простое обслуживание: обновления обычными командами apt
📦 Репозиторий сборки пакета
Пакеты для Ubuntu собираются и поддерживаются автоматически в этом репозитории GitHub:
- 🔀 difftastic-debian - Сборки последних выпусков
🔗 Похожие пакеты
Также доступны в deb.griffo.io:
- lazygit - Терминальный интерфейс git для индексации ханков и строк
- Jujutsu - Git-совместимая СКВ с удобным rebase
- ripgrep - Быстрый рекурсивный поиск по тому же дереву
- Neovim - Редактор, чтобы открыть то, на что указал diff