Git 2.55 — history fixup, fsmonitor на Linux, push в группу
Технический обзор · 7 июля 2026

Git 2.55:
History Fixup, FSMonitor для Linux, Push в группу

Git 2.55 вышел с изменениями от более чем 100 контрибьюторов — 33 из них новые. В релизе: встроенный fsmonitor для Linux, новая команда git history fixup, push в группу удалённых репозиториев, Rust по умолчанию в системе сборки и ускорение частичных клонов. Разберём каждое улучшение.

Олег Максимов 7 июля 2026 14 мин чтения

Введение

Git 2.55 был выпущен 29 июня 2026 года — это результат работы более чем 100 контрибьюторов. Релиз включает несколько давно ожидаемых улучшений: встроенный демон файловой системы для Linux, который делает git status значительно быстрее на больших репозиториях, новую подкоманду git history fixup для внесения изменений в существующие коммиты и возможность пушить в группу удалённых репозиториев одной командой.

Кроме заглавных функций, Git 2.55 знаменует важный этап в эволюции проекта — Rust теперь включён по умолчанию в системе сборки, инкрементальные многопакетные индексы появились в git repack, а производительность частичных клонов получила заметный прирост благодаря пакетной загрузке blob-объектов для git-grep и git-cherry.

В этой статье рассмотрим каждую значимую возможность релиза с практическими примерами и рекомендациями.

git history fixup — Внесение изменений в ранние коммиты

Каждый, кто правил серию коммитов перед отправкой на ревью, знает эту ситуацию: вы сделали изменение в рабочей директории, которое должно быть в более раннем коммите, а не на вершине ветки. До Git 2.55 стандартный подход был таким:

git commit --fixup=<commit>
git rebase -i --autosquash <commit>^

Это работает, но описывает механизм, а не намерение. Git 2.55 добавляет подкоманду fixup к экспериментальной команде git-history(1), впервые появившейся в Git 2.54:

git history fixup <commit>

Эта команда берёт проиндексированные (staged) изменения, вносит их в указанный коммит и переигрывает все потомки поверх. Важное преимущество: git history fixup автоматически обновляет все локальные ветки, содержащие изменяемый коммит. При работе со stacked branches исправление коммита в стеке автоматически перебазирует все связанные ветки.

Пример использования

У вас три коммита: рецепт блинов, начинка и инструкция по приготовлению. Вы понимаете, что в рецепте не хватает кленового сиропа. Индексируете изменение (git add recipe.md), затем запускаете git history fixup HEAD~2. Git добавляет сироп в первый коммит и переигрывает начинку с инструкцией поверх. Любая другая ветка, содержащая тот же коммит, также обновляется автоматически.

Функция реализована Патриком Штайнхардтом (Patrick Steinhardt) — значительное улучшение для всех, кто регулярно правит историю коммитов перед ревью.

fsmonitor для Linux — Быстрый git status

Настройка core.fsmonitor существует с Git 2.16 (январь 2018), но требовала стороннего инструмента вроде Facebook Watchman. В апреле 2022 Git получил встроенный демон для замены внешнего инструмента — но только для Windows и macOS. Пользователи Linux остались без поддержки.

Git 2.55 закрывает этот пробел. Встроенный fsmonitor теперь работает на Linux через inotify(7), который отслеживает события файловой системы без повышенных привилегий. Включение:

git config core.fsmonitor true

После включения демон работает в фоне и отслеживает изменения файлов. При вызове git status Git возвращает кешированный результат вместо обхода всего рабочего дерева. На больших репозиториях — особенно монорепозиториях с десятками тысяч файлов — ускорение колоссально.

Ограничение: лимит inotify

Демон устанавливает одну inotify-слежку на директорию репозитория. В больших репозиториях можно достичь системного лимита (fs.inotify.max_user_watches, по умолчанию 8192). Увеличьте его временно: sudo sysctl fs.inotify.max_user_watches=65536. Для постоянного изменения добавьте строку в /etc/sysctl.conf.

Функция разработана Полом Тарьяном (Paul Tarjan) на основе работы Эрика ДеКосты (Eric DeCosta) и Марзии Эсипре (Marziyeh Esipreh).

Push в группу удалённых репозиториев

git fetch давно умеет работать с группами удалённых репозиториев — вы можете забрать данные из нескольких источников одной командой. А вот git push такой возможности не имел. Git 2.55 исправляет эту асимметрию.

# Настройка группы
git config set remotes.forks "origin upstream"

# Push во все репозитории группы
git push forks main

