Система управления версиями (Version Control System, VCS или Revision Control System) — программное обеспечение для облегчения работы с изменяющейся информацией. Система управления версиями позволяет хранить несколько версий одного и того же документа, при необходимости, возвращаться к более ранним версиям, определять, кто и когда сделал то или иное изменение и многое другое.
Такие системы наиболее широко применяются при разработке программного обеспечения, для хранения исходных кодов разрабатываемой программы. Однако, они могут с успехом применяться и в других областях, в которых ведётся работа с большим количеством непрерывно изменяющихся электронных документов, в частности, они всё чаще применяются в САПР, обычно, в составе систем управления данными об изделии (PDM).
Git - Fast Version Control System - это система контроля версий, предназначенная для быстрой и эффективной работы над очень большими проектами; используется многими проектами с открытым исходным кодом, самым заметным из которых является ядро FAQ Linux. В git исходный код не хранится на одном центральном сервере, а распределён по нескольким серверам. Каждый рабочий каталог Git является полнофункциональным репозиторием с полным набором функций слежения за версиями, независимо от доступности сети или центрального сервера.
Наверно наиболее часто используемый транспортный протокол это SSH. Причина того в том что доступ по SSH уже есть на многих серверах, а если его нет, то его очень легко настроить. Кроме того SSH единственный из сетевых протоколов предоставляющий доступ и на чтение, и на запись. Два других сетевых протокола HTTP и Git в большинстве случаев дают доступ только на чтение, поэтому даже если они вам доступны, вам все равно понадобится SSH для записи. К тому же SSH протокол с аутентификацией, и благодаря его распространенности обычно его легко настроить и использовать.
SSH имеет множество достоинств. Во-первых, вы должны его использовать когда вам нужен авторизованый доступ на запись к вашему репозиторию через сеть. Во-вторых, SSH достаточно легко настроить ― демоны SSH распространены, многие системные администраторы имеют опыт работы с ними, и многие дистрибутивы поставляются с ними или утилитами для управления ими. Также, доступ по SSH безопасен ― данные передаются зашифрованными по авторизованным каналам. Наконец, также как и Git-протокол и локальный протокол SSH эффективен, делая данные перед передачей максимально компактными.
Недостаток SSH в том, что, используя его, вы не можете обеспечить анонимный доступ к репозиторию. Клиенты должны иметь доступ к машине по SSH, даже для работы в режиме только чтение, что делает SSH неподходящим для open source проектов. Если вы используйте Git только внутри корпоративной сети, то возможно SSH единственный протокол с которым вам придется иметь дело. Если же вам нужен анонимный доступ на чтение для ваших проектов, вам придется настроить SSH для себя, чтобы выкладывать изменения, и что-нибудь другое для других, для скачивания.
Следующий протокол ― Git- протокол. Вместе с Git поставляется специальный демон который слушает порт 9418 и предоставляет сервис схожий с протоколом ssh, но абсолютно без аутентификации. Чтобы использовать Git- протокол для репозитория, вы должны создать файл git-export-daemon-ok, иначе демон не будет работать с этим репозиторием, но следует помнить, что в протоколе отсутствуют средства безопасности. Соответственно любой репозиторий в Git может быть либо доступен для клонирования всем, либо не доступен никому. Как следствие обычно вы не можете отгружать изменения по этому протоколу. Вы можете открыть доступ на запись, но из-за отсутствия авторизации в этом случае кто угодно зная URL вашего проекта сможет его изменить. В общем это редко используемая возможность.
Git-протокол ― самый быстрый из доступных протоколов. Если у вас проект с публичным доступом и большой трафик, или у вас очень большой проект, для которого не требуется авторизация пользователей для чтения, вам стоит настроить демон Git для вашего проекта. Он использует тот же механизм передачи данных, что и протокол SSH, но без дополнительных затрат на кодирование и аутентификацию.
Недостатком Git-протокола является отсутствие аутентификации. Поэтому обычно не следует использовать этот протокол как единственный способ доступа к вашему проекту. Обычно он используется в паре с SSH разработчиков, имеющих доступ на запись, тогда как все остальные используют git для доступа на чтение. Кроме того это вероятно самый сложный для настройки протокол. Вы должны запустить собственно демон, не являющийся стандартным. К тому же ему необходим сервис xinetd или ему подобный, что не всегда легко сделать. Также для работы необходимо настроить фаервол, чтобы открыть нестандартный порт 9418, который обычно закрыт на корпоративных брандмауэрах. За крупными корпоративными фаерволами, этот неизвестный порт практически всегда заблокирован.
Последний доступный протокол ― HTTP. Прелесть протоколов HTTP и HTTPS в простоте их настройки. По сути, все что необходимо сделать ― поместить чистый репозиторий внутрь каталога с HTTP документами, установить обработчик post-update и все. Теперь, каждый имеющий доступ к веб-серверу на котором был размещен репозиторий, может его клонировать.
Для управления пользовательским доступом при ssh- ключей можно использовать специальный скрипт/сервер — Git- хостинг, который будет встречать каждого виртуального пользователя при попытке доступа к Git хранилищу. Самые популярные Git хостинги это: gitosis и Руководство по инсталляции и использованию Gitolite. Первый написан на Синтаксис Python и более простой по возможностям, второй же написан на perl.
Software versioning - это процесс создания уникальных имен или номеров для различных версий продуктов программного обеспечения.
Номера версий используются в практических условиях потребителем или клиентом для того, чтобы можно было сравнить имеющуюся у них копию продукта программного обеспечения и новую версию, выпущенную разработчиком. Команда программистов и компании используют нумерацию версий для сравнения отдельных частей и секторов программного кода одних версий с другими, обычно сотрудничая с Системой контроля версий. Не существует абсолютной и определенной схемы нумерации версий продуктов программного обеспечения, поэтому очень часто нумерация зависит от личного выбора программистов.
Тэг (tag) — это объект, связанный с коммитом; хранящий ссылку на сам коммит, имя автора, собственное имя и некоторый комментарий. Кроме того, разработчик может оставлять на таких тегах собственную цифровую подпись.
В git также представленные легковесные тэги (lightweight tags), состоящие только из имени и ссылки на коммит. Такие тэги, как правило, используются для упрощения навигации по дереву истории. Обычные тэги имеет смысл использовать для приложения к коммиту какой-либо информации, вроде номера версии и комментария к нему. Иными словами, если в комментарии к коммиту пишешь «исправил такой-то баг», то в комментарии к тэгу по имени «v1.0» будет что-то вроде «стабильная версия, готовая к использованию».
$ git tag -ln build Alfa version
$ git tag -a build -m 'Alfa version'
$ git push --tags
$ git fetch origin tag $ git branch $ git checkout
$ git tag -d build $ git push origin :refs/tags/build
$ git describe --tags --always 0-1-g7106661
Вывод этой команды расшифровывается так: текущая ветка основана на тэге "0" и отстоит от нее на "1" коммит, плюс g7106661 (хеш-сумма последнего коммита).
Пример работы с версиями:
$ git tag -a 0.1 -m 'Alfa version. Migration to Framework Kohana' $ git push --tags $ git tag -ln 0.1 Alfa version. Migration to Framework Kohana $ git describe --tags --long 0.1-0-g565689c
0.1-0-g565689c расшифровывается так: текущая ветка основана на тэге "0.1" и отстоит от нее на "0" коммит, плюс g565689c (хеш-сумма последнего коммита).
$ git tag -a 0.2 -m 'Frozen Kohana version 3.2' $ git push --tags
По традиции ветка master содержит официальную (стабильную) версию проекта. Для небольшого проекта можно предложить такую схему: имеется две основные ветки master и develop. Тогда в бранчах от master будут находится стабильные(замороженные) версии разрабатываемого проекта, на которые можно только налаживать багфиксы, но не расширять функциональные возможности создаваемого проекта. В бранчах от ветки develop будут разрабатываться новый функционал создаваемого продукта, фичи, которые по мере тестирования будут сливаться вместе, чтобы в конечном итоге залиться в мастер и стать следующем стабильным бранчем от master.
Ключ checkout переключает на выбранную ветку и обновляет рабочую директорию до её состояния, синтаксис
$ git checkout [имя ветки]
$ git checkout master
$ git branch -v * master
$ git branch -rv
$ git branch имя_бранча
После создания бранча надо переключиться на него, то есть, привести рабочую копию в соответствии с HEAD'ом этого бранча и указать репозиторию, что все действия необходимо вести именно с этим бранчем. Такое переключение осуществляется командой
$ git checkout имя_бранча
Чтобы создать и сразу переключиться в новый бренч используется ключ -b
$ git checkout -b имя_нового_бранча
git push origin local_branch_name:remote_branch_name
$ git branch local_branch_name origin/remote_branch_name или git pull $ git checkout local_branch_name
$ git pull origin develop
$ git branch -d local_branch_name
Для удаления этой же ветки на сервере Git нужно выполнить
$ git push origin :test777
git add позволяет внести в индекс — временное хранилище — изменения, которые затем войдут в коммит. Например
git add -A = git add -A :/ = git add :/ + git add -u
С точкой — только текущий путь:
git add -A . = git add . + git add -u .
git rm одновременное удаление файлы из индекса и дерева.
git reset - откат состояния. Позволяет сбросить весь индекс или удалить из него изменения определенного файла.
У вас есть снимок файлов в текущей директории, созданный например так
$ git add . $ git commit -am "Мой минорный backup"
Вы начинаете править файлы и в какой-то момент решили откатиться к предыдущей сохраненной версии. Это можно сделать так:
$ git reset --hard
Или до любого другого коммита.
# git reset --hard b0b9c22b1fc49b25a104e1dc2986172aece8b442
Файл .gitignore служит для настройки игнорирования файлов, готовые настроенные файлы доступны на Github A collection of .gitignore templates. Обычно .gitignore находится в корне проекта, но он может быть создан в каждой подпапке проекта со своими индивидуальными запросами.
Если вам нужно исключить из игнорирования файл или директорию используйте символ "!" и размешайте эти правила в конце файла gitignore. Пример .gitignore:
$ git help ignore $ nano .gitignore # Игнорировать файлы с расширением *.a и *.o *.[oa] # Игнорировать файлы moc_ и core moc_* *.core # все html-файлы… *.html # все файлы заканчивающиеся на знак ~ *~ # Игнорировать папки /backup/* /other/* /public_www/cache/* /public_www/logs/* /public_www/tmp/* # Игнорировать файлы, кроме файла .keepdir !.keepdir
Строки, начинающиеся с '#' считаются комментариев. Файлы .gitignore могут быть добавлены в репозиторий подобно другим файлам (просто запустив git add .gitignore, как обычно).
Если игнорируемые файлы уже есть в репозитории - обязательно почистите кеш репозитория:
git rm -r --cached . git add . git commit -am ".gitignore tune. Clean."
$ git commit -am 'Добавить изменения к проекту'
Если нужно изменить описательную запись в журнале для последнего коммита запустите команду
$ git commit --amend
Если забыли добавить новый файл в последний коммит нужно запустить git add и команду выше:
$ git add . $ git commit --amend
Если нужно добавить еще немного изменений в последний коммит запустите, после внесения изменений в файлы проекта:
$ git commit --amend -a
git log служит для просмотра изменений репозитория. По умолчанию, без аргументов, git log выводит список коммитов созданных в данном репозитории в обратном хронологическом порядке (самые последние коммиты показываются первыми).
$ git log --stat
Manual Page: git-diff
# git diff
# git diff --cached
# git diff xxx yyy cups/printers.conf # git diff xxx yyy cups/printers.conf | kompare -o -
[alias] ci = commit co = checkout st = status br = branch
$ git remote origin
$ git remote show origin
git remote update