Git 2.55 вышел с изменениями от более чем 100 контрибьюторов — 33 из них новые. В релизе: встроенный fsmonitor для Linux, новая команда git history fixup, push в группу удалённых репозиториев, Rust по умолчанию в системе сборки и ускорение частичных клонов. Разберём каждое улучшение.
Git 2.55 был выпущен 29 июня 2026 года — это результат работы более чем 100
контрибьюторов. Релиз включает несколько давно ожидаемых улучшений: встроенный
демон файловой системы для Linux, который делает git status значительно
быстрее на больших репозиториях, новую подкоманду git history fixup
для внесения изменений в существующие коммиты и возможность пушить в группу
удалённых репозиториев одной командой.
Кроме заглавных функций, Git 2.55 знаменует важный этап в эволюции проекта —
Rust теперь включён по умолчанию в системе сборки, инкрементальные многопакетные
индексы появились в git repack, а производительность частичных клонов
получила заметный прирост благодаря пакетной загрузке blob-объектов для
git-grep и git-cherry.
В этой статье рассмотрим каждую значимую возможность релиза с практическими примерами и рекомендациями.
Каждый, кто правил серию коммитов перед отправкой на ревью, знает эту ситуацию: вы сделали изменение в рабочей директории, которое должно быть в более раннем коммите, а не на вершине ветки. До 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) — значительное улучшение для всех, кто регулярно правит историю коммитов перед ревью.
Настройка 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-слежку на директорию репозитория. В больших
репозиториях можно достичь системного лимита (fs.inotify.max_user_watches,
по умолчанию 8192). Увеличьте его временно:
sudo sysctl fs.inotify.max_user_watches=65536. Для
постоянного изменения добавьте строку в /etc/sysctl.conf.
Функция разработана Полом Тарьяном (Paul Tarjan) на основе работы Эрика ДеКосты (Eric DeCosta) и Марзии Эсипре (Marziyeh Esipreh).
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.git граф достигает девяти линий уже через 30 коммитов.
Каждая линия тянется вниз к коммиту, где была создана ветка, выталкивая
сообщения коммитов за правый край терминала.
Git 2.55 добавляет опцию --graph-lane-limit=<n>:
git log --graph --graph-lane-limit=5 --oneline
Линии за пределами лимита заменяются символом ~, так что
визуально понятно, что граф был обрезан. По умолчанию 0
(без лимита). Нулевые и отрицательные значения отключают ограничение.
Функция реализована Пабло Сабатером (Pablo Sabater).
Большие репозитории со временем накапливают 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 цепочка минимизирует каждую запись, но растёт без ограничений. Геометрическая инкрементальная компактификация держит количество слоёв логарифмическим относительно общего числа объектов.
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.
Частичные клоны с --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 клиент и сервер ведут переговоры: клиент сообщает коммиты,
которые у него уже есть (строки have), чтобы сервер не отправлял
лишние объекты. В репозиториях с множеством ссылок алгоритм переговоров может
пропустить важную ссылку для поиска общей истории.
Git 2.55 добавляет новые опции --negotiation-commit=include и
--negotiation-commit=restrict, а также соответствующую
конфигурацию remote.*.negotiationCommit. Это позволяет требовать
отправки определённых ссылок как have или ограничивать переговоры
конкретным набором ссылок — сокращая время fetch в репозиториях со сложными
пространствами имён.
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
Git 2.55 доступен сейчас. Проверьте менеджер пакетов вашего дистрибутива или скачайте исходники с git-scm.com. Один только fsmonitor для Linux делает этот релиз стоящим обновления для всех, кто работает с большими репозиториями.
Как full-stack разработчик, ежедневно работающий с системами контроля версий, я слежу за каждым релизом Git. Поддержка fsmonitor на Linux и команда history fixup — это два изменения, которых я ждал годами. Если вы планируете веб-проект и ищете опытного партнёра, который разбирается в современных инструментах, свяжитесь со мной. Я провожу бесплатные консультации, чтобы помочь выбрать правильный подход для вашего проекта.
Расскажите о проекте — я порекомендую лучшие инструменты и архитектуру. Бесплатно.