Снимки, а не различия

Основное отличие Git’а от любой другой системы контроля версий (включая хранилище конфигурации и его "собратьев") - это подход Git’а к работе со своими данными. Концептуально, большинство других систем хранят информацию в виде списка изменений в файлах. Эти другие системы (хранилище конфигурации, CVS, Subversion, Perforce, Bazaar и т. д.) представляют информацию в виде набора файлов и изменений (дельт), сделанных в каждом файле в течение времени.

Git не хранит и не обрабатывает данные таким способом. Вместо этого подход Git’а к хранению данных больше похож на набор снимков маленькой файловой системы. Каждый раз, когда вы фиксируете изменения, то есть сохраняете состояние своего проекта в Git’е, Git запоминает, как выглядит каждый файл в этот момент, и сохраняет ссылку на этот снимок. Если файлы не были изменены, то для увеличения эффективности Git не запоминает эти файлы вновь, а только создаёт ссылку на предыдущую версию идентичного файла, который уже сохранён. Таким образом, Git представляет свои данные как поток снимков.

Это очень важное различие между Git'ом и почти любой другой системой контроля версий. Git "переосмысливает" практически все аспекты контроля версий, в то время как большинство других систем копируют их из предыдущих версий. Это делает Git больше похожим на небольшую файловую систему с удивительно мощными утилитами, надстроенными над ней, нежели просто на систему контроля версий. Когда мы будем рассматривать управление ветками в главе Ветвление в Git'е, мы увидим, какие преимущества даёт такой подход к работе с данными в Git'е.