Каждый remote в группе обрабатывается независимо, с уважением к его настройкам remote.<имя>.push и mirror. Особенно полезно для мейнтейнеров, публикующих одну ветку на нескольких хостингах — основной хост плюс зеркала на GitLab, SourceHut или собственном сервере.

Реализовано Усманом Акиньеми (Usman Akinyemi) по предложению мейнтейнера Git Джунио Хамано (Junio C Hamano).

Ограничение ширины git log --graph

Любой, кто работает в репозитории с множеством активных веток, видел, как git log --graph становится непрактично широким. В самом git.git граф достигает девяти линий уже через 30 коммитов. Каждая линия тянется вниз к коммиту, где была создана ветка, выталкивая сообщения коммитов за правый край терминала.

Git 2.55 добавляет опцию --graph-lane-limit=<n>:

git log --graph --graph-lane-limit=5 --oneline

Линии за пределами лимита заменяются символом ~, так что визуально понятно, что граф был обрезан. По умолчанию 0 (без лимита). Нулевые и отрицательные значения отключают ограничение.

Функция реализована Пабло Сабатером (Pablo Sabater).

Инкрементальные MIDX в git repack

Большие репозитории со временем накапливают pack-файлы. Многопакетный индекс (MIDX) обеспечивает единый индекс по всем pack-файлам, но перезапись всего MIDX при каждом обслуживании обходится дорого.

Git 2.55 вводит инкрементальные MIDX-цепочки. Новая опция --write-midx=incremental в git repack записывает новый слой MIDX для pack-файлов, созданных при repack, не затрагивая существующие слои:

# Append-only: новый слой без изменения старых
git repack --write-midx=incremental

# В сочетании с геометрическим repack для авто-компактификации
git repack --write-midx=incremental --geometric=2 -d

При использовании с геометрическим repack Git решает, нужно ли компактифицировать соседние слои MIDX. Поведение настраивается двумя параметрами конфигурации: repack.midxSplitFactor (коэффициент компактификации) и repack.midxNewLayerThreshold (минимальное количество pack-файлов в последнем слое для включения в геометрическую выборку).

Результат — компромисс между двумя крайностями. Однофайловый MIDX минимально усложняет поиск, но требует больших перезаписей. Чисто append-only цепочка минимизирует каждую запись, но растёт без ограничений. Геометрическая инкрементальная компактификация держит количество слоёв логарифмическим относительно общего числа объектов.

Rust включён по умолчанию в системе сборки

Git 2.55 отмечает поворотный момент в эволюции кодовой базы проекта. Rust-код впервые появился в Git 2.49 (март 2025) как экспериментальные привязки. Git 2.52 (ноябрь 2025) принёс первый промышленный Rust-код — реализацию подсистемы varint — как опциональную замену C. Git 2.54 добавил тип ObjectID на Rust для поддержки SHA-1/SHA-256.

В Git 2.55 компилятор Rust требуется по умолчанию при сборке из исходников. Системы сборки Make и Meson теперь завершаются ошибкой, если Rust не найден, если его не отключить явно:

# Meson
meson configure -Drust=disabled

# Make
make NO_RUST=YesPlease

Это изменение затрагивает только тех, кто собирает Git из исходного кода. Если вы устанавливаете Git через менеджер пакетов вашего дистрибутива (apt, dnf, brew), вы не затронуты — мейнтейнеры дистрибутива занимаются настройкой сборки. Требование Rust — это инфраструктурный шаг, открывающий путь к будущим улучшениям производительности и безопасности внутренних компонентов Git.

Ускорение git-grep и git-cherry в частичных клонах

Частичные клоны с --filter=blob:none могут кардинально ускорить начальное клонирование больших репозиториев, но у них есть цена: командам, которым нужны содержимое файлов — например, git grep — приходится загружать blob'ы по требованию. Раньше каждый blob загружался отдельно, создавая множество раундов переговоров с сервером.

Git 2.55 объединяет загрузку blob'ов в один раунд переговоров с сервером. Оптимизация применяется к git-grep(1) и git-cherry(1):

# До 2.55: каждый blob отдельно — много раундов
git grep TODO HEAD~100

# После 2.55: blob'ы загружаются пакетом

Для разработчиков, работающих с частичными клонами больших монорепозиториев — распространённый паттерн в CI/CD и на машинах с ограниченными ресурсами — это изменение может сократить время поиска с минут до секунд. Пакетная загрузка работает автоматически, без дополнительной настройки.

Реализовано Илайджей Ньюреном (Elijah Newren).

Управление коммитами для переговоров при fetch

