Git

Git — это система управления версиями, позволяет отслеживать изменения в исходном коде. Она позволяет создавать коммиты проекта, ветвления и слияния изменений. Тут основные тезисы и команды для работы с гитом из учебника.

Установка Git в Linux

sudo apt-get install git

После установки, проверяем версию

git --version
// Ответ 
git version 2.43.0

Конфиг лежит в файле ~/.gitconfig Сюда Git запишет настройки, например алиасы, ник пользователя, объем буфера и прочее.

В новой системе после установки укажем пользователя и почту. Эту инфу Git будет включать в коммиты.

git config --global user.name "Dxrkd3v" <-- Имя пользователя
git config --global user.email "dxrkd3v@mail.com" <-- Email пользователя

Ключ --global указывает что эти данные будут использоваться для всех файлов в системе.

Посмотеть изминения в файле ~/.gitconfig можно через ключ --list например

git config --list
// ответ
user.name=Dxrkd3v
user.email=dxrkd3v@mail.com

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

git init

Эта команда создаст пустую папку с расширением .git в вашем проекте.

Добавление в стейдж

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

git add index.html

и после этого можно делать коммит, то есть сохранение состояния

git commit -m "text of your commit"

Проверить состояние файлов позволяет команда status

git status

Команда git status дает исчерпывающий ответ, в Гите есть флаг позволяющий получить ту же инфу но в сокращенном виде это --short

git status --short
//ответ
m index.html
a style.css

m <-- modded
a <-- added

Gitignore

Для исключения слежения за отдельными файлами или директориями используют .gitignore со списком паттернов

Пример файла gitignore

# это комментарий
*.md <-- пропускать markdown файлы 
*.png <-- пропускать картинки с расширением png

diff

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

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

После добавления в стейдж git diff ничего не вернет.

Выйти из меню с git diff нужно нажать :q ;)

A команда git diff --cached покажет проиндексированные изминения

Коммит

Когда все настроено, можно делать первый коммит. Для этого используется команда git commit она откроет редактор который указан в .gitconfig можно поменять редактор если нужно

git config --global core.editor vim
//укажет vim редактором по умолчанию

Команда git commit откроет vim и в нем нужно набрать сообщение для коммита

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

Сообщение для коммита можно также указать через консоль поставив флаг -m

git commit -m "текст сообщения коммита"

Пропуск файлов

Если набрать команду git commit с флагом -a то система Git начнет автоматически индексировать все отслеживаемые файлы перед их фиксацией что позволяет обойтись без команды git add но как по мне то лучше так не стоит делать ;)

Удаление файлов из проекта

Чтобы Git перестал следить за изминениями в файле его нужно удалить из индекса и зафиксировать данное изминение. Это делает команда git rm заодно удаляет файл из рабочей папки.

git rm index.html
//rm сокращенно remove

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

Если файл отредактирован и уже в индексе нужно воспользоваться параметром -f т.е. force чтобы принудительно стереть все данные и не было возможности восстановления средствами Git.

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

git rm --cached index.html

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

После переименования файла у системы Git не сохранятся никаких метаданных что этот файл был переименован. При этом в гите есть команда mv то есть move которая позволяет переименовать файл, например:

git mv oldFileName.html newFileName.html 

Эта команда выполнит те же действия что и следующие 3 строчки

mv oldFileName.html newFileName.html
git rm oldFileName.html
git add newFileName.html

Просмотр истории версий

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

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

У git log есть очень много параметров. Рассмотрю самые популярные. Это флаг -p который показывает разницу внесенную каждым коммитом.

Для получения краткой статистики по каждой из версии прменяется параметр --stat

git log --stat 

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

Еще одним крайне полезным параметром является --pretty. Он меняет формат вывода информации. Есть несколько предустановленных вариантов. Параметр oneline выводит каждый коммит в одну строку, что весьма удобно при просмотре большого числа коммитов. Параметры short, full и fuller, практически не меняя формат вывода, определяют его детализацию:

$ git log --pretty=oneline
ca82...63949 changed the verison number
085b...6e7e7 removed unnecessary test
a11b...209e6 first commit

Наиболее интересен параметр format, позволяющий выводить записи журнала в выбранном вами формате.

Самые распространенные параметры форматирования:

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

git log --pretty=format:"%h - %an, %ar : %s"
ca82a6d - Dxrkd3v, 6 years ago : changed the version number
085bb3b - Dxrkd3v, 6 years ago : removed unnecessary test
a11bef0 - Dxrkd3v, 6 years ago : first commit
%h <-- Сокращенный хеш-код коммита
%n <-- Имя автора
%ar <-- Какое время назад
%s <-- Текст коммита

Параметры oneline и format особенно полезны в сочетании с другим параметром команды log, который называется –graph. Он добавляет небольшой ASCII-граф с историей ветвлений и слияний

