Выпуск распределенной системы управления исходными текстами Git 2.22
8 июня 2019 года
Представлен выпуск распределенной системы управления исходными текстами 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-ветку, сохранив при этом структуру ветвления в переносимой ветке, и внести на ходу некоторые изменения в примечания к коммитам.
- Добавлена поддержка создания новой ветки на основе результата определения базы слияния двух других веток (merge base, привязка к общему предку) при помощи конструкций "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" приведёт к созданию тега на старый тег, в то время как разработчик рассчитывал, что новый тег будет установлен на коммит, на который указывает старый тег);
- Включена генерация для репозиториев битовых карт (дисковая структура "reachability bitmaps"), сохраняющих данные о наборах объектов, доступных для каждого коммита, и позволяющих быстро определить наличие базового объекта. Указанная структура заметно сокращает время выполнения операций извлечения данных (git fetch).
Источники
править
Любой участник может оформить статью: добавить иллюстрации, викифицировать, заполнить шаблоны и добавить категории.
Любой редактор может снять этот шаблон после оформления и проверки.
Комментарии
Если вы хотите сообщить о проблеме в статье (например, фактическая ошибка и т. д.), пожалуйста, используйте обычную страницу обсуждения.
Комментарии на этой странице могут не соответствовать политике нейтральной точки зрения, однако, пожалуйста, придерживайтесь темы и попытайтесь избежать брани, оскорбительных или подстрекательных комментариев. Попробуйте написать такие комментарии, которые заставят задуматься, будут проницательными или спорными. Цивилизованная дискуссия и вежливый спор делают страницу комментариев дружелюбным местом. Пожалуйста, подумайте об этом.
Несколько советов по оформлению реплик:
- Новые темы начинайте, пожалуйста, снизу.
- Используйте символ звёздочки «*» в начале строки для начала новой темы. Далее пишите свой текст.
- Для ответа в начале строки укажите на одну звёздочку больше, чем в предыдущей реплике.
- Пожалуйста, подписывайте все свои сообщения, используя четыре тильды (~~~~). При предварительном просмотре и сохранении они будут автоматически заменены на ваше имя и дату.
Обращаем ваше внимание, что комментарии не предназначены для размещения ссылок на внешние ресурсы не по теме статьи, которые могут быть удалены или скрыты любым участником. Тем не менее, на странице комментариев вы можете сообщить о статьях в СМИ, которые ссылаются на эту заметку, а также о её обсуждении на сторонних ресурсах.