Git основы + основные команды


Всем привет друзья! Сегодня речь пойдет о работе с Git, установке и основных командах.



Что такое git?

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


Зачем нужен git?

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


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




Установка git


Установка в Windows

Установка в windows самая простая, просто скачайте файл-установщик со страницы проекта и следуйте инструкциям.


Установка в Linux

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

$ yum install git-core

Если же у вас дистрибутив, основанный на Debian, например, Ubuntu, используйте apt-get:

$ apt-get install git

Установка на Mac

На Mac OS вы можете установить git использую графический инсталлятор который вы можете скачать со страницы на SourceForge


Или, если у вас есть MacPorts, установите Git так:

$ sudo port install git-core +svn +doc +bash_completion +gitweb



Первоначальная настройка


Имя пользователя

Первым делом указываем свое имя и email. Это необходимо так как каждый коммит содержит эту информацию.

$ git config --global user.name "John Doe"
$ git config --global user.email johndoe@example.com

Выбор редактора

Здесь мы указываем текстовый редактор, который будет использоваться когда нужно будет написать сообщение в гите. По умолчанию Git использует стандартный редактор, обычно это Vi или Vim. Если вы хотите использовать другой редактор, например, Emacs, нужно использовать такую команду:

$ git config --global core.editor emacs

Также можно указать путь до редактора, использовать можно даже с параметрами

$ git config --global core.editor "'C:/Program Files/Notepad++/notepad++.exe' -multiInst -notabbar -nosession -noPlugin"

Здесь как редактор я указал Notepad++ с дополнительной настройкой.


Все настройки git можно посмотреть используя команду

$ git config --list

Или проверить значение конкретного ключа, выполнив

$ git config {ключ}



Создание git репозитория

И так, с настройкой разобрались, переходим к командам, для начала создадим репозиторий гит.
Открываем консоль в папке где собираемся создавать репозиторий и вводим следущую команду:

$ git init

Эта команда создаёт в текущем каталоге новый, с именем .git содержащий в себе файлы репозитория.


Клонирование git репозитория

Вы также можете получить копию существующего репозитория Git, для этого используем следующий код:

$ git clone git@github.com:twbs/bootstrap.git



Запись изменений в репозиторий

Итак, у нас имеется репозиторий и файлы некоторого проекта.

Во время работы над этим проектом мы будем делать изменения, фиксировать “снимки”, состояния этих изменений в репозитории всегда, когда проект достигает состояния, которое вам бы хотелось сохранить.

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

Как только вы отредактируете файлы, Git будет рассматривать их как изменённые, т.к. вы отредактировали их с момента последнего коммита. Вы индексируете эти изменения и затем фиксируете.


Определение состояния файлов

Состояние файлов можно проверить выполнив команду

$ git status

Если вы выполните команду сразу после создания репозитория, вы увидите примерно такой ответ:

# On branch master
nothing to commit, working directory clean

Это означает что у вас нет отслеживаемых изменённых файлов. Git также не обнаружил неотслеживаемых файлов, иначе они бы были перечислены здесь. И в дополнение, команда сообщает на какой ветке (branch) вы сейчас находитесь. Пока что это ветка master - ветка по умолчанию.


Отслеживание новых файлов

Для того чтобы начать отслеживать новый файл, используется команда

$ git add [файлы]

Здесь можно вставлять имя файла или шаблон выборки, например *.txt добавит в версионный контроль все текстовые файлы.

$ git add *.txt

Игнорирование файлов

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

Это особенно важно если мы часто используем шаблон * или *.*

Вот пример содержимого файла .gitignore

# комментарий - эта строка игнорируется

# исключить папку node_modules
/node_modules/

# игнорировать все файлы в каталоге dist/
dist/

# исключить все файлы *.log
*.log

# но отслеживать файл main.log несмотря на то, что мы игнорируем все .log
!main.log

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

С помощью команды git status можно посмотреть какие файлы проекта были изменены, но если вам хочется знать, что же вы изменили, но пока не проиндексировали - используйте команду

$ git diff

Эта команда сравнивает содержимое вашего рабочего каталога с содержимым индекса. Результат показывает ещё не проиндексированные изменения (изменения которые вы не добавили командой git add).

Чтобы выйти из выполнения этой команды нажмите q



Чтобы посмотреть, что вы проиндексировали и что войдёт в следующий коммит используйте git diff с аргументом --staged

$ git diff --staged

Эта команда сравнивает индексированные изменения с последним коммитом.


Создание коммитов

После индексации изменений, мы можем их зафиксировать. Запомтине, файлы которые не были проиндексированы перед коммитом в него не попадут.

$ git commit

Эта команда откроет текстовый редактор который мы указывали в настройках, для создания комментария к коммиту.


