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

Git — распределённая система управления версиями. Проект был создан Линусом Торвальдсом для управления разработкой ядра Linux, первая версия выпущена 7 апреля 2005 года. На сегодняшний день его поддерживает Джунио Хамано.

Оки.. поняли когда выпущено и что это такое, но не понятно, что такое "система управления версиями"

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

Так уже понятнее. Если кратко Git помогает нам:

  • Хранить разные версии нашего когда
  • Хранить их распределенно
  • Находить и разрешать конфликты

Установка git

  • У вас windows - идем на сайт и скачиваем инстайлер
  • У вас Linux - git уже есть, либо пишем apt install git
  • У вас Mac - git может быть уже есть, но я уже не помню. Если нет, то устанавливаем Homebrew в одну комманду и устанавливаем git через команду brew install git

Как git хранит наш код

Git хранит наш код(но и не только код) в виде последовательности изменений, т.е каждая следующая запись в истории - информация об изменении относительно предыдущей записи. Такие записи в git называются коммитами

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

Для бинарных файлов diff не хранится.

Базовые понятия

  • Коммит(commit) - запись в нашей истории изменений.
  • Репозиторий(repository) - давайте будем считать, что это последовательность коммитов, некая наша база объектов.
  • Удаленный репозиторий(remote repository) - репозиторий находящийся на другом сервере.
  • Ссылка(ref) - указатель на какой-то коммит... в дальнейшем станет понятнее
  • Индекс(index) - некий промежуточный раздел, в который мы можем добавлять изменения для дальнейшей записи их в историю(коммит в репозитории)
  • Рабочая директория - Ваша папка на диске, в которой вы производите изменения

Создание репозитория в текущей директории

Для создания репозитория следует набрать комманду:

git init

после ее выполнения будет создана скрытая папка .git в директории проекта.

Иногда вам надо получить данные из удаленного репозитория, в таком случае вы должны воспользоваться командой git clone

git clone git@github.com:VLZH/course-python-basics.git

Новые команды

  • git init - создать репозиторий в текущей директории
  • git clone <remote url> <dirname> - склонировать удаленный репозиторий

Получение справки по командам

Для получения справки по командам есть флаг --help для каждой команды или команда git help <command>.

Справка у git отличная и в ней легко разобраться.

git commit --help
git help commit

Настройка git

Как я написал выше, каждый коммит хранит дополнительную информацию об авторе, обязательным шагом является настройка этой информации для этого можем набрать комманду:

git config user.name "First Last"
git config user.email "some@mail.com"

Комманды представленные выше, поменяют конфигурацию только для проекта, для того чтобы поменять настройки на уровне пользователя следует добавить флаг --global

Новые команды

  • git config - для изменения настроек git, если настройки должны иметь глобальный характер добавляем параметр --global

Добавление изменений в index

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

👆 Мы будем очень часто ссылаться к этому изображению и советую вам при самостоятельной работе с git держать его при себе.

На текущий момет времени мы уже создали с вами репозиторий и сконфигурировали информацию о пользователе. Теперь мы можем начать вносить изменения в рабочую директорию.

  • Создайте файл text1.txt
    echo "I am text1" >> text1.txt
  • Добавьте файл в index использую команду git add text1.txt

Вуаля! Файл уже в индексе. Для того чтобы посмотреть текущее состояние репозитория есть комманда git status

Новые команды

  • git add <files> - добавить файл или изменения в нем в индекс
  • git status - получить информацию о текущем состоянии репозитория/рабочей директории

Добавление коммита в локальный репозиторий

Отлично! У нас есть изменения, которые мы хотим с вами добавить в репозиторий для этого воспользуемся командой git commit

git commit

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

git commit -m "Мой первый коммит"

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

Новые команды

  • git commit - создать новый коммит из изменений в index

Подготовка изменений к коммиту

Мы уже знаем как сделать коммит и добавить изменения в индекс.. но что если этих изменений много? В таком случае мы можем воспользоваться командой:

git add . # Это добавит все изменения в текущей директории в индекс

Удаление изменений из индекса

Иногда вам может понадобиться отменить добавлений каких-то изменений в коммит, для этого можно воспользоваться коммандой git rm с флагом --cached что обозначает совершить удаление из индекса.

git rm --cached text3.txt

Так же для удаления файла(только если он уже был в репозитории) и добавления информации о его удалении в индекс можно воспользоваться командой git rm без флага --cached

Новые команды

  • git rm - Удалить файл из рабочей директории и добавить удаление в index

    Если вы хотите удалить файл только из индекса есть флаг --cached

Просмотр истории коммитов

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

git log

Эта команда получает большое кол-во параметров для настройки отображения списка, но самые популярные из них:

  • --oneline - Вывести каждый коммит в одну строку
  • --graph - Вывести коммиты ввиде дерева

Просмотр изменений в коммите

Это делается через git diff. Команда покажет может показывать нам изменения между:

  • Рабочей директорией и коммитом
  • Двумя коммитами
  • Рабочей директорией и индексом

Давайте посмотрим как это делать:

git diff sl60b3 # Чтобы показать изменения между рабочей директорией и коммитом
git diff hb3301 sl60b3 # Чтобы показать изменения между двумя коммитами
git diff # Чтобы показать изменения между состоянием рабочей директории и индексом

Изменение рабочей директории к состоянию коммита

Для перемещения между ветками и изменению состояния рабочей директории используется команда git checkout <commit>, использую ее мы можем перемещаться между коммитами.

git checkout hle7jb2 # Например так. А не понятные символы в конце - это первые символы хеша коммита, можно сказать что его идентификатора

Ветки

По умолчанию у нас есть ветка master, но бывает так что мы хотим сделать что-то, что в мастер попасть не должно в таком случае мы воспользуемся функционалом веток в git.

git branch --list # вывести список веток
git branch # вывести текущую ветку
git branch <name> # создать новую ветку