Во время fetch клиент и сервер ведут переговоры: клиент сообщает коммиты, которые у него уже есть (строки have), чтобы сервер не отправлял лишние объекты. В репозиториях с множеством ссылок алгоритм переговоров может пропустить важную ссылку для поиска общей истории.

Git 2.55 добавляет новые опции --negotiation-commit=include и --negotiation-commit=restrict, а также соответствующую конфигурацию remote.*.negotiationCommit. Это позволяет требовать отправки определённых ссылок как have или ограничивать переговоры конкретным набором ссылок — сокращая время fetch в репозиториях со сложными пространствами имён.

Сводка изменений Git 2.55

Основные нововведения

git history fixup — Однокомандное внесение staged-изменений в ранние коммиты с авто-перебазированием stacked branches
fsmonitor для Linux — Встроенный файловый монитор через inotify для быстрого git status
Push в группу remote — Отправка в несколько удалённых репозиториев одной командой
--graph-lane-limit — Обрезка широких графов символом ~
Инкрементальные MIDX — Геометрические цепочки многопакетных индексов
Rust обязателен при сборке — Компилятор Rust требуется по умолчанию (отключается через NO_RUST)
Пакетная загрузка blob — git-grep и git-cherry загружают blob'ы пакетами в частичных клонах
Опции negotiation-commit — Точный контроль над ссылками в переговорах при fetch

FAQ

Как работает git history fixup в Git 2.55?
git history fixup <commit> берёт проиндексированные (staged) изменения и вносит их в указанный коммит, после чего переигрывает все последующие коммиты поверх изменённого. В отличие от fixup+autosquash, это одна команда, которая автоматически обновляет все локальные ветки, содержащие изменяемый коммит — важно для stacked branches. Реализовано Патриком Штайнхардтом.
Появилась ли поддержка fsmonitor на Linux в Git 2.55?
Да. Git 2.55 добавляет встроенный fsmonitor для Linux через inotify(7). Включите core.fsmonitor=true, и git status на больших репозиториях станет значительно быстрее. Демон ставит одну inotify-слежку на директорию — на крупных репозиториях может потребоваться увеличить fs.inotify.max_user_watches.
Можно ли пушить в несколько удалённых репозиториев одной командой?
Да. Настройте группу: git config set remotes.mygroup "origin mirror", затем git push mygroup main. Каждый remote обрабатывается независимо, с уважением к настройкам remote.<имя>.push и mirror. Реализовано Усманом Акиньеми.
Обязателен ли теперь Rust для сборки Git из исходников?
Да, по умолчанию. При сборке из исходного кода компилятор Rust требуется, если его не отключить явно: meson configure -Drust=disabled (Meson) или make NO_RUST=YesPlease (Make). Пользователи готовых пакетов (apt, dnf, brew) не затронуты.
Как работает --graph-lane-limit в git log?
git log --graph --graph-lane-limit=<n> ограничивает количество отображаемых линий графа. Линии за пределами лимита заменяются ~. По умолчанию 0 (без лимита). Полезно для репозиториев с множеством параллельных веток. Реализовано Пабло Сабатером.
Что такое инкрементальные MIDX в Git 2.55?
git repack --write-midx=incremental создаёт цепочку инкрементальных MIDX-слоёв. В сочетании с --geometric=N новые слои добавляются без перезаписи старых, а соседние компактифицируются. Количество слоёв остаётся логарифмическим относительно числа объектов.
Какие улучшения получили частичные клоны в Git 2.55?
git-grep и git-cherry в частичных клонах теперь загружают blob'ы пакетами за один раунд переговоров с сервером, вместо загрузки каждого blob по отдельности. Это ускоряет операции вроде git grep TODO HEAD~100 на клонах с --filter=blob:none. Реализовано Илайджей Ньюреном.

Обновитесь до Git 2.55

Git 2.55 доступен сейчас. Проверьте менеджер пакетов вашего дистрибутива или скачайте исходники с git-scm.com. Один только fsmonitor для Linux делает этот релиз стоящим обновления для всех, кто работает с большими репозиториями.

Как full-stack разработчик, ежедневно работающий с системами контроля версий, я слежу за каждым релизом Git. Поддержка fsmonitor на Linux и команда history fixup — это два изменения, которых я ждал годами. Если вы планируете веб-проект и ищете опытного партнёра, который разбирается в современных инструментах, свяжитесь со мной. Я провожу бесплатные консультации, чтобы помочь выбрать правильный подход для вашего проекта.

Контакты

Обсудим ваш проект

Расскажите о проекте — я порекомендую лучшие инструменты и архитектуру. Бесплатно.