Skip to content
tdrozdovskiy edited this page May 9, 2018 · 10 revisions

Man Есть три способа открыть страницу руководства по любой команде 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-репозитория Создание локального репозитория git init # создать репозиторий в текущем каталоге git init # создать репозиторий в указанном каталоге Создание локального репозитория существующего проекта 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

Индексация Добавление файла в репозиторий git add file.txt # Добавить один файл git add . # Добавить каталог рекурсивно git add *.html # Добавить файлы по маске Сброс индексации git reset file.txt Инструменты 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 <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 # Переименовать ветку 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 # Отправить все метки на общий сервер

Creating the new branch from base commit and switch to it

$ git checkout -b <name new branch> <base commit-sha1>  

Cancelling the last commit

The --amend allows you to add new changes to the last commit.

$ git commit --amend

This command will cancel the last commit (but not the changes you made, they will be retained).

$ git reset --soft HEAD^

This command will remove the last commit

$ git reset --hard HEAD^

In case you published them, there is nothing else left but to make a commit that cancels a commit:

$ git revert commit-sha1

Clone this wiki locally