Распределенная система контроля версий не нуждается в центральном сервере, хранящем версии, вся история хранится на каждом локальном компьютере и при необходимости синхронизируется с аналогичным хранилищем другого компьютера. В этом отличие Git от, например, SVN - можно установить Git только на локальный компьютер и хранить все версии у себя, не дублируя на сервер. Однако в случае командной работы все же удобно иметь сервер, хранящий версии. Такой сервер также можно воспринимать как бэкап всех актуальных файлов и их версий, доступный из любой точки мира.

Здесь я приведу краткие данные, позволяющие быстро начать работу с Git и Bitbucket.Bitbucket - это сервис, централизованно хранящий репозитории Git, бесплатный для 5 пользователей и платный для больших команд. Преимущество Bitbucket перед аналогичным сервисом GitHub - возможность создания закрытых репозиториев (не open source).

Установка, настройка


Итак, первое, что нам стоит сделать - установить сам Git для используемой операционной системы (Windows, Linux, Solaris, Mac OS). Второе - зарегистрироваться на Bitbucket и создать репозиторий.

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

Пройдя регистрацию на Bitbucket, создаем новый репозиторий, для чего выбираем Repositories > Create repository. Вводим имя создаваемого репозитория, указываем тип (Git), уровень доступа (Access level) в private - не open source проект. Также можно установить основной язык программирования, используемый в проекте. Завершив создание репозитория, Bitbucket отобразит страницу «Add some code», где мы выберем «I have an existing project to push up» для добавления существующего проекта в репозиторий, после чего система отобразит команды, которые нам необходимо будет выполнить для последующей синхронизации локального репозитория с Bitbucket - не закрывайте окно.

Итак, мы создали репозиторий на Bibucket, теперь необходимо создать локальный репозиторий на локальном компьютере, чтобы впоследствии синхронизировать его с Bitbucket. Для этого мы будем использовать терминальные команды Git, поэтому в случае Windows необходимо добавить в переменную окружения PATH путь к исполняемым файлам Git (как правило, это C:\Program Files (x86)\Git\bin), в случае Linux и Mac OS система уже сделала это за вас при установке.

Таким образом, на текущем этапе у нас установлен Git и в переменной окружения PATH корректно прописан путь к исполняемым файлам Git - неплохо. Открываем терминал/командную строку нашей операционной системы (конечно, для Git существуют и GUI решения, но в этой статье я буду касаться только классических терминальных инструментов).

В первую очередь настроим наш Git - зададим своё имя и email (эта информация будет использоваться в репозитории для отслеживания авторов изменений):

git config --global user.name "Alexey Goloburdin" git config --global user.email [email protected] git config --global core.pager 'less -r'

Теперь всё готово к созданию первого локального Git репозитория.

Создание репозитория


Переходим в терминале в директорию, в которой мы хотим создать репозиторий - директорию с исходными кодами нашего приложения - и инициализируем новый репозиторий:

git init

Добавляем все файлы в созданный репозиторий:

git add *

И делаем commit - то есть сохранение текущей версии репозитория:

git commit -m 'первая версия репозитория'

После атрибута -m вводится комментарий к коммиту - хорошей практикой является описание всех коммитов.

За жизнь


Самое время добавить немного магии теории - единственной и достаточной для продуктивной работы с Git. Все файлы в рабочем каталоге, в котором мы создали репозиторий, могут быть либо под версионным контролем, то есть фактически входить в репозиторий Git, либо быть неотслеживаемыми, то есть не входить в репозиторий. В нашем случае все файлы, присутствующие в данный момент в директории, мы добавили в репозиторий командой git add *, при этом если бы мы хотели добавить, например, только файлы с расширением html, мы могли бы внести их в репозиторий командой git add *.html.

Все отслеживаемые файлы могут находиться в трех состояниях - неизмененном (то есть с момента последнего коммита мы этот файл не трогали), измененном (с момента последнего коммита мы внесли изменения, но Git об этом еще не знает) или подготовленном к коммиту (это измененный файл, о котором мы рассказали Git). Таким образом, вот жизненный цикл файла в репозитории:

