10 советов и приемов для начинающих по использованию Git
Существует тенденция, благодаря которой новые технологии становятся катализатором внедрения в основное русло технологического развития конкретных парадигм разработок и лучших практических приемов. Назовем этот феномен "Can't Buy Me Love" ("Любовь не купить") в честь фильма 80-х годов, в котором один школьный умник для повышения собственной популярности нанимает понравившуюся ему девушку для того, чтобы она изображала его подружку. Возможно, что последним примером такого феномена является появление и использование Git - системы управления версиями, имеющей открытый код и существенно повышающей уровень формализации при управлении версиями исходного кода. Я в течение нескольких лет пользовался другими решениями, такими как системы контроля версий CVS и Subversion, но Git, как средство управления исходным кодом, более естественно вписался в мой технологический процесс.
И, хотя подобно многим другим технологиям, не требуется сразу много знать для начала работы с Git, в нем есть так много возможностей и вариантов, что это ошеломляет начинающих. Когда я стал лучше разбираться в системе Git, я составил список советов и приемов, которые помогли мне лучше управлять моими Git проектами. В этой статье я хочу рассказать от тех из них, которые, как я думаю, будут наиболее полезны для новичков.
1. Добавление файлов одновременно с выполнением операции commit
В Git вы должны сначала явно подтвердить ваш запрос на добавление в репозитарий новых файлов, версии которых будут в дальнейшем отслеживаться (tracked files), и только потом фиксировать (командой commit) последние изменения. Поэтому типичная последовательность команд при подтверждении изменений выглядит следующим образом:
%>git add . %>git commit -m "Latest commit message"
Сохраняем предыдущее состояние и с помощью флага -a выполняем одновременное добавление файлов и подтверждение изменения:
%>git commit -a -m "Latest commit message"
Однако в большинстве случаев вам не следует пользоваться таким сокращением. Далее в этой статье я приведу вам, по крайней мере один пример, показывающий, почему этого не следует делать (по-видимому, это совет 5 – прим.пер.).
2. Сохраняем команды вместе с Git - алиасами
Подобно многим популярным утилитам, работающим из командной строки, Git позволяет сохранять пользовательские настройки в конфигурационном файле, имеющим название .gitconfig. В этом файле вы обычно указываете ваше имя и адрес электронной почты, поскольку это связано с вашим взаимодействием с репозитарием, но вы также можете определить здесь алиасы, которые сэкономят вам время. Например, в моем файле .gitconfig содержатся несколько алиасов для наиболее часто используемых команд:
[alias] st = status co = checkout cm = commit pom = push origin master
Если случится, что забыли созданные вами алиасы, вы можете с помощью следующей команды быстро просмотреть настройки вашего конфигурационного файла:
%>git config -l
3. Выборочная подготовка файлов к выполнению операции commit
Иногда вы можете работать с несколькими файлами одновременно, но при выполнении ближайшей операции commit хотите добавить в репозитарий только некоторые из них. Для того, чтобы это сделать, вы можете воспользоваться интерактивной операцией добавления. Например, предположим, я создал два новых файла, ShopController.php и ForumController.php, но хочу добавить и зафиксировать (с помощью команды commit) добавление только первого файла. Я могу запустить процедуру интерактивного добавления, указав параметр -i для команды git add:
%>git add -i
В ответ вы получите меню, в котором вам будет предложено выбрать один из нескольких вариантов:
*** Commands *** 1: [s]tatus 2: [u]pdate 3: [r]evert 4: [a]dd untracked
5: [p]atch 6: [d]iff 7: [q]uit 8: [h]elp
Выбрав вариант 4, вы можете интерактивно указать, какие файлы вы хотите добавить:
What now> 4 1: application/controllers/ForumController.php
2: application/controllers/ShopController.php Add untracked>>
4. Игнорирование файлов и директорий с помощью .gitignore
Самое первое, что мне следует сделать после инициализации нового Git репозитория, это - создать файл .gitignore. Файл .gitignore используется для того, чтобы отфильтровывать те файлы и каталоги, изменение которых вы не хотите отслеживать в Git репозитарии. Когда, например, работа ведется над новым проектом Zend Framework, я обычно не оправляю в репозитарий проектную документацию, изображения, предназначенные для показа на сайте, а также файл, имеющий имя notes.txt, подразумевается, что мой файл .gitignore выглядит следующим образом:
docs public/images notes.txt
5. Удаление из списка зафиксированных новых только что добавленных файлов
В процесс разработки вы можете забыть добавить в ваш файл .gitignore имена тех файлов, которые только что создали, но не хотите добавлять в ваш репозитарий. Вы можете с помощью команды rm удалить эти файлы из списка изменений, которые были уже зафиксированы (это действие называется unstaging или удаление файла из группы индексируемых файлов):
%>git rm --cached schema-notes.txt
После того, как эта команда будет выполнена, вы можете добавить эти файлы в ваш файл .gitignore и снова вернутся к выполнению операции commit.
6. Просмотр содержимого предыдущих версий зафиксированных файлов
Мне часто бывает нужно просмотреть более ранние версии файла уже после того, как я внес изменение в текущей версии и не восстанавливать предыдущие версии. Вы можете легко сделать это с помощью команды show, добавив аргумент, указывающий на файл:
%>git show HEAD^:application/controllers/AboutController.php
Символ "^" указывает количество предыдущих версий, на которое при просмотре файла надо вернуться назад (число шагов "отката" -прим.пер.). Таким образом, приведенный выше пример команды покажет предыдущую версию файла AboutController.php. Если вы хотите посмотреть на три версии назад, вы должны использовать три символа "^", например:
%>git show HEAD^^^:application/controllers/AboutController.php
В качестве альтернативы вы можете при указании ссылки на файл воспользоваться хэш значением операции commit. Например, если вы хотите просмотреть содержимое AboutConroller.php в том виде, как оно было перед пятью последними изменениями, вы можете выполнить команду git log и получить хеш значение, а затем использовать первые пять символов этого хеш значения для просмотра содержимого файла:
%>git show 23aa985:application/controllers/AboutController.php
7. Редактирование ваших последних зафиксированных сообщений в журнале
Я приверженец правильной орфографии, но в своей спешке зафиксировать (с помощью команды commit) последние изменения я могу случайно набрать в своем сообщении одну или пару неверных букв. Вы легко можете легко отредактировать самые последние зафиксированные сообщения с помощью команды amend:
%>git commit --amend
Исполнение этой команды позволит вам загрузить в текстовый редактор самое последнее зафиксированное (с помощью команды commit) сообщение и вы сможете отредактировать сообщение и сохранить исправленный вариант.
8. Сохранение текущего состояния без фиксации изменений
Случайное прерывание вашего обычного процесса программирования является неизбежным и часто ставит вас в положение, когда вы не совсем готовы вносить в репозитарий изменения, а вам вдруг необходимо что-то исправить и зафиксировать, что не связанно с текущей работой. Вы можете сохранить ваши текущие изменения с помощью команды stash, это позволит вам вернуться к предыдущей точке фиксации, после чего вы можете сделать и зафиксировать (с помощью команды commit) другие изменения. Затем вы можете вернуться к сохраненному состоянию. Например, предположим, я работал на проектным документом README и вдруг обнаружил вопиющую орфографическую ошибку. Я могу сохранить мои текущие изменения следующим образом:
%>git stash save
Если я открою документ README заново, я увижу, что новый раздел исчез, поскольку я вернулся к предыдущей точке фиксации. Затем я могу исправить орфографическую ошибку и зафиксировать (с помощью команды commit) изменения. Затем выполню следующую команду, чтобы вернуться к моему исходному состоянию:
%>git stash pop
9. Просмотр вашего репозитария
Есть немало веб-интерфейсов, предназначенных для просмотра Git репозитория, но знаете ли вы о том, что один из них, называемый instaweb, интегрирован в дистрибутив Git? Для того, чтобы с помощью браузера подробно рассмотреть содержимое репозитария, выполните следующую команду:
%>git instaweb --httpd apache2
С помощью переключателя —httpd передается параметр apache2, указывающий Git, что на данной машине работает веб сервер Apache. По умолчанию это - lighthttpd, хотя поддерживаются также и несколько других серверов.
10. Находим причину проблемы
Иногда кто-нибудь из команды (но не вы, конечно) может добавить в репозитарий не совсем отлаженный код и испортить ваш билд. Естественно, вы захотите, чтобы кто-то взял на себя вину за эту проблему, но кто внес ошибку? Используйте команду blame для того, чтобы это узнать:
%>git blame application/controllers/AboutController.php
23aa9852 (Jason Gilmore 2010-06-03 12:34:04 -0400 11) public function indexAction()
23aa9852 (Jason Gilmore 2010-06-03 12:34:04 -0400 12) { 0e9e9f49 (Jason Gilmore 2010-06-03 13:32:47 -0400 13)
echo "Missing semicolon" 23aa9852 (Jason Gilmore 2010-06-03 12:34:04 -0400 14) }