Статьи

Введение в Git, часть 1

Git — это (распределенная) система контроля версий. Это что? Система контроля версий — это программное обеспечение, которое позволяет программисту отслеживать историю проекта и управлять ею, где таким проектом может быть один файл, набор файлов или целый проект с открытым исходным кодом, в котором участвуют несколько программистов со всего мира.

Различение «распределенных» означает, что нет центрального сервера, на котором живет исходный код и история проекта. Когда проект Git клонируется (слово «клон» — это слово Git для начальной проверки проекта), вы получаете всю историю проекта от текущего состояния вплоть до начала времен. Хранение всего проекта локально на вашем компьютере без координирования всего центрального сервера обеспечивает чрезвычайно быстрый поиск слияний, различий и журнала.

Некоторые из наиболее часто используемых систем контроля версий, о которых вы, вероятно, слышали, — это CVS и Subversion. В этом учебном курсе будет использован принцип «забудьте все, что вы знаете о CVS или Subversion». Как человек, который использовал все эти три системы в профессиональной сфере, я могу засвидетельствовать, что некоторые знания CVS или Subversion могут быть полезны при приближении к Git, но это не обязательно. Лучший способ изучить Git — это начать использовать Git для того, что такое Git.

Зачем использовать Git?

Это совершенно громоздкий вопрос. Если я только один человек, работающий над собственным сайтом, зачем мне беспокоиться о контроле версий? У меня довольно хорошая память, и я знаю, что другие не будут перезаписывать мой код.

Может быть, у вас есть набор файлов для веб-сайта, который вы разрабатываете для клиента, похожего на этот.

  sean @ beerhaus: ~ / Рабочая область $ ls
 images / templates / index.php.save1 index.php.save3
 js / index.php index.php.save2 index.php.save4 

Здесь index.php — ваш текущий файл, а index.php.save# — набор резервных копий с работы предыдущих дней.

Теперь вы редактируете index.php . Вы только что добавили довольно аккуратную функцию после запоздалого, но заслуженного момента вдохновения. Чтобы быть умным, вы делаете резервную копию этого файла с именем index.php.save5 . На следующий день вы возвращаетесь к работе над index.php и решаете, что новая функция со вчерашнего дня не будет работать, и удаляете ее из файла. Проходит несколько недель, и к этому времени вы сохранили index.php.save27 . Текущее состояние проекта довольно стабильно, поэтому вам больше не нужны предыдущие 27 сохраненных файлов, и вы удаляете их все.

Через несколько дней после очистки вы чувствуете, что эта функция из index.php.save5 заслуживает второго шанса, но теперь она исчезла навсегда. Конечно, у вас может быть несколько дополнительных резервных копий, и у вас может быть даже инструмент восстановления файлов. Но действительно ли это лучший способ управления вашим исходным кодом?

Проблема усугубляется, когда вы добавляете больше людей в ваш проект. Даже если над одним проектом работают два человека, некоторые непреднамеренно удаленные и перезаписанные файлы будут. Возможно, вы отправляете по электронной почте тарболы с исходным кодом взад и вперед, и вы можете искать и старые письма, чтобы получить архив с файлами, которые вы только что удалили. Удачи.

Это та часть, где 99 из 100 уроков, как и ожидалось, будут повторять ценную фразу «войти в Git».

Как использовать Git

Первый шаг в использовании Git — получить Git. Если вы используете различные Linux, это довольно просто. (Связанный факт: Git был изначально спроектирован и разработан для распределенной разработки на ядре Linux тем же человеком, который создал ядро, Линусом Торвальдсом.) Независимо от того, какой дистрибутив Linux вы используете, скорее всего, вам понадобится пакет, который вам понадобится «Мерзавец» или «мерзавец». Если вы используете Windows или Mac или просто хотите собрать Git из исходного кода, посетите страницу www.git-scm.com , чтобы узнать о вариантах загрузки и установки.

Создание хранилища

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

  sean @ beerhaus: ~ $ git config --global user.name "FirstName LastName"
 sean @ beerhaus: ~ $ git config --global user.email "your @ email" 

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

  sean @ beerhaus: ~ / $ mkdir new_project
 sean @ beerhaus: ~ / $ cd new_project /
 sean @ beerhaus: ~ / new_project $ git init
 Инициализированный пустой репозиторий Git в /home/sean/new_project/.git/ 

Теперь у вас есть пустой репозиторий Git, готовый к использованию. Если вы запустите список всех скрытых файлов в вашем новом каталоге, вы заметите, что скрытый каталог .git был создан:

  sean @ beerhaus: ~ / new_project $ ls -al
 всего 12
 drwxr-xr-x 3 Шон Шон 4096 2011-11-19 16:09.
 drwxr-xr-x 5 Шон Шон 4096 2011-11-19 16:09 ..
 drwxr-xr-x 7 Шон Шон 4096 2011-11-19 16:09 .git 

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

