Чаще всего над программным продуктом работает не один человек: кто-то пишет один модуль, еще кто-то другой, тесты могут писать совсем другие люди, не те, кто пишет основной код и т.д.. Чтобы хранить код удаленно и совместно работать над ним используются специальные сервисы, например GitHub или GitLab.
Одна из главных функций в этих сервисах - отслеживать изменения в файлах.
"Под капотом" у них - специальная утилита - Git - для отслеживания истории изменения файлов. С помощью Git вы можете откатить проект до более старой версии, сравнивать изменения в версиях проекта, объединить все изменения и тд.
Хранилище вашего кода/файлов (и истории его изменений). называют репозиторием.
Репозитории могут быть локальными - по сути, любая папка на жестком диске может быть репозиторием, и удаленными (внешними) - это версии вашего проекта, сохраненные на удаленном сервере.
Создадим локальный и удаленный репозитории и свяжем их между собой.
Папка, в которой хранится наш проект, автоматически не станет репозиторием. Нужно инициализировать репозиторий т.е. сообщить Git’у, что изменения в файлах, которые хранятся в этой папке, нужно отслеживать.
Для этого нужно перейти в папку проекта, правой кнопкой мыши открыть меню и запустить Git.

Откроется командная строка в которой нужно ввести и запустить команду git init. После чего Git сообщит, что репозиторий инициализирован.

Теперь git будет отслеживать изменения в файлах этого репозитория, но чтобы это произошло git’у нужно сообщить, какие именно файлы нужно отслеживать.
В Git есть несколько статусов файлов:
Untracked - файл, который Git пока не “видит” т.е. не отслеживает.
Unmodified - файл, который Git уже видит, но файл еще не изменялся.
Modified - это файл, в который вносились изменения (сам файл отслеживается Git’ом, но изменения пока не зафиксированы).
Staged - это файл, добавленный в индекс т.е. готовый к коммиту (сохранению) .
Как только файл будет закоммичен т.е. все изменения зафиксированы Git’ом, он снова переходит в статус unmodified.
Когда в инициализированном репозитории появляется новый файл, он автоматически попадает в состояние untracked, файл можно изменять, но Git не будет учитывать изменения. Чтобы Git “увидел” файл, его нужно добавить в индекс и тогда файл перейдет в состояние Staged.
Чтобы узнать какие файлы в каком состоянии находятся используется команда git status.

Видим, что Git показывает список не закоммиченых файлов и предлагает добавить файлы в индекс, с помощью команды git add название_файла. Можно добавить все файлы сразу, с помощью команды git add --all.
Выполняем команду. Теперь видно, что все файлы в репозитории готовы к коммиту.

Чтобы сохранить изменения в файле т.е. закоммитить файл, нужно дать Git команду git commit c ключом -m (англ. message), после ключа обычно указывают комментарий, в котором указывают, что именно изменилось в файле: git commit -m "My first commit".

Чтобы посмотреть список коммитов используется команда git log.
Как найти нужный коммит в истории, как посмотреть его, как откатить проект до определенной версии и многое другое можно изучить, воспользовавшись официальной документацией Git https://git-scm.com/doc.
Ветвление_
Еще одна важная функция git, которая нам понадобится - это ветвление. Ветвление - это параллельная разработка по нескольким линиям т.е. разделение версий проекта и работа над ними по отдельности.
Когда репозиторий инициализируется командой git init, автоматически создается основная ветка. Обычно она автоматически называется master (иногда main) и в ней находится основная стабильная версия проекта.
Командой git branch можно посмотреть в какой ветке ты сейчас находишься.
Чтобы не испортить в процессе разработки тестов основную ветку, создают вторую ветку и работают уже с ней, назвать ее можно как угодно. Чтобы создать ветку используют команду git branch название_ветки.

Однако, после создания новой ветки, мы все еще находимся в основной ветке проекта. Чтобы переключится на вновь созданную ветку (или на любую другую) используется команда git checkout название_ветки. Либо используют ключ -b, чтобы переключится на ветку сразу после ее создания git checkout -b название_ветки.
