Система контроля версий Git

В этом уроке вы узнаете, что такое система контроля версий, и научитесь пользоваться системой контроля версий git для хранения кода ваших программ. Мы создадим первый локальный репозиторий и научимся пользоваться простыми командами: git status, git add, git commit, git checkout.

План урока

  1. Что такое система контроля версий
  2. Установка системы контроля версий Git
  3. Основные команды для работы с Git

### Что такое система контроля версий?

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

Чтобы избежать подобных ситуаций, программисты придумали системы контроля версий. А потом Линус Торвальдс придумал git.

А чуть раньше Линус Торвальдс придумал Линукс

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

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

Фото-архив

Сохранения называются комитами (от англ. слова commit, совершать).

Установка git

Для установки git его необходимо скачать с сайта git-scm.com.

Где качать git для Windows

Как именно скачать программу вы, надеюсь, разберётесь, а во время установки обратите внимание на вот эти шаги:

Установка git

Во-первых, отметьте галочку On the Desktop, чтобы git сделал иконку на рабочем столе.

Установка git (продолжение)

Во-вторых, на шаге интеграции git с Windows, выберите второй пункт Use Git from the Windows Command Prompt.

Теперь, когда мы встроили наш git в командную строку Windows, можем запустить её и набрать там git --version. И git покажет нам свою версию.

Проверяем git

Настройка git

Давайте немного настроим git, указав данные разработчика. Без этого мы не сможем делать сохранения в нашей машине времени, т.к. не понятно будет, кто эти сохранения хочет сделать. Укажите git-у своё имя и email с помощь этих команд:

git config --global user.name "Name"
git config --global user.email email@email.com

Лучше всего вместо Name указать ваши имя и фамилию латинскими буквами (транслитом), например Vadim A. Venediktov, а в качестве email-а указать ваш персональный email.

Основные команды git

Для каждого проекта (каждой программы) в git предполагается создавать отдельный репозиторий — хранилище, которое хранит код вашей программы и позволяет работать с изменениями, которые в него вносились за всё время работы над ней.

Давайте создадим наш первый репозиторий и положим в него какую-нибудь программу. Для этого откройте консоль и зайдите в папку второго урока:

cd c:\rubytut2\lesson2

git init

Допустим мы хотим создать программу, которая кидает кубик, то есть произвольно выбирает число от 1 до 6. Наша программа будет называться dice (игральные кости). Для того, чтобы создать репозиторий с таким названием нам необходимо набрать в консоли

git init dice

Эта команда создаст в текущей папке папку dice, в которой подготовит всё для хранения новой программы. Все служебные файлы она положит в папку dice\.git (вам необходимо настроить просмотр скрытых файлов в Windows, если вы хотите посмотреть её содержимое).

git status

Зайдём в наш репозиторий:

cd dice

И посмотрим его состояние с помощью команды git status

git status

Так как наш репозиторий пустой, мы увидим надпись nothing to commit. Давайте создадим каких-нибудь файлов. Для этого откройте нашу папку dice в качестве проекта в RubyMine. Как открывать проекты вы уже знаете. Возможно, вам понадобится обновить структуру файлов с помощью кнопки Refresh.

После открытия проекта в RubyMine создайте новый файл dice.rb, в котором и будет находиться наша программа «Кубики». RubyMine уже давно понял, что мы решили хранить нашу программу в git-репозитории и предлагает нам добавить туда новый файл dice.rb.

RubyMine от JetBrains спрашивает: Добавлять ли файл?

Давайте пока откажемся. Сделаем всё руками, чтобы лучше понять процесс. Сперва напишем нашу простенькую программу в файле dice.rb:

puts rand(6) + 1

Снова переключимся на окно консоли и снова наберём git status:

git status: Так выглядят новые файлы

Появилось что-то новое. git увидел наш созданный файл dice.rb и служебную папку .idea нашего любимого RubyMine и показывает их нам в качестве кандидатов на добавление в репозиторий.

Файл .gitignore

Некоторым файлам не место в репозитории. Вы должны чётко понимать, какой из файлов (попавших в вашу рабочую папку) является частью вашей программы, а какой нет. В нашем случае всё просто: в файле dice.rb будет непосредственно код нашей небольшой программки, а файл .idea — служебный, его создаёт RubyMine для каждого проекта и он не содержит никакой информации о том, как программа должна работать. Его в репозиторий добавлять не нужно.

