# **Revis** — учебный проект на C, упрощённая реализация системы контроля версий
> По сути вы можете изучить работу Git и увидеть все тоже самое только в более сложной и универсальной форме. Как никак он разрабатывается с 2005 года.
> https://github.com/tracehillonsign/revis
### Справка перед началом
- **Система контроля версий** - программа, которая помогает отслеживать изменения в файлах, хранить их версии и оперативно возвращаться в любое сохранённое состояние.
- **Хеш** - строка фиксированной длины, которая создаётся из исходных данных с помощью хеш-функции.
- **BLOB объект** - файл, который хранит сжатое содержимое оригинального файла (вообще BLOB это тип данных предназначенный для хранения больших объемов бинарных данных но в рамках проекта это именно файл)
- **TREE объект** - файл, который хранит список хешей BLOB объектов и дополнительных данных о них.
- **COMMIT объект** - файл, который хранит хеш TREE объекта и дополнительную информацию. Например, автора/почту автора и сообщение с объяснением что он изменил.
---
### Начнем с объяснения принципов на которых построена программа
Вся логика программы строиться во круг **хешей**. При любом изменении файла, даже добавлении пустой строки, **хеш будет уже другой**. Это позволяет получить **уникальный идентификатор** каждого файла. Если BLOB файл с таким хешем уже существует значит если мы хотим создать новый BLOB файл то он не будет создан поскольку ровно точно такой же файл с идентичным содержимым уже существует.
Да, существует коллизия хешей когда разные данные могут иметь одинаковые хеши но это максимально редко и решается улучшением хеш алгоритма и добавлением пополнительных символов в хеш.
Например:
```
Строка "revis": e9f7d38d326eda4b303f6baea528f42e7d4f3b465fa90c72f4c8b3e4d8148a85
Строка "revis1": 2b7e6b49fdd196c1466ffe163c021f98694e6fb6527fb0282a440847c3f9b03d
```