Выпущен Git 2.56.0
Git 2.56.0 — крупный релиз с заметными изменениями в повседневных командах, partial clone, работе с refs, объектной базой, reftable, sparse index и сборкой под Windows и macOS. Также в выпуск вошло много исправлений после Git 2.55.
Главное для пользователей
git statusтеперь даёт более полезную подсказку, если локальная ветка отстаёт от push-ветки или разошлась с ней: предлагается команда видаgit pull <remote> <branch>.git addполучил опцию--resolved, которая добавляет в индекс только пути с разрешёнными конфликтами и оставляет остальные локальные изменения нетронутыми. Перед добавлением Git проверяет, что в файлах не остались маркеры конфликтов.git branchполучил опцию--delete-mergedдля удаления локальных веток, уже влитых в их tracked remote-tracking branches.git bisectполучил опцию--reset-when-found[=<where>]: после нахождения проблемного коммита можно автоматически выполнитьgit bisect resetи вернуться в исходное состояние или в указанное место.git replayполучил опцию--linearize, которая отбрасывает merge-коммиты и линеаризует переигрываемую историю, похоже наgit rebase --no-rebase-merges.git imap-sendполучил опцию--draft, чтобы загруженные письма помечались как черновики и корректнее открывались в почтовых клиентах.git rev-listполучил опцию--missing-only, которая показывает только отсутствующие объекты. Это удобно вместе с--missing=printи--missing=print-info.git repackполучил опцию--drop-filteredдля partial clones: она позволяет удалять локальные promisor blobs, превышающие заданный лимит, и освобождать место.
Новые и расширенные команды
- Набор инструментов
git refsрасширен подкомандамиcreate,delete,updateиrenameдля создания, удаления, обновления и переименования refs. - Экспериментальная команда
git historyполучила подкомандуdrop, которая удаляет коммит и переигрывает его потомков поверх родителя. git repo infoнаучился выводить новые ключи с абсолютными и относительными путями дляgitdirиcommondir.- В
git cat-file --batch-commandдобавлена командаremote-object-info: клиент может запросить у удалённого сервера метаданные объекта через protocol v2, пока поддерживается размер объекта. Позже для неё добавили placeholder%(objecttype). git cat-file --batch-all-objectsпереведён на общий интерфейс обхода object database, что упрощает код и позволяет backend-ам эффективнее использовать reachability bitmaps.
Работа с ветками, worktree и историей
git log --followлучше обрабатывает нелинейную историю, где один и тот же путь переименовывался по-разному в разных ветках истории.git log --graphтеперь визуально отделяет root-коммиты и коммиты, которые стали root из-за упрощения истории. Это помогает не принять несвязанные коммиты за связанные.- В
git blameоптимизировано выравнивание сокращённых object names: отдельная колонка под специальные отметки резервируется только тогда, когда они действительно выводятся. git worktree addбольше не пытается угадывать remote-tracking branch, если явно указаны-bили-Bдля создания новой ветки.git checkoutиgit worktree addтеперь сообщают об ошибке, если подходящую remote-tracking branch нельзя определить однозначно.git worktree repairкорректнее переписывает.gitfile рабочего дерева с относительного пути на абсолютный, если команда запущена внутри этого рабочего дерева.git branch -dтеперь сообщает, если ветку нельзя удалить, потому что она используется в активномbisect.git push origin/mainиgit branch origin mainраспознаются как возможные опечатки, и Git предлагает исправление.
Конфигурация и protocol v2
- Добавлена настройка
fetch.followRemoteHEAD, задающая значение по умолчанию дляremote.<name>.followRemoteHEAD. - Условные include-блоки
[includeIf "condition"]теперь умеют учитывать расположение worktree. - Поддержка capability
promisor-remoteобновлена: сервер может добавлять promisor remotes, если это разрешено настройкойpromisor.acceptFromServerURL. - Запрос
promisor-remoteбез значения теперь корректно отклоняется, вместо того чтобы приводить к обращению к null pointer. - Клиентский парсер server-advertised bundle URI теперь дочитывает оставшийся ответ при ошибочно настроенном списке, чтобы не ломать состояние протокола. Серверная сторона больше не отправляет пустые значения конфигурации как некорректные пары key-value.
- Если push remote задан URL-ом, Git теперь использует fetch refspec подходящего настроенного remote, чтобы найти и обновить remote-tracking branch, например для
@{push}.
Индекс, sparse checkout и partial clone
git stash pushлучше работает со sparse index: если pathspec полностью находится внутри sparse-checkout cone, лишнее расширение sparse index не выполняется.- Исправлено потенциальное чтение за пределами массива в проверке необходимости расширения sparse index.
- В
git mvпроверка отсутствующей ведущей директории назначения выполняется на этапе проверки, поэтомуgit mv -nтеперь тоже сообщает об ошибке. Сообщение об ошибкеrename(2)стало понятнее и показывает источник и назначение. - Concurrent downloads packfiles через packfile URIs и dumb HTTP стали безопаснее: Git избегает одновременного append в staging file, а
fetch-packтеперь терпим к уже существующим.keepfiles. - Загрузка packfile URIs в protocol v2 теперь размечена Trace2 region, поэтому можно отслеживать суммарное время загрузки внешних packs и количество advertised URIs.
- Обход object database стал лучше различать отсутствующие и повреждённые объекты, возвращая более точные статусы ошибок.
Производительность
git cat-file --batchна стандартном формате вывода стал быстрее за счёт более прямого формирования строк.git branchиgit tagбыстрее работают в репозиториях с большим количеством unrelated loose refs: iterator теперь сразу получает namespace prefix.git branch --containsиgit for-each-ref --containsиспользуют memoized commit traversal, который раньше применялся только вgit tag --contains. Проверки связности для большого числа refs стали заметно быстрее.- Перечисление untracked и ignored files в
git statusизбавлено от квадратичной сложности при добавлении в string lists. - Сравнение рабочего дерева с коммитом ускорено для pathspec, совпадающих с ранними index entries: Git больше не пересканирует уже распакованные записи index.
- Вычисление merge-base останавливается раньше, когда на одной стороне заканчиваются exclusive commits, что ускоряет запросы с односторонней историей.
- Добавление большого числа новых packfiles стало быстрее: для заведомо новых packfiles появился fast path, который избегает лишнего обхода.
- Reftable быстрее обновляет refs: если добавление уже держит
list_filelock, лишнийstatи reload stack не выполняются. - В reftable оптимизированы чтение и обновление refs при большом количестве deletion tombstones.
pack-objectsтеперь может совместно использовать reachability bitmaps, delta-islands и--path-walk, выбирая более быстрый путь упаковки.pack-objectsначал записывать в Trace2 общий размер данных, записанных в pack files. Это помогает сравнивать настройки сжатия.
Документация и удобство
- Справка
git rev-parse --parseoptи большинства подкоманд Git теперь возвращает код 0 при явном запросе-hили--help, что соответствует обычной Unix-практике. - Usage и SYNOPSIS для
git fast-export,git fast-import,git format-patch,git imap-send,git send-emailиgit request-pullприведены к более единообразному виду. - Документация
git cherry-pickуточняет, что--no-commitнамеренно не устанавливает refCHERRY_PICK_HEAD. - Документация
git interpret-trailersстала понятнее: описан формат ключей trailer, уточнена терминология и поведение comment lines. - Ограничения миграции ref format в
git refs migrateтеперь показаны заметным предупреждением рядом с описанием подкоманды. - В документацию добавлены ссылки на страницу
gitdatamodel. - Completion-скрипты обновлены: bash completion знает про экспериментальную
git history, zsh completion корректнее находит команду Git после глобальных опций вроде-C. - Userdiff patterns для Swift теперь поддерживают Swift-специфичные конструкции: attributes, modifiers, failable initializers и generics.
Внутренние изменения и сборка
- Продолжается избавление от глобального
the_repository: конфигурация, refs, worktree API, pathspec, object database, tempfile и lockfile API постепенно получают явный repository context. - Глобальные настройки вроде
core.ignorecase,core.filemode,protect_hfs,protect_ntfs,editor_program,pager_program,askpass_programиpush_defaultперенесены в per-repository структуры. - Object database продолжает становиться pluggable: loose backend, housekeeping, fsck, packfile generation, stream APIs и transaction interfaces выделены в более самостоятельные слои.
git receive-packпереведён на ODB transaction interfaces для записи входящих объектов и packfiles.- Alternate object directories теперь загружаются при инициализации object database, а не лениво при первом lookup.
- In-memory alternate object sources удалены: submodule object databases теперь доступны через собственные repository structures.
- Sequencer освобождает object database перед запуском
git commit, чтобы открытые file handles не мешали auto-maintenance, особенно на Windows. - Сборка macOS universal binaries с Rust теперь поддерживается через отдельные static archives для target triples из
RUST_TARGETSи объединение черезlipo. - Начиная с Git 2.56.0 сборка Windows переходит с MINGW64 на UCRT64 runtime; CMake-сборка обновлена соответственно.
- При cross-compiling с Cargo система сборки учитывает
CARGO_BUILD_TARGET, чтобы находить артефакт в target-specific подкаталоге. - Meson-сборка исправлена:
hook-list.hгенерируется до компиляции файлов, которые от него зависят.
Исправления после Git 2.55
- Исправлен возможный crash при диагностике некорректных
.gitfiles. - Улучшена поддержка hashing loose и packed objects больше 4 ГБ на Windows и других LLP64-платформах.
git statusкорректнее показывает rebase todo list и сокращает object IDs для большего числа команд.- Парсинг GPG и SSH signatures теперь удаляет
\rтолько перед\n, а не все carriage returns подряд. - Reftable укреплён против повреждённых таблиц: исправлены out-of-bounds записи и чтения, а также аварийные abort при parsing.
git merge-baseисправлен для репозиториев с commit graph v1 и clock skew: ранний выход включается только при подходящем порядке queue.git submodule update -iснова работает как сокращение для--init.- Rebase больше не копирует notes с dropped commit на несвязанный commit.
git clone --revisionбольше не падает при работе с сервером без protocol v2.git diff --relative --cachedбольше не падает на unmerged paths вне prefix.git cat-file --batch-commandбольше не падает при запросеcontentsбезtype.- В
git rebaseисправлены два случая со skippedfixupиsquash: неверный счётчик коммитов в template message и неоткрывающийся editor для цепочки сfixup -c. - Git for Windows больше не пытается автоматически определять тип symlink, если target path начинается со slash. Это защищает от утечек NTLM credentials при checkout специально подготовленных symbolic links.
- Sparse-index collapse больше не падает при invalidated cache-tree node из-за intent-to-add path.
- Trailer parser больше не принимает строки, начинающиеся с URL, например
https://..., за trailer metadata. git worktree addисправлен для путей с trailing slashes и больше не читает за пределами строки при извлечении имени ветки или worktree.git historyв повреждённом репозитории теперь завершает работу понятной ошибкой, если нужный tree object отсутствует.git checkout -mаккуратнее использует autostash fallback и отделяет совет по конфликтам пустой строкой.- Pathspec matching больше не обращается за пределы памяти, когда negative pathspec короче общего prefix положительных pathspecs.
- Исправлены многочисленные утечки памяти и ресурсов в
format-patch,merge, reftable, Bloom filters, hash backends, remote rewrite, submodule helper, Rust-интерфейсе к C hash functions и других местах. - Исправлены проблемы с unchecked return values, invalid file descriptors и process handles, найденные статическим анализом.
Для разработчиков Git
- В проект добавлена конфигурация для
b4, а документация рекомендует использовать её для отправки patches. SubmittingPatchesобновлён: уточнены standard trailers, реакция на review, ограничения reroll и ожидание, что автор явно отзовёт patch series, если больше не занимается ею.- Тесты активнее используют helper-ы вроде
test_grep,test_stdout_line_countиcommit_body, чтобы не терять exit status команд в pipelines. - Добавлен linter
greplint, запрещающий новые baregrepassertions в тестах. - CI обновлён: статический анализ переведён на Ubuntu 24.04, Debian 11 заменён на Debian 12, pull request workflow отменяет старые runs после нового push.
- В test suite уменьшено потребление диска, часть дорогих тестов отключена на слабых платформах, а long test suite включён в GitLab CI.