Реализовать систему контроля версий и CLI (command line interface) к ней со следующими возможностями:
init-- инициализация репозиторияadd <files>-- добавление файлаrm <files>-- файл удаляется из репозитория, физически остаетсяstatus-- измененные/удаленные/не добавленные файлыcommit <message>с проставлением даты и времениreset <to_revision>. Поведениеresetсовпадает сgit reset --hardlog [from_revision]checkout <revision>- Возможные значения
revision:commit hash-- хеш коммитаmaster-- вернуть ветку в исходное состояниеHEAD~N, гдеN-- неотрицательное целое число.HEAD~Nозначает _N-й коммит перед HEAD (HEAD~0 == HEAD)
- Возможные значения
checkout -- <files>-- сбрасывает изменения в файлахbranch-create <branch>-- создать ветку с именем<branch>branch-remove <branch>-- удалить ветку<branch>show-branches-- показать все имеющиеся веткиmerge <branch>-- слить ветку<branch>в текущую
На все команды есть ограничения на время работы:
- Главное требование — не O(n), где n — число всех коммитов в текущей ветке
- Для reset, log и checkout максимальная асимптотика — количество коммитов между текущим и указанным
- Для остальных оптимальным вариантом будет O(1), но можно больше.