02.28 git: работа с ветками

  1. разогрев
    • беглое повторение про ветки (из лекции)
    • qgit и полная история

    • {i} пример с ребейзом

      • сделать ветку
      • сделать в неё два коммита
      • переключиться на master
      • сделать в него два неконфликтующих коммита (например, в новый файл)
      • посмотреть, какой коммит был раньше какого
      • поребейзить ветку поверх мастера
      • убедиться в линейности истории
    • {i} пример с мержем (ветку используем с предыдущего примера)

      • переключиться на master
      • сделать в master два коммита
      • помержить ветку с master-ом
      • увидеть мерж-коммит и граф истории
    • {i} пример с «переотрастанием» ветки при rebase (aka «ветка — не ветка»)

      • создать историю из 4 коммитов
      • сделать ветку, совпадающую с master
      • на ветке сделать rebase -i на два шага истории назад

      • исправить самый первый коммит (достаточно reword в commit message!)
      • убедиться, что ветка теперь отрастает из другого места (а git diff ничего не показывает)
  2. Порождение процессов через multiprocessing (введение)

    • Общий механизм: см. начало документации
    • process = pool.apply_async(функция, кортеж_параметров) — запускает одну функцию в параллель

    • result = process.get(тайм-аут) — дожидается получения результата из функции или бросает исключение

    • Простой пример (с time.sleep())

  3. Использование textdistance

    • Что такое редакторское расстояние
    • сложность алгоритма
  4. <!> Задача_1: работа с ветками в git при разработке программы с использованием textdistance. Требуется написать программу, вычисляющую расстояние между двумя строками, причем расширение функциональности программы выполняется на ветках

    1. Базовая функциональность на ветке master
      • Создайте ветку task1_20220228_master (каталог с решением назовите как обычно, по дате занятия)

      • Реализуйте на ней (по одному коммиту на пункт):
        1. импорт textdistance; функцию dist(s1, s2), возвращающую расстояние между строками s1, s2 по Левенштейну (Levenshtein )

        2. чтение со стандартного ввода двух строк, не содержащих пробелы
        3. {1} вызов функции dist для этих двух функций, с занесением результата в переменную res

        4. вывод значения res

        5. примечание: вызов и вывод разделены, т.к. вызов в дальнейшем будет модифицироваться, а вывод - нет
      • Посмотрите структуру веток в qgit

    2. Разработка логики выбора алгоритма сравнения на devel-ветке с последующим слиянием (merge)
      • Создайте ветку task1_20220228_choose_algo на базе коммита {1} и переключитесь на неё (проверьте!)

      • Реализуйте на ней (по одному коммиту на пункт) следующее:
        1. чтение со стандартного ввода третьей строки
        2. поддержка в функции dist третьего параметра, передача третьей строки в качестве этого параметра

        3. {2} вычисление в dist расстояния по Левенштейну или по Дамерау-Левенштейну в зависимости от значения третьего параметра ("L" => Левенштейн, "D" => Дамерау-Левенштейн, другое значение => возвращать -1)

      • Посмотрите структуру веток в qgit

    3. Сделайте merge ветки task1_20220228_choose_algo на ветку task1_20220228_master

      • Посмотрите структуру веток в qgit

      • Обратите внимание на merge-коммит и на порядок следования коммитов в "суммарной" истории до merge-коммита
    4. Разработка логики параллельного запуска с последующим дописыванием в историю (rebase)
      • Создайте ветку task1_20220228_multiproc на базе коммита {2} и переключитесь на неё (проверьте!)

      • Реализуйте на ней (по одному коммиту на пункт) следующее:
        1. вызов функции dist с помощью multiprocessing с полным ожиданием результата

        2. добавление к вызову функции dist с помощью multiprocessing тайм-аута 1 секунда и обработки исключения (в этом случае возвращать -1)

    5. Добавьте историю (rebase) ветки task1_20220228_multiproc на ветку task1_20220228_master (где к этому шагу будет merge-коммит)

      • Внимание! в результате именно ветка task1_20220228_master должна вобрать в себя все коммиты (т.е. команда должна быть git rebase task1_20220228_multiproc task1_20220228_master)

      • посмотрите структуру веток в qgit

    6. Проверьте работу программы:
      • на паре строк, имеющей различные расстояния по Левенштейну и по Дамерау-Левенштейну, например: "ABCDEF", "BADCFE" (расстояние по Д.-Л. меньше чем по Д., поскольку допустимы перестановки)
      • на паре очень больших строк (откуда их взять, подскажет ведущий семинара)
    7. Если программа работает корректно, залейте (merge) ветку task1_20220228_master на основную ветку (master)

LecturesCMC/PythonDevelopment2022/Prac/03_DvcsBranchMerge (последним исправлял пользователь hbd 2022-02-28 14:18:12)