Также, если ваш комментарий состоит из 1 строчки можно использовать аргумент -m с последующим текстом комментария.

$ git commit -m 'Текст комментария'

Отлично, вы создали свой первый коммит.

Каждый раз, когда вы делаете коммит, вы сохраняете снимок состояния проекта, который позже вы можете восстановить.


Игнорирование индексации

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

$ git commit -a -m 'Текст комментария'

Удаление файлов из git

Чтобы удалить файл, необходимо удалить его из отслеживаемых файлов и сделать коммит.

$ git rm [файлы]

Эта команда удаляет файл из индекса и из каталога проекта.

Если вы и уже проиндексировали файл, необходимо использовать принудительное удаление с помощью параметра -f


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

Это можно сделать используя опцию --cached

$ git rm --cached [файлы]

Перемещение/Переименование файлов

Переместить или изменить имя файла можно используя одну и ту же команду, это связано с тем, что в системе меняется не файл а путь до файла.


$ git mv [старое название] [новое название]

Используя этот код вы можете переименовать файл. Например:

$ git mv readme.txt readme.doc


$ git mv [старый путь] [новый путь]

А пользуясь этой командой вы можете перемещать файлы. Пример:

$ git mv readme.txt dist/readme.txt



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

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

$ git log

После введения этой команды вы увидите что-то вроде этого:

commit d5282f636561a28e09f9a5a75be613f6fc16b111 (HEAD -> master)
Author: Anatoliy anatoliy.akhmatov@gmail.com>
Date:   Wed May 23 10:24:29 2018 +0600

    new design

commit 8108ddb802a5fc66d7a4ca6c10bada9d328db133 (origin/master)
Author: Anatoliy anatoliy.akhmatov@gmail.com>
Date:   Sun May 20 18:05:30 2018 +0600

    init

Напомню, чтобы остановить вывод коммитов используйте клавишу q


Параметров у git log очень много, далее мы рассмотрим наиболее полезные из них


Ограничение вывода коммитов

Используя опцию -n мы можем ограничить количество коммитов при просмотре истории

$ git log -2

Здесь мы выводим только 2 последних коммита.


Вывод изменений кода

Мы также можем использовать параметр -p для вывода разницы в коде для каждого коммита (работает как diff).

$ git log -p

Статистика по каждому коммиту

Используя параметр --stat мы выведем краткую статистику по каждому коммиту.

$ git log --stat

Формат вывода коммитов

Эта полезная опция поможет привести в порядок вывод и сэкономить время при просмотре истории.

$ git log --pretty=oneline

В результате мы получим такой вывод

d5282f636561a28e09f9a5a75be613f6fc16b111 (HEAD -> master) new design
8108ddb802a5fc66d7a4ca6c10bada9d328db133 (origin/master) init

Также существуют другие варианты: short, full и fuller


Создание собственного вывода

Мы можем сделать вывод "под себя", для этого в pretty указываем аргумент format со строкой шаблона вывода

$ git log --pretty=format:"%h - %an, %ar | %s"

Результат вывода будет таким

d5282f6 - Anatoliy, 5 days ago | new design
8108ddb - Anatoliy, 8 days ago | init

Вот полный список переменных которые можно использовать в собственном выводе:

Параметр Выводимые данные
%H Хеш коммита
%h Сокращённый хеш коммита
%T Хеш дерева
%t Сокращённый хеш дерева
%P Хеши родительских коммитов
%p Сокращённые хеши родительских коммитов
%an Имя автора
%ae Электронная почта автора
%ad Дата автора
%ar Относительная дата автора ("3 мес. назад")
%cn Имя коммитера
%ce Электронная почта коммитера
%cd Дата коммитера
%cr Дата коммитера, относительная
%s Комментарий



Отмена изменений

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


Изменение последнего коммита

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

Вы можете сделать этот коммит еще раз, в этом нам поможет опция --amend

$ git commit --amend

Например вы забыли проиндексировать файл

$ git commit -m 'комментарий'
$ git add [забытый файл]
$ git commit --amend

Эти три команды в результате дадут один коммит - второй, с опцией --amend заменит результат первого.


Отмена индексации файла

Если вы добавили файл который не нужно отслеживать в индексацию, его можно исключить из индекса командой

$ git reset HEAD [файл]

Эта команда странновата, но она работает.


Отмена изменений файла

Вы вдруг поняли что не хотите оставлять изменения в каком-либо файле, тогда можно откатить его до состояния последнего коммита. Будьте осторожны, вы уже не сможете вернуть то, что откатили. Собственно команда:

$ git checkout -- [файл]



В этом уроке мы изучили основные команды необходимые для использования git. Теперь ваши проекты находятся под надежным версионным контролем. До встречи в новых уроках друзья!