Git для начинающих.
"...я Subversion даже трехметровым багром трогать не буду."
— Linus Torvalds
- git используется во многих крупных проектах: Linux kernel, KDE и многих других. Изначально git написал Linus Torvalds.
- Чтобы лучше понять надо ли вам использовать git, лучше послушать самого Линуса Торвальдса - о GIT на Google Talks (3 мая 2007)
- Быстро вникнуть в git можно, изучив эту страничку- http://rogerdudler.github.com/git-guide/ (по-русски - http://rogerdudler.github.com/git-guide/index.ru.html)
- Дальше послушать - "Getting Git" by Scott Chacon
- Про Git на пальцах (для переходящих с SVN)
- Читать книжку Pro Git (лучше спокойно и переваривая)
- Ещё про то, как работать с отличным и бесплатным GUI - SourceTree - http://blog.sourcetreeapp.com/2012/08/01/smart-branching-with-sourcetree-and-git-flow/.
Создание нового репозитория
Создание нового репозитория – это наверное первая из задач, с которой сталкивается любой разработчик. Создаём открытый репозиторий, с которым смогут работать другие люди. Предположим, что у вас есть некий сервер example.com и ваша рабочая машина.
Для начала вам необходимо установить git. Сделать это можно как вручную скомпилировав его из исходных кодов, так и установив с помощью менеджера пакетов (скачать с http://git-scm.com/).
Далее вам надо создать репозиторий. Предположим что вы будете хранить все git-репозитории в /var/git:
cd /var/git mkdir example.git cd example.git git init --bare
Теперь у вас есть пустой git-репозиторий. Это, собственно говоря, все команды, которые требуется выполнить на сервере.
Теперь идем на вашу рабочую машину и пишем:
git init git remote add origin ssh://username@example.com/var/git/example.git touch changelog git add changelog git commit -a -m"Initital commit" git push origin master
Этими командами мы создали новый репозиторий, связали его с основной веткой example.git, закомитили туда файл changelog и отослали это на сервер. В результате выполнения этих команд, вы должны увидеть чтото примерно такое:
Counting objects: 3, done. Writing objects: 100% (3/3), 224 bytes, done. Total 3 (delta 0), reused 0 (delta 0) To ssh://username@example.git/var/git/example.git * [new branch] master -> master
Получение и оправка репозитория
Разумеется, после создания репозитория разумно узнать “а как же получить эти данные на свой компьютер?”.
Для данной операции используется команда clone. Она создает полную копию удаленного репозитория у вас. Под полной копией понимается именно полная копия, со всеми ветками, удаленными файлами и т.д.
git clone ssh://username@example.com/var/git/имя-репозитория
Разумеется, /var/git может меняться, в зависимости от того, где располагаются файлы данного репозитория на удаленной машине.
Обновление данных
С таким локальным репозиторием можно работать долгое время, однако, когда-то у вас все же возникнет необходимость передать сделанные вами изменения в удаленный репозиторий, чтобы результатами вашего труда могли воспользоваться другие участники разработки, и получить из удаленного репозитория новую версию. Для этого служат команды pull и push.
git pull
Данная команда получает обновленную версию из удаленного репозитория, при этом она проверяет на наличие различных проблем при объединении репозиториев и сообщает об этом.
git push
Данная команда целиком передает все сделанные вами изменения, уже закомиченные в локальный репозиторий, в удаленный репозиторий. Для передачи тегов необходимо использовать аргумент –tags
git push --tags
Базовые операции
Для базовой работы с любой системой контроля версий требуется не особенно большой набор операций: добавление файла в репозиторий, удаление файла из репозитория, комит изменений в репозиторий, отмена незакомиченных изменений и получение списка изменений.
Добавление списка файлов в комит:
git add file1 file2 ... fileN
Добавление всех недобавленных файлов в комит:
git add -a
Удаление файла из комита:
git rm file1 file2 ... fileN
Удаление файла из комита и с жесткого диска:
git rm -f file1 file2 ... fileN
Комит в локальный репозиторий (надо отметить, что в таком случае закомитятся только файлы, которые были обработаны с помощью git add/rm):
git commit
Комит всех изменений в локальный репозиторий:
git commit -a
Отмена всех изменений, сделанных в дереве, до состояния, которое было при последнем комите в локальный репозиторий (очень опасная команда, подумайте прежде чем пользоваться ею):
git reset --hard
Создание дифа относительно последнего комита:
git diff
Использование веток
Рано или поздно в любом проекте возникает ситуация, когда требуется заморозить изменения, но продолжать работать, а на замороженные изменения накладывать только баг-фиксы. Для этой цели служат ветви (branch)
В гите можно создать ветку от любого места. Для создания ветки от основного дерева надо выполнить следующую команду:
git checkout --track -b name_of_newbranch origin/master
В результате этой команды вы увидите примерно такое сообщение
Branch name_of_newbranch set up to track remote branch refs/remotes/origin/master. Switched to a new branch "name_of_newbranch"
Это значит, что в локальном репозитории у вас создалась новая ветка.
Если в этой команде заменить origin/master на origin/remote_branch_name то вы создадите ветку от другой ветки.
Чтобы ваша ветка была видна всем, ее требуется пропихнуть в удаленный репозиторий. Делается это так:
git push origin local_branch_name:remote_branch_name
Разумеется, надо также уметь и получать ветки в свое распоряжение
git branch local_branch_name origin/remote_branch_name git checkout local_branch_name
В результате вы получите искомую ветку после следующего сообщения
Switched to branch "local_branch_name"
Работа с тегами
Как правило, кроме веток разработчики используют теги – чтобы запомнить состояние кода в какой-то момент. Тег – это своеобразный слепок, точно идентифицирующий состояние кода. Гит умеет работать с подписанными GPG тегами и с неподписанными. Здесь я рассмотрю только неподписанные теги.
Для создания такого тега необходимо выполнить команду
git tag
Чтобы убрать тег необходимо выполнить
git tag -d
Для того, чтобы тег стал виден всем, необходимо отправить его в удаленный репозиторий
git push --tags
Чтобы получить версию с конкретного тега необходимо создать от него локальную ветку и расчекаутить эту ветку:
git fetch origin tag git branch git checkout
Разумеется, в будущем эту ветку можно будет сделать глобальной и выслать в удаленной репозиторий.
Настройка git
Для ускорения некоторых операций и увеличения удобства работы можно провести пару настроек:
Настройка цветного вывода:
git config --global color.ui "auto"
Настройка имени пользователя и почтового адреса (между прочим, это хороший тон):
git config user.name "FirstName LastName" git config user.email "user@example.com"
Ускоряем дифы и отменяем ограничение на количество потоков упаковки при push:
git config --global diff.renamelimit "0" git config --global pack.threads "0"
Вместо заключения
Git – очень мощная и удобная система контроля версий. Для нее существует несколько GUI утилит, которые могут облегчить работу, несколько веб интерфейсов для мониторинга текущего состояния. В последнее время все большее кол-во проектов переходят на использование git, и это показатель того, что git успешно развивается и соответствует последним требованиям в области систем контроля версий.
Большое кол-во документации по использованию git можно найти в сети, в том числе и на официальном сайте
almix
Разработчик Loco, автор статей по веб-разработке на Yii, CodeIgniter, MODx и прочих инструментах. Создатель Team Sense.
Вы можете почитать все статьи от almix'а.
- 4 Git. Переименовал проект, как изменить путь URL к удалённому репозиторию на github в config'е локального репозитория? (30.03.2013)
- 3 Git. Использую GIT GUI. SourceTree для Mac. (20.03.2013)
- 2 Yii + Git (github) на Mac. (24.03.2013)
- 1 Git для начинающих. (12.04.2013) ← вы тут
- 0 Лишь этот голос. Наталья Ром – Хочу говорить крaсиво! Техники речи. Техники общения (23.07.2014)
- 0 Путешественнику на заметку: Необходимые выражения на разных языках (28.11.2014)
- 0 Synology и VPN подключение удалённого компьютера. (31.05.2014)
- 0 Браузер не открывает страницы, а скайп и icq работают. Что делать? (12.05.2014)
- 0 Если на флешке пропали файлы (07.02.2014)
- 0 Как сменить passphrase для ключей с помощью ssh-keygen (31.01.2014)
- 0 Ошибка при выполнении команды grunt после обновления OS X 10.9: Bus error: 10. Перестал работать grunt (07.11.2013)
- 0 Регулярные выражения в PHP (12.04.2014)
- 0 Git удаление файла или папки из истории; игнорирование директории (07.11.2013)
- 0 Как сделать потоковое видео на сайте. (24.10.2013)
- 0 Защитить сайт или определённую папку паролем с помощью .htaccess (27.05.2013)
- 0 Удаление папок subversion (.svn) из проекта в Windows (22.03.2013)
- 0 Гугл закрывает Google Reader (17.03.2013)
- 0 Сброс пароля для root в mysql установленном через Denwer в Windows (14.03.2013)
- 0 Создание нового репозитория на Github, перенос локального репозитория и обновление удалённого через командную строку (30.03.2013)
- 0 Git "command not found" после обновления OS X до Mountain Lion (20.03.2013)
- 0 Использование веток (branches) в Github при разработке и доработке кода. Как делать pull request автору репозитория. (20.03.2013)
- 0 Полезные команды для вебразработчика (20.11.2017)
- 0 Склейка URL c www, 301 редирект с WWW и без WWW. Один ли сайт? Унифицированный Root (04.09.2013)
- Как включить SSL и сделать редирект на HTTPS. На примере Opencart 2 (03.12.2017)
- Для владельцев барбершопов (01.11.2017)