git init также будет работать, если у вас есть каталог с существующим исходным кодом. Просто войдите в свой каталог и запустите git init как я делал в этом примере.

Добавление / размещение файлов

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

Давайте создадим несколько файлов для отслеживания Git, начиная с файла конфигурации. Создайте файл config.php со следующим содержимым в выбранном вами редакторе:

 <?php $database = array( "driver" => "mysql", "host" => "locahost", "username" => "user", "password" => "pass", "database" => "new_project"); 

Как только вы сохранили файл как config.php мы можем запустить другую команду Git, git status .

  sean @ beerhaus: ~ / new_project $ git status
 # На ветке мастер
 #
 # Первоначальный коммит
 #
 # Неотслеживаемые файлы:
 # (используйте «git add <file> ...» для включения в то, что будет зафиксировано)
 #
 # config.php
 ничего не добавлено для фиксации, но есть неотслеживаемые файлы (используйте «git add» для отслеживания) 

Ветвь по умолчанию в Git называется master . Это та же идея, что и «транк» в других системах контроля версий. Ветвь — это просто линия развития, которую отслеживает Git.

Не отслеживаемые файлы — это файлы, которые существуют в вашем рабочем каталоге, но еще не отслеживаются Git, поскольку вы еще не сказали Git отслеживать их.

Вывод состояния git status также предоставляет полезные сообщения, такие как сообщение на одну строку ниже:

  (используйте «git add <file> ...» для включения в то, что будет зафиксировано) 

congif.php добавьте файл congif.php в список отслеживаемых файлов Git.

  sean @ beerhaus: ~ / new_project $ git add config.php 

Теперь, если вы снова запустите git status вы увидите, что изменилось.

  sean @ beerhaus: ~ / new_project $ git status
 # На ветке мастер
 #
 # Первоначальный коммит
 #
 # Изменения должны быть совершены:
 # (используйте "git rm --cached <file> ..." для удаления)
 #
 # новый файл: config.php
 # 

config.php теперь отслеживается Git, как вы можете видеть по изменению с «неотслеживаемого файла» на «новый файл».

С Git добавление файлов таким способом называется подготовкой. Промежуточная область — это шаг после добавления файла, но до его фиксации. Термин добавление не обязательно должен ссылаться на новый файл. Это также может означать набор изменений, внесенных в существующий файл, который будет включен в следующую фиксацию. Промежуточная область позволяет нам выбирать, какие файлы включать в коммит до его фиксации.

Фиксация файлов

Теперь вы можете зафиксировать файл. Фиксация файла — это то, как вы говорите Git записать «снимок» текущего состояния вашего проекта. Важно, чтобы с каждым коммитом вы предоставляли сообщение о коммите. Сообщение полезно, чтобы напомнить себе (или другим) позже, какова была цель каждого изменения. Вы должны держать это коротким, но информативным.

Самый быстрый способ предоставить сообщение о коммите — это использовать опцию -m с командой git commit . Если вы не -m опцию -m в команде, появится окно редактора, и вы сможете набрать там свое сообщение о коммите.

Чтобы настроить, какой редактор будет использоваться, вы можете запустить git config --global core.editor vim . В моем случае я использую vim, но подойдет emacs, pico или любой другой редактор.

  sean @ beerhaus: ~ / new_project $ git commit config.php -m "Начальная фиксация. Добавлен файл конфигурации."
 [master (root-commit) c1d55de] Первоначальный коммит.  Добавлен файл конфигурации.
  1 файл изменен, 7 вставок (+), 0 удалений (-)
  режим создания 100644 config.php 

Теперь, если вы снова запустите git status вы получите сообщение о том, что с момента последнего коммита изменений не было.

  sean @ beerhaus: ~ / new_project $ git status
 # На ветке мастер
 нечего коммитить (рабочий каталог чистый) 

Просмотр истории проекта

Команда git log — очень полезный инструмент для просмотра временной шкалы вашего проекта. Вы можете увидеть каждый коммит в деталях, включая дату и кто сделал коммит.

  sean @ beerhaus: ~ / new_project $ git log
 commit c1d55debc7be8f50e363df462f84672ad029b703
 Автор: FirstName LastName <ваш @ email>
 Дата: сб 19 ноября 16:45:35 2011 -0400

     Первоначальный коммит.  Добавлен файл конфигурации. 

Здесь следует отметить несколько вещей:

  1. Имя и адрес электронной почты — это информация, которую вы git config .
  2. Сообщение коммита — это сообщение, которое вы указали в первом коммите.
  3. За словом «commit» следует 40-значная шестнадцатеричная строка.