Для того, чтобы сказать git-у, что какой-то файл (или папка в нашем случае) нам не нужен, его необходимо добавить в список игнорируемых файлов. Этот список хранится в файле .gitignore.

Создайте с помощью RubyMine в вашем проекте файл .gitignore (внимание, обязательно с точкой). И напишите в нём одну строку

.idea

Всё, теперь git будет игнорировать эту служебную папку (убедитесь, набрав git status) и мы можем приступать к добавлению нужных файлов в репозиторий.

git add

Чтобы git понимал, какие файлы принадлежат проекту, их надо добавить с помощью команды git add. Давайте для начала добавим наш файл .gitignore (да, его тоже нужно добавлять в git).

git add .gitignore

git add: Говорим git, что это наше добро

Если после этого снова набрать git status, то вы увидите, что файл .gitignore выделен зелёным — это означает, что git начал за ним следить.

Добавим также и наш файл с программой: git add dice.rb. Можно, кстати, добавить все файлы и папки, которые есть в папке (кроме тех, что указаны в .gitignore) в репозиторий, набрав

git add .

Но мы не рекомендуем так делать по крайней мере на первых порах. Добавляйте файлы аккуратно, по одному объекту.

git commit

Наконец, переходим к созданию комита: сохранения, некой ключевой точки в нашей программе. Комиты лучше всего делать, когда вы написали какой-то законченный участок вашей программы. В нашем случае, программа пока настолько проста, что мы умудрились написать её первую версию всего одной строчкой в файле dice.rb. Давайте сделаем наш комит сейчас.

Для того, чтобы создать комит, нужно набрать git commit -m <message> и вместо message хорошо бы написать что-то осмысленное, чтобы всем (в том числе и вам) было понятно, что собственно означает это изменения. Первый коммит в программе обычно так и называют «Initial commit» (начальный комит), так что напишем:

git commit -m "Initial commit"

После этого git сообщит нам, что изменения сохранены:

git commit: Первое сохранение

Давайте теперь внесём изменения в нашу программу: пускай она сперва спрашивает у пользователя, сколько кинуть кубиков:

puts "How many dice?" # вопрос — сколько костей бросить?

number = gets.to_i # ввод из консоли числа кубиков, преобразование к целому числу

# цикл заданное число раз повторяющий вывод случайного "броска"
number.times do
  puts rand(6) + 1
end

Сохраним изменения в нашей программе с помощью коммита:

git commit -am "version 2"

Обратите внимание, что мы указали ключ -am, а не -m (как раньше). В такой комит попадут все изменения во всех файлах, когда-либо добавленных в репозиторий с помощью git add. А если бы мы хотели добавить в комит только некоторые из изменившихся файлов, нам бы необходимо было сообщить git-у, какие файлы мы хотим добавить, добавив их ещё раз с помощью git add. Но для вас это пока сложно и не нужно, так что просто пользуйтесь командой git commit -am.

git log

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

Команда git log

Обратите внимание, что у каждого комита есть идентификатор (на картинке выделен тёмно-жёлтым). Этот идентификатор может пригодиться, если мы захотим вернуться к какому-то состоянию в прошлом.

git checkout

Чтобы вернуться к состоянию вашей программы в прошлом, вам необходимо выполнить команду

git checkout <commit_id>

Где commit_id — тот самый идентификатор, который можно посмотреть с помощью git log.

Если вы откатитесь на комит, который назывался «Initial commit», а потом в RubyMine посмотрите, что находится в файле dice.rb, то увидите там первую версию вашей программы. В этом и заключается мощь git-а. Теперь вы всегда можете посмотреть «как было».

А чтобы вернуться на самое последнее сохранение, наберите

git checkout master

master — это, так называемая «основная ветка» вашей программы. Подробнее про ветвление читайте по ссылка в дополнительных материалах.

А этот урок закончен. Мы научились с помощью системы контроля версий хранить наши программы и их изменения в репозиториях git.

На следующем уроке мы научимся загружать наши программы в удалённый репозиторий на сайте github.com.