понедельник, 11 июля 2011 г.

Git - распределенная система контроля версий (часть 1)

     Git - распределенная система управления версиями файлов. Поддерживает быстрое разделение и слияние версий, включает инструменты для визуализации и навигации по нелинейной истории разработки. Git предоставляет каждому разработчику локальную копию всей истории разработки, изменения копируются из одного репозитория в другой.
     В Git теряется понятие ревизии, характерное для линейных моделей разработки. Вместо этого каждый из коммитов определяется хэшем. Это немножко неудобно для восприятия, поэтому разумно использовать механизм тэгов для того, чтобы выделять ключевые коммиты.     
     Преимуществом является то, что можно работать с кодом как хотите, а не как диктует система контроля версий. В git для идентификации любых объектов используется уникальный хэш из 40 символов, который определяется хэшируюшей функцией на основе содержимого объекта. Объекты — это коммиты, файлы, тэги, деревья. Поскольку хэш уникален для содержимого, например, файла, то и сравнивать такие файлы очень легко — достаточно просто сравнить ихние хешы. Хэши являются идентификаторами коммитов. Также хеш является продвинутым аналогом ревизий Subversion.
1) Централизованная и распределенная система контроля версий     
        В централизованной подходе разработки существует единственный удаленный центральный репозиторий в который разработчики вносят свои изменения. Разработка при таком подходе происходит так: выкачивается последняя версия проекта из репозитория, разрабатывается или исправляется новый функционал, происходит обращение к репозиторию для разрешения конфликтов, загружается новая ревизия на сервер. Иногда требуется работать удаленно без доступа к центральному репозиторию, это ограничивает действия разработчика и лишает гибкости при разработке.     
     В распределенном подходе не существует главного репозитория (как в SVN), всем разработчикам предоставляется собственный репозиторий с которым они работают. Связь с другим репозиториями нужна только для изменения/чтения версий файлов других ветвей.
2) Особенности Git
  • гибкая система управления которая может использоваться не только в сфере разработки 
  • удобное ветвление и слияние, которое происходит быстро и легко 
  • предоставляет гибкие и простые в использовании инструменты для ведения истории проекта 
  • легкость взаимодействия между репозиториями 
  • всем разработчикам предоставляется полная копия исходного кода проекта, это означает что каждый разработчик работает независимо от текущего состояния проекта 
3) Архитектура Git
     Git-репозиторий состоит из четырех типов обьектов: Blob, Tree, Commit и References.

  • Blob (Binary Large Object) – все файлы проекта являются blob-ами. Это тип данных , который вмещает содержимое файла и собственный SHA-1 хеш. 
  • Tree - это каждая директория проекта. Tree ссылается на другие tree и blob'ы, и указывает их имена и атрибуты. 
  • Commit хранит историю проекта. Содержит собственный SHA-1 хеш, ссылку на одно дерево, ссылку на предыдущий коммит. 
  • Reference содержит ссылку на любой из четырех обьектов - Blob, Tree, Commit и References. Он указывает на обьект на который он ссылается. Работать с набором символов не очень удобно, в отличие от SHA1-хеша, можно именовать как захочется. 
     Ссылки делятся на ветки(Head, Branch) и теги(Tag).
  • Ветвь (Head, Branch) - ссылка, которая указывает на последний коммит определенной ветви, используется как синоним файла на который она ссылаетс 
  • Тег (tag) - ссылается на один и тот же обьект(blob, tree, commit, tag), хранит ссылку на сам коммит, имя автора, собственное имя и комментарий. Tag можно разделить на легковесный(состоит из имени и ссылки на коммит) и тяжеловесный или аннотированный(состоит из собственного хеша, типа указываемого обьекта, символьного имени, даты и времени создания тега, имени и e-mail). 
4) Основные команды Git
  • add - индексация изменений 
  • branch - выводит список ветвей, создает новые ветки или удаляет копию ветвей 
  • checkout - переключение между ветками, извлечение отдельных файлов и истории коммитов 
  • commit - записывает изменения файлов и директорий в индекс git 
  • diff - показывает различия между деревьями проекта, коммитами и состоянием индекса 
  • fetch - извлекает изменения удаленной ветки из репозитория 
  • grep - поиск в файлах текущей ветки соответствия указанному шаблону и отображает их 
  • log - информация о коммитах или по отдельным файлам 
  • merge - слияние изменений, сделанных в одной ветви, в другую ветвь 
  • mv - переименовывает файл, директорию или символическую ссылку 
  • pull - забирает изменения из центрального репозитория 
  • push - вносит изменения в центральный репозиторий 
  • rebase - берет коммиты из ветки, где было совершенно несколько коммитов и накладывает их на последний коммит ветки master 
  • rm - удаляет файл, директорию или символическую ссылку 
  • status - показывает состояние проекта, измененные и не добавленные файлы, индексированные файлы 
  • show - показывает изменения, сделанные отдельным коммитом

Комментариев нет:

Отправить комментарий