Git — это система контроля версий с открытым исходным кодом. Она была спроектирована и разработана Линусом Торвальдсом (создателем ядра Linux) и на сегодняшний день является самой популярной системой контроля версий. Давайте углубимся в детали.
О контроле версий
Проще говоря, контроль версий — это система, которая записывает изменения в файле или наборе файлов с течением времени, чтобы вы могли позже вспомнить определенные версии. При разработке программного обеспечения исходный код программного обеспечения используется в качестве файлов, контролируемых версиями, хотя на самом деле вы можете сделать это практически с любым типом файла на компьютере. Например, графический или веб-дизайнер может использовать программное обеспечение для контроля версий, чтобы сохранить все прошлые версии изображения или макета.
Использование системы контроля версий (VCS) позволяет:
- Вернуть один, несколько или все файлы обратно в любое ранее сохраненное состояние
- Сравнить изменения между различными сохраненными состояниями
- Узнайте, кто добавил проблему и когда
- Восстановить (случайно) потерянные файлы
Локальные системы контроля версий
Метод управления версиями, который выбирают многие люди, заключается в копировании файлов в другой каталог (возможно, в каталог с отметкой времени, если они сообразительны). Этот подход очень распространен, потому что он очень прост, но он также невероятно подвержен ошибкам. Чтобы решить эту проблему, программисты уже давно разработали локальные системы контроля версий, которые имели простую локальную базу данных, которая хранила все изменения в файлах под контролем версий.
Одним из самых популярных локальных инструментов VCS была система под названием «Revision Control System» (RCS), которая до сих пор используется на многих компьютерах. RCS работает, сохраняя наборы исправлений (то есть различия между файлами) в специальном формате на диске, затем он может воссоздать то, как выглядел любой файл в любой момент времени, добавив все исправления.
Централизованные системы контроля версий
Следующая серьезная проблема, с которой сталкиваются люди, заключается в том, что им необходимо сотрудничать с разработчиками других систем. Для решения этой проблемы были разработаны централизованные системы контроля версий (CVCS). Эти системы (такие как CVS, Subversion и Perforce) имеют один сервер, содержащий все файлы с версиями, и несколько клиентов, которые извлекают файлы из этого центрального места. В течение многих лет это было стандартом для контроля версий.
Эта система предлагает много преимуществ, особенно по сравнению с локальными VCS. Например, все в определенной степени знают, чем занимаются все остальные участники проекта. Администраторы имеют детальный контроль над тем, кто что может делать, и гораздо проще администрировать CVCS, чем иметь дело с локальными базами данных на каждом клиенте.
Однако у этой установки есть и серьезные недостатки. Наиболее очевидным является единая точка отказа, которую представляет собой централизованный сервер. Если этот сервер отключается на час, то в течение этого часа никто не может вообще сотрудничать или сохранять версии изменений во всем, над чем они работают. Если жесткий диск, на котором находится центральная база данных, будет поврежден, а надлежащие резервные копии не будут сохранены, вы потеряете абсолютно все, всю историю проекта, за исключением отдельных моментальных снимков, которые люди случайно имеют на своих локальных машинах. Локальные VCS страдают той же проблемой, когда у вас вся история проекта в одном месте, мы рискуем все потерять.
Распределенные системы контроля версий
Именно здесь в дело вступают распределенные системы управления версиями (DVCS). В DVCS (таких как Git, Mercurial, Bazaar или Darcs) клиенты не просто извлекают последний снимок файлов, они полностью отражают репозиторий, включая его полную историю. Таким образом, если какой-либо сервер умирает, и эти системы взаимодействуют через этот сервер, любой из клиентских репозиториев может быть скопирован обратно на сервер для его восстановления. Каждый клон — это действительно полная резервная копия всех данных.
Кроме того, многие из этих систем довольно хорошо справляются с несколькими удаленными репозиториями, с которыми они могут работать, поэтому вы можете одновременно сотрудничать с разными группами людей разными способами в рамках одного проекта. Это позволяет настроить несколько типов рабочих процессов, которые невозможны в централизованных системах, таких как иерархические модели.