Выпуск распределенной системы управления исходными текстами Git 2.22

Представлен выпуск распределенной системы управления исходными текстами Git 2.22.0. Git является одной из самых популярных, надёжных и высокопроизводительных систем управления версиями, предоставляющей гибкие средства нелинейной разработки, базирующиеся на ответвлении и слиянии веток. Для обеспечения целостности истории и устойчивости к изменениям задним числом используются неявное хеширование всей предыдущей истории в каждом коммите, также возможно удостоверение цифровыми подписями разработчиков отдельных тегов и коммитов.

По сравнению с прошлым выпуском в новую версию принято 745 изменений, подготовленных при участии 74 разработчиков, из которых 18 впервые приняли участие в разработке. Основные новшества:

  • Доступный начиная с выпуска 1.18 новый режим переноса набора коммитов «git rebase --rebase-merges» заменил собой старую опцию »--preserve-merges», которая теперь помечена как устаревшая. Операция «git rebase» применяется для замены серии коммитов на новый базовый коммит, например, для сдвига отдельной ветки, в которой развивается какая-то новая возможность, к актуальному состоянию master-ветки, включающей исправления, добавленные после ответвления:
                      o --- o --- o (my-feature)                  /    o --- o --- o --- o --- o (master)                                  o --- o --- o (my-feature)                              /    o --- o --- o --- o --- o (master)  

    Для сохранения структуры ветвления в переносимой ветке ранее могла применяться опция »--preserve-merges», которая при применении интерактивного режима (git rebase -i --preserve-merges) позволяла редактировать историю коммитов, но не гарантировала полное сохранение структуры репозитория. Пришедший на смену режим »--rebase-merges» позволяет сохранить структуру изменений в переносимой ветке, предоставляя при этом полный набор интерактивных операций, включая удаление, перегруппировку и переименование коммитов.

    Например,»--rebase-merges» позволяет перезалить коммиты из отдельной ветки на более новую master-ветку, в которую с моментам ответвления успели внести исправления, сохранив при этом структуру ветвления в переносимой ветке и внести на ходу некоторые изменения в примечания к коммитам.

  • Добавлена поддержка создания новой ветки на основе результата определения базы слияния двух других веток (привязка к общему предку) при помощи конструкций «git branch new A…B» и «git checkout -b new A…B», в которых «A…B» подразумевает определение базы слияния между двумя указанными коммитами, по аналогии с тем, как «git checkout A…B» смещает HEAD на базовый коммит и «diff A…B» показывает изменения между коммитом «B» и общим с коммитом «А» предком.

    Например, при работе над отдельной веткой my-feature предложенную возможность можно использовать когда требуется начать с другой ветки, например, с того же места в master-ветке, с которого была извлечена ветка my-feature. Ранее для этого требовалось вручную изучить лог изменений, что создавало неудобства при наличии большой истории изменений, затем выполнить «git merge-base master my-feature» для вычисления хэша базы слияний между ветками master и my-feature и создать новую ветку относительно общего предка «git branch my-other-feature хэш». В Git 2.22 для создания ветки относительно базы слияния двух других веток можно использовать синтаксис «git branch my-other-feature A…B»;

  • Добавлена опция «git branch --show-current» для отображения имени ветки, полученной при выполнении операции checkout;
  • Добавлена опция «git checkout --no-overlay — dir», позволяющая при выполнении операции checkout привести содержимое каталога dir к виду, полностью соответствующему состоянию master-ветки. Например, если в локальной копии каталога dir имеется файл, отсутствующий в master-ветке, то по умолчанию при выполнении «git checkout master — dir» он будет оставлен, а при указании опции »--no-overlay» удалён;
  • В команде «git diff» задействован универсальный API для разбора опций, что позволило унифицировать обработку опций с другими утилитами git. Например, в «git diff» для всех опций теперь доступны и их антагонисты (»--function-context» и »--no-function-context»);
  • Добавлена возможность фильтрации при выводе «git log» прикреплённых к коммитам расширенных меток («trailer» — дополнительные информационные флаги, такие как Signed-off-by и Co-authored-by). Возможна фильтрация меток как по ключу, так и по значению, например: «git log --pretty=»%(trailers: key=Reviewed-by, valueonly)»;
  • Добавлен новый механизма трассировки Trace2, предлагающий более гибкий и структурированный формат вывода. Trace2 позволяет собирать телеметрию о выполняемых операциях и данных о производительности для более детального анализа и отладки (обработчик назначается пользователем, никакие данные не отправляются вовне);
  • Сделан более читаемым отчёт «git bisect», в котором теперь более наглядно выделяются проблемные коммиты и выводятся сводная статистика по изменениям для каждого файла (на уровне числа изменённых строк);
  • Переработана эвристика определения переименований каталогов с целью исключения ложной установки меток переименования. При наличии сомнений подобные каталоги теперь помечаются конфликтующими;
  • Обеспечен вывод предупреждения при попытки установки тега на другой тег, что, как правило, совершается по ошибке и может привести к установке метки не на тот коммит (например, конструкция вида «git tag -f -m «updated message» my-tag1 my-tag2» приведёт к созданию тега на старый тег, в то время как разработчик рассчитывал, что новый тег будет установлен на коммит, на который указывает старый тег);
  • Добавлена оптимизация, сокращающая объём вычислений при оценке различий: исключён учёт delta-изменений для объектов из одного ответвления с другими объектами, которые не появляются в том же ответвлённом репозитории;
  • Включена генерация для репозиториев битовых карт (дисковая структура «reachability bitmaps»), сохраняющих данные о наборах объектов, доступных для каждого коммита, и позволяющих быстро определить наличие базового объекта. Указанная структура позволяет заметно сократить время выполнения операций извлечения данных (git fetch).

© OpenNet