1. Добавление файла в репозиторий - файл имеет статус «неизмененный»
2. Файл изменен, но мы не сообщили об этом Git - файл имеет статус «измененный»
3. Мы сообщаем соответствующей командой Git об изменении файла - файл получает статус «подготовленного к коммиту»
4. Мы делаем коммит, после которого файл снова получает статус «неизменённого». Затем цикл повторяется.

При этом важно понимать, что все эти действия сейчас происходят локально на нашем компьютере, хранящем все версии репозитория, мы еще не производили синхронизацию с удаленным сервером Bitbucket.

Работа с Git


Итак, в данный момент мы имеем чистый репозиторий с одной версией. Внесем изменения в какой-то файл репозитория и подготовим файл к коммиту:

git add FILENAME

Команда git add не только добавляет новый файл к репозиторию, но и отслеживает изменения в уже присутствующих в репозитории файлах. Сделаем второй коммит:

git commit -m 'вторая версия, мы внесли офигенные правки в наш проект'

Конечно, совсем необязательно запоминать все файлы, в которых мы произвели изменения с последнего коммита для того, чтобы потом перечислить их в git add (то есть подготовить к коммиту). Есть два варианта. Первый: использовать "git add *" и затем "git commit", второй короче: использовать сразу одну команду "git commit -a". В обоих случаях Git переберет все файлы каталога и подготовит к коммиту все отслеживаемые файлы, но первый вариант также добавит в репозиторий новые файлы (созданные после последнего коммита), в то время как второй вариант их проигнорирует.

Удалить файл из репозитория, то есть перевести его из отслеживаемого в неотслеживаемый, можно командой:

git rm FILENAME

Просто удаление файла в директории, без указания Git не отслеживать его, приведет к попыткам Git найти этот файл, его статус в репозитории будет «изменён, но не закоммичен». Конечно, можно удалять файлы из директории проекта, не заботясь о ручном удалении их из Git репозитория по одному - вместо этого можно выполнить одну команду:

git add -u

Кстати, узнать текущий статус по репозиторию можно командой

git status

Просмотреть историю коммитов:

git log

Как правило, в любом проекте существуют файлы, отслеживать изменения которых нет необходимости (например, это могут быть файлы кэша) - их можно добавить в список исключений, находящийся по адресу /.git/info/exclude.

Синхронизация с Bitbucket

Как мы уже говорили, вся текущая работа с репозиторием происходила на локальном компьютере без подключения к серверу Bitbucket - пришло время синхронизироваться! Для этого нужно выполнить команды, которые сообщил нам Bitbucket после создания удаленного репозитория:
git remote add origin https://[email protected]/livedev/repositoryName.git git push -u origin --all
Первая команда подключит удаленный репозиторий, вторая зальет на него наш локальный репозиторий. Система спросит пароль для подключения к Bitbucket, после чего загрузит репозиторий на сервер - в успехе можно удостовериться в веб-интерфейсе Bitbucket. Теперь мы можем продолжать работу над проектом, сохранять файлы, делать коммиты - они будут сохраняться в локальном репозитории даже без подключения к Интернет. Проводить синхронизацию с удаленным сервером не обязательно при каждом коммите - все коммиты все равно зальются на сервер при выполнении команды git push. Если мы работаем в команде и коммиты на сервер делает кто-то кроме нас, то перед коммитом нужно сначала загрузить все изменения, которые произвели другие члены команды в репозитории на сервере, для этого используется команда git pull:
git pull origin master
Master здесь - это ветка репозитория, с которой мы работаем, их может быть несколько, аorigin - название соединения c Bitbucket. Таким образом, для заливки репозитория на сервер используется команда
git push origin master
а для обновления локального репозитория с сервера команда
git pull origin master
Вот и все!