Git. Шпаргалка


Есть три способа открыть страницу руководства по любой команде Git:

git help <verb>
git <verb> --help
man git-<verb>

Конфигурационные файлы

Настройки на каждом последующем уровне подменяют настройки из предыдущих уровней.

Конфигурационный файл Описание
/etc/gitconfig Содержит значения, общие для всех пользователей системы и для всех их репозиториев. Если при запуске git config указать параметр --system, то параметры будут читаться и сохраняться именно в этот файл.
~/.gitconfig
или
~/.config/git/config
Xранит настройки конкретного пользователя. Этот файл используется при указании параметра --global
.git/config Конфигурационный файл в каталоге Git'а в том репозитории, где вы находитесь в данный момент. Эти параметры действуют только для данного конкретного репозитория. Настройки на каждом следующем уровне подменяют настройки из предыдущих уровней, то есть значения в .git/config перекрывают соответствующие значения в /etc/gitconfig.

Задать имя контактный ящик

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

Выбор редактора по умолчанию

git config --global core.editor vim      # Vim
git config --global core.editor emacs    # Emacs
git config --global core.editor nano     # Nano

Алиасы

Поддержка цветов

git config --global color.branch auto
git config --global color.diff auto
git config --global color.interactive auto
git config --global color.status auto

Псевдонимы для команд Git

git config --global alias.co checkout
git config --global alias.ci commit
git config --global alias.st status
git config --global alias.br branch
git config --global alias.type cat-file -t
git config --global alias.dump cat-file -p

Просмотр существующих настроек

git config --list            # Всех (глобальных, системных и локальных)
git config --local --list    # Локальных для определенного проекта
git config --system --list   # Системных

Создание локального репозитория

git init                    # создать репозиторий в текущем каталоге
git init <directory>        # создать репозиторий в указанном каталоге

Создание локального репозитория существующего проекта

git init        # Создать Git-репозиторий в текущем каталоге
git add .       # Индексировать рекурсивно все данные в каталоге
git commit      # Создать первый commit (снимок)

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

Клонирование выполняется командой git clone [url] . Пример клонирования репозитория библиотеки libgit2:

git clone https://github.com/libgit2/libgit2

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

git clone https://github.com/libgit2/libgit2 mylibgit

Пример работы с другими транспортными протоколами

git clone ssh://user@somehost:port/~user/repository
git clone git://user@somehost:port/~user/repository/project.git
git clone http://user@somehost:port/~user/repository/project.git
git clone file:///home/username/project myrepo
 
# git with github
git clone git@github.com:user/project.git                 # клонировать удаленный репозиторий в одноименную папку
git clone git@github.com:user/project.git foldername      # клонировать удаленный репозиторий в папку «foldername»
git clone git@github.com:user/project.git .               # клонировать репозиторий в текущую папку

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

git remote add nd https://bitbucket.org/NARk0d/csclient
git fetch nd               # Получить изменения, которые есть в репозитории пользователя NARk0d

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

git clone http://git.utf.by/ops/cscliet.git
cd ./cscliet
 
git remote
# origin
git remote -v
# origin	http://git.utf.by/ops/cscliet.git (fetch)
# origin	http://git.utf.by/ops/cscliet.git (push)

Добавление файла в репозиторий

git add file.txt        # Добавить один файл
git add .               # Добавить каталог рекурсивно
git add *.html          # Добавить файлы по маске

Сброс индексации

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

Шаблон игнорируемых файлов задается в .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

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

git commit                         # Коммит изменений с добавлением комментария через редактор
git commit -m "First commit"       # Коммит изменений с комментарием в командной строке
git commit -a                      # Коммит с автоматическим индексированием всех отслеживаемых файлов

Редактор выбирается из следующего списка (в порядке приоритета):

  1. переменная среды GIT_EDITOR
  2. параметр конфигурации core.editor
  3. переменная среды VISUAL
  4. переменная среды EDITOR

Отмена коммита

Сделать коммит с новыми изменениями, отменяющими предыдущие. При этом предыдущий коммит останется доступным и будет отображаться при использовании команды git log

git revert HEAD --no-edit

Сброс коммитов к предшествующему состоянию

git reset --hard <hash>    # Удаление коммита по hash-коду. Все изменения в нём будут утеряны.
git reset --hard HEAD~1    # Удаление последнего коммита. Все изменения в последнем коммите будут утеряны.

Перейти к последнему состоянию в ветке master:

git checkout master

Перейти к определённому состоянию в текущей ветке:

git checkout <hash>

git status

Изменить последний коммит

Изменить последний коммит можно с помощью ключа --amend.
Пример добавления файла:

git commit -m 'initial commit'
git add forgotten_file
git commit --amend

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

git commit --amend

Отмена подготовки файла

Ситуация: есть 2 файла, добавленных в индекс. Необходимо закоммитить вначале изменения одного файла, затем второго.

git reset HEAD <filename_two>
git commit -m 'Commiting is first file'
git add <filename_two>
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 <oldname> <newname>    # Переименовать ветку
git branch -m <newname>              # Переименовать текущую ветку
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<stirng>           # Показать только коммиты, в которых изменение в коде повлекло за собой добавление ил удаление указанной строки
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=<your name>
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 <tag>                         # Посмотреть данные аннотированной метки вместе с коммитом, который был помечен
git checkout <tag>^                    # Добавить тэг для предыдущего коммита
git checkout <tag>~1                   # Добавить тэг для предыдущего коммита 
git tag -d <tag>                       # Удалить тэг
git push origin v1.4                   # Отправить метку на общий сервер (по умолчанию git push метки не отправляет)
git push origin --tags                 # Отправить все метки на общий сервер

  • git._shpargalka.txt
  • Последние изменения: 2017/01/11 00:00
  • (внешнее изменение)