====== Git. Шпаргалка ======
----
===== Man =====
Есть три способа открыть страницу руководства по любой команде Git:
git help
git --help
man git-
----
===== Создание Git-репозитория =====
==== Создание локального репозитория ====
git init # создать репозиторий в текущем каталоге
git init # создать репозиторий в указанном каталоге
==== Создание локального репозитория существующего проекта ====
git init # Создать Git-репозиторий в текущем каталоге
git add . # Индексировать рекурсивно все данные в каталоге
git commit # Создать первый commit (снимок)
----
===== Индексация =====
==== Добавление файла в репозиторий ====
git add file.txt # Добавить один файл
git add . # Добавить каталог рекурсивно
git add *.html # Добавить файлы по маске
==== Сброс индексации ====
git reset file.txt
* [[ https://git-scm.com/book/ru/v2/Инструменты-Git-Раскрытие-тайн-reset | Инструменты Git. Раскрытие тайн reset ]]
==== Игнорирование файлов ====
Шаблон игнорируемых файлов задается в **''.gitignore''** или **''.git/info/exclude''** . Пример содержимого:
*.[oa] # Все файлы, которые заканчиваются на .o или .a
!lib.a # Однако НЕ игнорировать файл lib.a
*~ # Всё, что заканчивается на ~
/TODO # Игнорировать файл TODO, однако НЕ каталог TODO
build/ # Игнорировать все файлы в каталоге build/
doc/*.txt # Игнорировать, например, doc/notes.txt, но не doc/server/arch.txt
doc/**/*.txt # Игнорировать все .txt файлы во всех вложенных в doc/ каталогах
При этом помним:
* пустые строки, а так же строки, начинающиеся с %%#%%, игнорируются
* можно использовать стандартные glob-шаблоны
* можно начать шаблон символом слэша %%/%%, чтобы избежать рекурсии
* можно заканчивать шаблон символом слэша %%/%% для указания каталога
* можно инвертировать шаблон, использовав восклицательный знак %%!%% в качестве первого символа
----
==== Удаление из индекса ====
При удалении файла с диска, он остаётся в Git и помечается как **''Cnahget not staged for commit''** (Изменённый, но не проиндексированный). Для того, чтобы удаление файла попало в индекс, необходимо так же выполнить **''git rm''**. С данной команды можно и начинать, по умолчанию удаляется файл из индекса и рабочего каталога
git rm README # Удалить файл README из индекса и рабочего каталога
git rm --cached README # Удалить файл README только из индекса (на диске файл останется)
==== Перемещение файлов ====
Git не отслеживает перемещение файлов явно.
git mv file_from file_to
Данная команда аналогично следующему процессу
mv file_from file_to
git rm file_from
git add file_to
----
===== Просмотр изменений =====
==== Просмотр неиндексрованных изменений ====
git diff # в консоли
git difftool # в графическом приложении (напр. vimdiff)
==== Просмотр индексированных изменений ====
git diff --staged
# или
git diff --cached
----
===== Commit (фиксированное изменение) =====
==== Создание коммита ====
git commit # Коммит изменений с добавлением комментария через редактор
git commit -m "First commit" # Коммит изменений с комментарием в командной строке
git commit -a # Коммит с автоматическим индексированием всех отслеживаемых файлов
Редактор выбирается из следующего списка (в порядке приоритета):
- переменная среды GIT_EDITOR
- параметр конфигурации core.editor
- переменная среды VISUAL
- переменная среды EDITOR
==== Отмена коммита ====
Сделать коммит с новыми изменениями, отменяющими предыдущие. При этом предыдущий коммит останется доступным и будет отображаться при использовании команды ''git log''
git revert HEAD --no-edit
==== Сброс коммитов к предшествующему состоянию ====
git reset --hard # Удаление коммита по hash-коду. Все изменения в нём будут утеряны.
git reset --hard HEAD~1 # Удаление последнего коммита. Все изменения в последнем коммите будут утеряны.
----
===== Переход между состояниями =====
**Перейти к последнему состоянию в ветке master:**
git checkout master
**Перейти к определённому состоянию в текущей ветке:**
git checkout
----
===== Проверка состояния репозитория =====
git status
----
===== Операции отмены =====
==== Изменить последний коммит ====
Изменить последний коммит можно с помощью ключа **''%%--amend%%''**. \\
Пример добавления файла:
git commit -m 'initial commit'
git add forgotten_file
git commit --amend
Для изменения комментария к коммиту, при условии, что //**ещё не было внесено правок в индексируемые файлы**//, достаточно выполнить
git commit --amend
==== Отмена подготовки файла ====
Ситуация: есть 2 файла, добавленных в индекс. Необходимо закоммитить вначале изменения одного файла, затем второго.
git reset HEAD
git commit -m 'Commiting is first file'
git add
git commit -m 'Commiting is second file '
==== Отмена изменения измененного файла ====
Вернуть файл **filename** к состоянию из последнего коммита.
git checkout -- filename
При этом помним: всё что, не коммитим и теряем, вероятней всего теряем безвозвратно.
----
===== Работа с ветками =====
git branch # Посмотреть локальные ветки
git branch <имя_ветки> # Создать ветку
git branch -v # Посмотреть последний коммит на каждой из локальных веток
git branch -a # Посмотреть все существующие локальные и удаленные ветки
git branch -a -v # Посмотреть последние коммиты на всех ветках (локальных и удаленных)
git branch -vv # Посмотреть отслеживаемые ветки
git branch -u origin/serverfix # Сделать локальную ветку serverfix отслеживаемой
git branch new_branch 5a0eb04 # Создать ветку на определенном коммите
git branch -m # Переименовать ветку
git branch -m # Переименовать текущую ветку
git branch -d <имя_ветки> # Удалить ветку
git push origin --delete serverfix # Удалить ветку serverfix на удаленном сервере
git checkout <имя_ветки> # Переключится на ветку
git checkout -b <имя_ветки> # Создать ветку и сразу же переключиться на нее
==== Слияние веток (в примере находимся на ветке master и сливаем с ней ветку hotfix) ====
git checkout master
git merge hotfix
----
===== История =====
git log # Вывод простой истории коммитов
git log -2 # Вывод последних n записей, в примере вывод двух последних записей
git log -p -2 # Вывод дельты (diff) разницы между последними двумя изменениями (на уровне строк)
git log -p -2 --word-diff # Вывод изменений между двумя последними коммитами на уровне слов
git log -2 --stat # Вывод краткой статистики по 2 последним коммитам
git log --pretty=oneline # И очень полезный ключ --pretty (позволяет изменить формат вывода лога)
git log --since=2.weeks # Cписок коммитов, сделанных за последние две недели
git log --after="2017-01-01" # after является синонимом since
git log --until=2.weeks # Список коммитов, сделанных ранее двух недель назад
git log --before="2017-01-01"# before является синонимом until
git log --author="Daniil Nareyko" # Вывести только коммиты, которые были сделаны указанным пользователем
git log -S # Показать только коммиты, в которых изменение в коде повлекло за собой добавление ил удаление указанной строки
git log --oneline # Список коммитов с хэшем (короткое число)
**Более удобный формат вывода для постоянного использования:**
git log --pretty=format:"%h %ad | %s%d [%an]" --graph --date=short
==== Параметры ключа format ====
^ Параметр ^ Описание выводимых данных ^
| **%%%H%%** | Хеш коммита |
| **%%%h%%** | Сокращённый хеш коммита |
| **%%%T%%** | Хеш дерева |
| **%%%t%%** | Сокращённый хеш дерева |
| **%%%P%%** | Хеши родительских коммитов |
| **%%%p%%** | Сокращённые хеши родительских коммитов |
| **%%%an%%** | Имя автора |
| **%%%ae%%** | Электронная почта автора |
| **%%%ad%%** | Дата автора %%(формат соответствует параметру --date=)%% |
| **%%%ar%%** | Дата автора, относительная %%(пр. "2 мес. назад")%% |
| **%%%cn%%** | Имя коммитера |
| **%%%ce%%** | Электронная почта коммитера |
| **%%%cd%%** | Дата коммитера |
| **%%%cr%%** | Дата коммитера, относительная |
| **%%%s%%** | Комментарий |
**Другие примеры:**
git log --pretty=oneline --max-count=2
git log --pretty=oneline --since='5 minutes ago'
git log --pretty=oneline --until='5 minutes ago'
git log --pretty=oneline --author=
git log --pretty=oneline --all
git reflog # Просмотр истории перемещения указателя HEAD
----
===== Тэги =====
git tag # Посмотреть все (перечисляет в алфавитном порядке)
git tag -l 'v1.4.2.*' # Посмотреть попадающие под маску тэги
git tag -a v1.4 -m 'my version 1.4' # Создать аннотированную метку на текущем коммите (ключ -а) с меточным сообщением (ключ -m)
git tag -a v1.4 -m 'my v1.4' 98fced0 # То же самое, но для определённого коммита (98fced0)
git tag <имя_метки> # Создание легковесной метки на текущем коммите
git show # Посмотреть данные аннотированной метки вместе с коммитом, который был помечен
git checkout ^ # Добавить тэг для предыдущего коммита
git checkout ~1 # Добавить тэг для предыдущего коммита
git tag -d # Удалить тэг
git push origin v1.4 # Отправить метку на общий сервер (по умолчанию git push метки не отправляет)
git push origin --tags # Отправить все метки на общий сервер
----