====== 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 # Отправить все метки на общий сервер ----