Строка из 40 символов шестнадцатеричных чисел известна как хеш коммита , в связи с криптографической хеш-функцией SHA1, используемой для ее генерации. Вся информация, связанная с фиксацией, хранится в объекте фиксации. Хеш коммита — это выход хеш-функции, применяемой к содержимому объекта, и затем используется как уникальная ссылка на этот конкретный коммит.

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

  sean @ beerhaus: ~ / new_project $ git log c1d55debc7be8f50e363df462f84672ad029b703 

Чтобы увидеть, какие файлы были задействованы в --stat , вы можете использовать параметр --stat :

  sean @ beerhaus: ~ / new_project $ git log --stat c1d55debc7be8f50e363df462f84672ad029b703 

Сообщение журнала теперь содержит:

  config.php |  7 +++++++
  1 файл изменен, 7 вставок (+), 0 удалений (-) 

Просмотр Commit Diffs

Теперь давайте внесем некоторые изменения в config.php , чтобы увидеть, что может предложить git diff . Начните с простого изменения; измените имя пользователя базы данных на «Foo». Когда вы сохраните файл и запустите git status , на этот раз вы увидите, что config.php находится в измененном состоянии:

  sean @ beerhaus: ~ / new_project $ git status
 # На ветке мастер
 # Изменения не подготовлены для коммита:
 # (используйте «git add <file> ...» для обновления того, что будет зафиксировано)
 # (используйте "git checkout - <file> ...", чтобы отменить изменения в рабочем каталоге)
 #
 # изменено: config.php
 #
 изменения не добавлены в коммит (используйте «git add» и / или «git commit -a») 

Чтобы увидеть, что было изменено, используйте git diff .

  sean @ beerhaus: ~ / new_project $ git diff
 diff --git a / config.php b / config.php
 индекс ab6e11d..02d30f8 100644
 --- a / config.php
 +++ b / config.php
 @@ -2,6 +2,6 @@
  $ database = array (
      "driver" => "mysql",
      "host" => "locahost",
 - "username" => "user",
 + "username" => "Foo",
      "пароль" => "пройти",
      "database" => "new_project"); 

Ваши изменения довольно легко обнаружить. Ведущий минус говорит вам, что строка была удалена, а начальный плюс говорит вам, что линия была добавлена.

Команда git diff по умолчанию сравнивает текущее состояние вашего проекта с предыдущим коммитом. Вы можете передавать аргументы в команду git diff , такую ​​как хеш коммита или специальный указатель HEAD , который ссылается на самый последний коммит вашего текущего проекта.

Идите вперед и зафиксируйте измененный файл, чтобы вы могли сравнить некоторые хеши коммитов.

  sean @ beerhaus: ~ / new_project $ git commit -am "Изменено имя пользователя базы данных на Foo."
 [master e69a7f9] Изменено имя пользователя базы данных на Foo.
  1 изменение файлов, 1 вставка (+), 1 удаление (-) 

Когда вы запустите git log этот раз, вы увидите график изменений.

  sean @ beerhaus: ~ / new_project $ git log
 commit e69a7f9b3b55c116a5c2edf730cd03df7e093eda
 Автор: FirstName LastName <ваш @ email>
 Дата: вс 20 ноября 14:16:43 2011 -0400

     Изменено имя пользователя базы данных на Foo.

 commit c1d55debc7be8f50e363df462f84672ad029b703
 Автор: FirstName LastName <ваш @ email>
 Дата: сб 19 ноября 16:45:35 2011 -0400

     Первоначальный коммит.  Добавлен файл конфигурации. 

Когда вы запускаете git diff с использованием двух хэшей коммитов, результат будет идентичен разнице, которую вы просматривали до последнего коммита.

  sean @ beerhaus: ~ / new_project $ git diff c1d55debc7be8f50e363df462f84672ad029b703 e69a7f9b3b55c116a5c2edf730cd03df7e093eda
 diff --git a / config.php b / config.php
 индекс ab6e11d..02d30f8 100644
 --- a / config.php
 +++ b / config.php
 @@ -2,6 +2,6 @@
  $ database = array (
      "driver" => "mysql",
      "host" => "locahost",
 - "username" => "user",
 + "username" => "Foo",
      "пароль" => "пройти",
      "database" => "new_project"); 

Попробуйте еще раз, используя опцию --color . Это делает изменения немного легче увидеть.

Резюме

Привыкнув к Git и его циклу редактирования файлов, git add и git commit , вы никогда не будете оглядываться назад на дни использования файловых резервных копий или функции отмены вашего любимого редактора в качестве замены для правильного контроля версий. В этой статье я показал вам основные команды, которые вам понадобятся для начала работы с Git. Другие темы, включая ветвление, слияние и удаленные репозитории, будут следовать.