02.28 git: работа с ветками
- разогрев
- беглое повторение про ветки (из лекции)
qgit и полная история
пример с ребейзом
- сделать ветку
- сделать в неё два коммита
- переключиться на master
- сделать в него два неконфликтующих коммита (например, в новый файл)
- посмотреть, какой коммит был раньше какого
- поребейзить ветку поверх мастера
- убедиться в линейности истории
пример с мержем (ветку используем с предыдущего примера)
- переключиться на master
- сделать в master два коммита
- помержить ветку с master-ом
- увидеть мерж-коммит и граф истории
пример с «переотрастанием» ветки при rebase (aka «ветка — не ветка»)
- создать историю из 4 коммитов
- сделать ветку, совпадающую с master
на ветке сделать rebase -i на два шага истории назад
- исправить самый первый коммит (достаточно reword в commit message!)
- убедиться, что ветка теперь отрастает из другого места (а git diff ничего не показывает)
Порождение процессов через multiprocessing (введение)
- Общий механизм: см. начало документации
process = pool.apply_async(функция, кортеж_параметров) — запускает одну функцию в параллель
result = process.get(тайм-аут) — дожидается получения результата из функции или бросает исключение
Простой пример (с time.sleep())
Использование textdistance
- Что такое редакторское расстояние
- сложность алгоритма
Задача_1: работа с ветками в git при разработке программы с использованием textdistance. Требуется написать программу, вычисляющую расстояние между двумя строками, причем расширение функциональности программы выполняется на ветках
- Базовая функциональность на ветке master
Создайте ветку task1_20220228_master (каталог с решением назовите как обычно, по дате занятия)
- Реализуйте на ней (по одному коммиту на пункт):
импорт textdistance; функцию dist(s1, s2), возвращающую расстояние между строками s1, s2 по Левенштейну (Levenshtein )
- чтение со стандартного ввода двух строк, не содержащих пробелы
вызов функции dist для этих двух функций, с занесением результата в переменную res
вывод значения res
- примечание: вызов и вывод разделены, т.к. вызов в дальнейшем будет модифицироваться, а вывод - нет
Посмотрите структуру веток в qgit
- Разработка логики выбора алгоритма сравнения на devel-ветке с последующим слиянием (merge)
Создайте ветку task1_20220228_choose_algo на базе коммита и переключитесь на неё (проверьте!)
- Реализуйте на ней (по одному коммиту на пункт) следующее:
- чтение со стандартного ввода третьей строки
поддержка в функции dist третьего параметра, передача третьей строки в качестве этого параметра
вычисление в dist расстояния по Левенштейну или по Дамерау-Левенштейну в зависимости от значения третьего параметра ("L" => Левенштейн, "D" => Дамерау-Левенштейн, другое значение => возвращать -1)
Посмотрите структуру веток в qgit
Сделайте merge ветки task1_20220228_choose_algo на ветку task1_20220228_master
Посмотрите структуру веток в qgit
- Обратите внимание на merge-коммит и на порядок следования коммитов в "суммарной" истории до merge-коммита
- Разработка логики параллельного запуска с последующим дописыванием в историю (rebase)
Создайте ветку task1_20220228_multiproc на базе коммита и переключитесь на неё (проверьте!)
- Реализуйте на ней (по одному коммиту на пункт) следующее:
вызов функции dist с помощью multiprocessing с полным ожиданием результата
добавление к вызову функции dist с помощью multiprocessing тайм-аута 1 секунда и обработки исключения (в этом случае возвращать -1)
Добавьте историю (rebase) ветки task1_20220228_multiproc на ветку task1_20220228_master (где к этому шагу будет merge-коммит)
Внимание! в результате именно ветка task1_20220228_master должна вобрать в себя все коммиты (т.е. команда должна быть git rebase task1_20220228_multiproc task1_20220228_master)
посмотрите структуру веток в qgit
- Проверьте работу программы:
- на паре строк, имеющей различные расстояния по Левенштейну и по Дамерау-Левенштейну, например: "ABCDEF", "BADCFE" (расстояние по Д.-Л. меньше чем по Д., поскольку допустимы перестановки)
- на паре очень больших строк (откуда их взять, подскажет ведущий семинара)
Если программа работает корректно, залейте (merge) ветку task1_20220228_master на основную ветку (master)
- Базовая функциональность на ветке master