На сегодняшний день git – наиболее совершенный способ работы с версиями проектов с открытым кодом. Его популярность объясняется просто – для начала работы совершенно не обязательно изучать систему полностью, достаточно освоить базовый набор команд, чтобы пользоваться преимуществами этого проекта. Со временем его знание будет расширяться, а пока давайте приступим к изучению необходимого минимума.
Git – распределенная система хранения контроля версий разрабатываемого программного обеспечения. Она отличается от многочисленных аналогов возможностью сохранять информацию в репозитории на жестком диске, эффективно отслеживать любые сделанные изменения, откатываться на один или несколько шагов назад, если в этом возникнет необходимость.
Код в системе Git можно хранить не только локально. Она позволяет выгружать папки с файлами на так называемые хостинги репозиториев – сайты GitHub или Bitbucket. Благодаря этому над одним проектом может работать неограниченное количество программистов. Причем система фиксирует все изменения и дает возможность моментально вернуться к наиболее удачной версии для ее совершенствования.
Для того, чтобы установить git на рабочий компьютер, нужно сделать несколько простых действий. Для разных операционных систем это выглядит так:
sudo apt-get install git
brew install git
Несмотря на то, что можно использовать графический интерфейс, изучите команды. Это сильно расширит ваши возможности.
После установки git нам нужно задать имя пользователя и адрес электронной почты – таким образом каждый участник проекта узнает, кто автор изменений. Сделать это очень просто, открываем систему и набираем следующие команды:
git config --global user.name "My Name"
git config --global user.email myEmail@example.com
На самом деле, возможностей настроить систему намного больше, но сейчас мы сосредоточены лишь на тех опциях, которые необходимы для начала работы.
Как мы рассказывали ранее, принцип git заключается в том, что история изменений сохраняется прямо в папке проекта. Чтобы инициализировать работу системы, нужно открыть терминал и, зайдя в папку проекта, запустить команду init. Она подключит проект именно к этой папке и создаст скрытую директорию .git, в которой и будет храниться репозитарий с историей изменений и нашими настройками.
На рабочем столе создаем папку git_exercise. Для этого в окне терминала вводим команды:
$ mkdir Desktop/git_exercise/
$ cd Desktop/git_exercise/
$ git init
В ответ система должна выдать что-то похожее на это:
Initialized empty Git repository in /home/user/Desktop/git_exercise/.git/
Если получено такое сообщение, это значит, что репозитарий создан, но пока еще пуст. Теперь создаем текстовый файл hello.txt и сохраняем его в директории git_exercise.
Чтобы узнать, что происходит в нашем созданном репозитарии – внесены ли изменения, насколько актуальна информация и т.д., воспользуемся командой git status
.
Это одна из важнейших команд, так как система отслеживает изменения, а с ее помощью мы узнаем о результатах этого отслеживания. Если мы наберем git status в терминале, то система должна выдать следующее:
$ git status
On branch master
Initial commit
Untracked files:
(use "git add ..." to include in what will be committed)
hello.txt
Этот набор сообщений говорит о том, что git зафиксировал появление файла hello.txt, однако он не отслеживается. Для того, чтобы начать его отслеживание, его следует надлежащим образом подготовить.
Фактически git – это тетрадь, в которую вносятся записи об изменениях. Однако система самостоятельно не может решить, какие именно из них следует фиксировать. Для этого мы должны подготовить файл к коммиту – указать системе, что именно мы хотим отслеживать с помощью системы – файл полностью, его часть или даже отдельные строки.
Чтобы добавить нужные части, воспользуемся командой add. С ее помощью мы можем внести столько отслеживаемых частей файла, сколько нам необходимо. После того, как мы создали этот своеобразный шаблон отслеживания, фиксируем его командой commit. Теперь система знает, что нужно отслеживать.
В нашем примере речь идет о файле hello.txt. Добавим его:
$ git add hello.txt
Если мы хотим добавить к списку отслеживания все содержимое директории, набираем:
$ git add -A
Проверяем статус и получаем ответ:
$ git status
On branch master
Initial commit
Changes to be committed:
(use "git rm --cached ..." to unstage)
new file: hello.txt
Он означает, что система понимает, что мы добавили файл hello.txt к списку отслеживания. На этом этапе мы можем удалить его из него или модифицировать. Если все устраивает, мы должны зафиксировать наше решение и изменить статус файла из подготовленного на отслеживаемый.
Итак, мы подготовили наш файл hello.txt к отслеживанию. Теперь мы можем его коммитить. Коммит – это состояние репозитария в определенный момент времени, иными словами – картинка, снимок определенных нами во время подготовки параметров.
Для того, чтобы зафиксировать изменение, нужно его создать – ранее мы сделали это, подготовив файл с помощью команды git add. Значит, можно коммитить:
$ git commit -m "Initial commit."
Эта команда создаст коммит, где будут отображены все изменения из области подготовки. Ключ -m и сообщение «Initial commit.» создает описание всех изменений, которые мы включили в коммит.
Правила хорошего тона разработчиков гласят о том, что не нужно лениться делать коммиты, а делать их как можно чаще.
Коммит, созданный нами, хранится в репозитарии, привязанном к конкретной папке на нашем компьютере, т.е. является локальным. Это полезно, если мы работаем над проектом самостоятельно. Однако в большинстве случаев возникает необходимость обеспечить доступ к результатам работы или доставить код на сервер, где он будет выполняться.
Для загрузки данных в удаленный репозитарию сначала нужно к нему подключиться. В нашем примере мы используем адрес https://github.com/tutorialzine/awesome-project, однако пользователь может создать собственный удаленный репозитарий на GitHub, BitBucket или другом подобном сервисе. Это занимает некоторое время, однако в дальнейшем полностью себя оправдывает, тем более, что подобные службы имеют пошаговые инструкции для правильно выполнения нужных действий.
Для того, чтобы связать созданный нами локальный репозитарий с удаленным, выполним такую команду:
# This is only an example. Replace the URI with your own repository address.
$ git remote add origin https://github.com/tutorialzine/awesome-project.git
Первая строка напоминает нам, что URI репозитария, который приведен в примере, нужно изменить на свой.
Иногда бывает так, что проект имеет несколько удаленных репозитариев – в таком случае каждому из них присваивается собственное имя. Главный репозитарий принято называть origin.
Теперь, когда у нас в локальном репозитарии создан коммит и мы подключились к удаленному, можем отправить его на сервер. Мы это будем делать каждый раз, когда хотим обновить данные в удаленном репозитарии.
Отправка коммита осуществляется с помощью команды push, которая имеет два параметра - имя удаленного репозитория (в нашем случае origin) и ветку, в которую необходимо внести изменения (master — это ветка по умолчанию для всех репозиториев).
$ git push origin master
Counting objects: 3, done.
Writing objects: 100% (3/3), 212 bytes | 0 bytes/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To https://github.com/tutorialzine/awesome-project.git
* [new branch] master -> master
Если мы все сделали правильно, то отправленный файл hello.txt на удаленном сервере мы можем увидеть с помощью браузера. Важный момент – некоторые сервисы для отправки изменений могут требовать дополнительной аутентификации.
Если у других пользователей возникла необходимость клонировать удаленный репозитарий, они могут получить полностью работоспособную копию при помощи команды clone:
$ git clone https://github.com/tutorialzine/awesome-project.git
GitHub автоматически создаст новый локальный репозитарий в виде удаленного на собственном сервере.
В случае, если другим пользователям нет необходимости делать клон удаленного репозитария, а нужно просто получить информацию об изменениях, это можно сделать с помощью команды pull:
$ git pull origin master
From https://github.com/tutorialzine/awesome-project
* branch master -> FETCH_HEAD
Already up-to-date.
Она скачивает новые изменения. Так как мы ничего нового не вносили с тех пор, как клонировали проект, изменений, доступных к скачиванию, нет.
Так как над работой над проектом может принимать участие несколько разработчиков, принято вносить изменения каждым из них в свою копию оригинальной версии кода. Это позволяет сохранять рабочий вариант без изменений до тех пор, пока не будет принято решение слить все версии в одну.
Каждая такая копия проекта называется веткой – она изолирована от других и имеет собственную историю.
Наличие веток позволяет обезопасить проект, сравнивать различные версии, вести параллельную разработку.
Git имеет встроенную функцию .gitignore, с помощью которой мы можем предотвратить случайное попадание в git add ненужных файлов, папок и директорий. Очень часто в такой перечень попадают следующие данные:
Работает функция .gitignore
очень просто:
*.log
build/
node_modules/
.idea/
my_notes.txt
Слэш обозначает игнорирование директорий и всего их содержимого, звездочка – шаблон.
Итак, мы вкратце познакомились с основными функциями git
. Они далеко не исчерпывают все возможности этой системы и оставляют большой простор для самосовершенствования.