git log --pretty=format:"%h %s" --graph
* 2d3acf9 ignore errors from SIGCHLD on trap
* 5e3ee11 Merge branch 'master' of git://github.com/dustin/grit
|\
| * 420eac9 Added a method for getting the current branch.
* | 30e367c timeout code and tests
* | 5a09431 add timeout protection to grit
* | e1193f8 support for heads with slashes in them
|/
* d6016bc require time for xmlschema
* 11d191e Merge branch 'defunkt' into local

Распространенные параметры команды git log

Вот таблица с распространёнными параметрами команды git log:

Параметр Описание
git log Показывает историю коммитов в текущей ветке.
git log -n <число> Ограничивает вывод последними <число> коммитами.
git log --oneline Показывает сокращённый вывод (хеш и сообщение коммита в одну строку).
git log --graph Отображает историю в виде графа с ветвлениями и слияниями.
git log --all Показывает историю всех веток, а не только текущей.
git log --author=<имя> Фильтрует коммиты по автору.
git log --since=<дата> Показывает коммиты, сделанные после указанной даты.
git log --until=<дата> Показывает коммиты, сделанные до указанной даты.
git log --grep=<текст> Ищет коммиты, в сообщениях которых есть указанный текст.
git log --stat Показывает статистику изменений в файлах для каждого коммита.
git log --patch Показывает изменения в файлах (дельта) для каждого коммита.
git log --pretty=<формат> Настраивает формат вывода (например, --pretty=format:"%h - %an, %ar : %s").
git log --abbrev-commit Показывает сокращённые хеши коммитов.
git log --decorate Показывает ссылки на ветки и теги, связанные с коммитами.
git log --merges Показывает только коммиты слияния (merge).
git log --no-merges Показывает только обычные коммиты, исключая слияния.
git log <файл> Показывает историю изменений конкретного файла.
git log branch1..branch2 Показывает коммиты, которые есть в branch2, но отсутствуют в branch1.
git log --follow <файл> Показывает историю файла, включая переименования.

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

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

git commit –amend

В итоге останется единственный коммит — второй коммит заменит результат первого.

git commit -m 'изначальный коммит'
git add index.html
git commit --amend

Отмена индексирования

Для отмены индексирования существует команда reset

git reset HEAD index.html
    modified: index.html
// теперь файл показывается как просто измененный 

Отмена внесенных в файл изменений

Быстро отменить изминения и вернуть файл в состояние, в котором он находился до последней фиксации поможет git checkout

git checkout -- index.html

Команда отменяет все изминения.

Отображение удаленных репозиториев

Просмотр уже настроенных удаленных серверов осуществляется командой git remote

Параметр -v позволяет увидеть URL-адреса, которые хранить Git.

git remote -v
Origin https://github.com/dxrkd3v/blog (fetch)
Origin https://github.com/dxrkd3v/blog (push)

Добавление удаленных репозиториев

Чтобы добавить репозиторий под коротким именем, которое упростит дальнейшие обращения к нему, используют команду
git remote add [сокращенное имя] [url]

git remote add dxrk https://github.com/dkd3v/blog
git remote -v
origin https://github.com/dxrkd3v/blog (fetch)
origin https://github.com/dxrkd3v/blog (push)
dxrk https://github.com/dkd3v/blog (fetch)
dxrk https://github.com/dkd3v/blog (push)

Теперь вместо полного URL-адреса в командную строку можно вводить имя dxrk. К примеру, для скачивания всей инфы нужно набрать git fetch dxrk

Удаление и переименование удаленных репозиториев

Переименование ссылок осуществляется командой git remote rename, меняющей сокращенные имена удаленных репозиториев.

git remote rename dxrk dark
git remote 
origin
dark

Удалить ссылку на удаленный репозиторий

git remote rm dark
git remote
origin

Теги

Создать в Git тег, снабженный комментарием поможет параметр -a к команде tag

git tag -a v1.2 -m "моя версия 1.2"
git tag
v1.2

В примере параметр -m позволяет добавить комментарий.

Для просмотра данных тега вместе с помеченным им коммитом служит команда git show

Перед информацией о коммите выводятся данные человека, поставившего тег, дата пометки коммита и текст комментария.

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

git log --pretty=oneline
9fceb02...61af8 bug fixed
964f16d...4abbc second commit
8a5cbc4...2908a first commit

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

git tag -a v1.2 9fceb02

Проверим наличие тега

git tag
v1.2
git show v1.2
// выведет имя автора тега с почтой
// и датой + сам коммит

push тегов

Созданные теги отправляются на сервер отдельной командой
git push origin [имя тега]

Если нужно запушить все теги, ставят флаг --tags

git push origin --tags

Псевдонимы или aliases

Команда git config позволяет легко создать псевдоним для любой команды.

git config --global alias.a 'add .'
git config --global alias.c commit
git config --global alias.s status

Теперь можно набирать git s вместо git status и так далее.

Ветки в Git