Випуск розподіленої системи керування вихідними текстами 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-гілку, зберігши при цьому структуру розгалуження в гілці, що переноситься, і внести на ходу деякі зміни в примітки до коммітів.

  • Додано підтримку створення нової гілки на основі результату визначення бази злиття двох інших гілок (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).

Джерело: opennet.ru

Додати коментар або відгук