= Git: основные команды :title-separator: {sp}| :category: Программирование :tags: программирование, git :toc: == Ссылки * https://githowto.com/ru/changes_not_files[GitHowTo] * https://git-scm.com/book/ru/v2[ProGit] * https://github.com/maxliscia/git-pocket[Git Pocket Guide] == Установка В Debian/Ubuntu: [source,sh] ---- sudo apt-get install git ---- == Термины [width="100%",cols="18%,20%,62%",options="header",] |=== |Термин |Англ |Определение |Рабочий каталог |working tree, working directory |Набор файлов в текущем каталоге |Репозиторий |repository, repo |Контейнер, хранящий историю изменений файлов проекта |Индекс |index, staging area |Область между рабочим каталогом и репозиторием, в котором осуществляется подготовка к фиксации |SHA-1 |SHA-1 |Уникальный идентификатор, отражающий информацию об истории |Ветка |branch |Именованная последовательность в истории изменений |Фиксация (коммит) |commit |Набор файлов, записанных в историю одновременно |`HEAD` |`HEAD` |Имя ссылки на последнюю фиксацию в текущей ветке |Метка |tag |Именованная ссылка на некоторую фиксацию в истории |=== == Состояния Файлы в рабочем каталоге могут отслеживаться системой контроля версий (tracked) или нет (untracked). Отслеживаемые файлы, которые на <> обозначены зелёным фоном, могут быть неизменёнными (unmodified), изменёнными (modified) или подготовленными к фиксации (indexed). [[states]] [.text-center] .Состояния [plantuml] ---- @startuml participant untracked as "Неотслеживамые\n(untracked)" box "Отслеживаемые" participant staged as "Подготовленные к фиксации\n(indexed)" #55FF55 participant unmodified as "Неизменённые\n(unmodified)" #99FF99 participant modified as "Изменённые\n(modified)" #77FF77 end box untracked -> staged : git add staged -> unmodified : git commit unmodified -> modified : редактирование modified -> staged : git add modified -> untracked: git rm --cached unmodified -> untracked: git rm --cached staged -> untracked: git rm --cached @enduml ---- Основные команды, осуществляющие взаимодействие между рабочим каталогом, индексом, локальным и удалённым репозиторием, приведены на <>. [[commands]] [.text-center] .Команды [plantuml] ---- @startuml participant workspace as "Рабочий каталог\n(working dir)" participant index as "Индекс\n(index)" #77FF77 participant local as "Локальный репозиторий\n(local repository)" #FF7777 participant remote as "Удалённый репозиторий\n(remote repository)" #7777FF workspace -> local : git commit -a workspace -> index : git add (-u) index -> local : git commit local -> remote : git push == Обновление с сервера == remote -> workspace : git pull (rebase) remote -> local : fetch == Откат изменений == local -[#red]> workspace : git checkout HEAD index -[#red]> workspace : git checkout == Сравнение == local -[#blue]> workspace : git diff HEAD index -[#blue]> workspace : git diff @enduml ---- Пример последовательности действий, выполняемых пользователем в совместном проекте, приведён на <>. [[workflow]] [.text-center] .Последовательность действий [plantuml] ---- @startuml participant workspace as "Рабочий каталог\n(working dir)" participant index as "Индекс\n(index)" #77FF77 participant local as "Локальный репозиторий\n(local repository)" #FF7777 participant remote as "Удалённый репозиторий\n(remote repository)" #7777FF [-> workspace : Начало работы activate workspace remote -> local : Получение изменений с сервера\ngit fetch remote -> local : Обновление подмодулей\ngit submodule update --remote --recursive workspace <-> local : Просмотр информации\ngit status workspace <-> local : Переход на ветку master\ngit checkout master local -> workspace : Слияние с удалённой веткой\ngit merge origin/master local <-> workspace : Создание новой ветки\ngit branch temp local <-> workspace : Переход на новую ветку\ngit checkout temp workspace ->o workspace : Редактирование workspace <-> local : Просмотр изменений\ngit diff workspace -> index : Занесение файлов в индекс\ngit add index -> local : Фиксация изменений\ngit commit local ->o local : Присвоение ветки осмысленного названия\ngit branch -m temp branch_name local -> remote : Отправка ветки на сервер\ngit push origin branch_name remote ->] : Создание запроса на слияние deactivate workspace @enduml ---- == Настройка [width="100%",cols="15%,35%,50%",options="header",] |=== |Команда |Ключи |Описание |`git config` |`--global user.name "John Doe"` |Имя текущего пользователя |`git config` |`--global user.email "mail@example.com"` |Почта текущего пользователя |`git config` |`--list` |Вывод текущей конфигурации |`git config` |`--global --list` |Вывод глобальной конфигурации |=== == Инициализация [width="100%",cols="15%,35%,50%",options="header",] |=== |Команда |Ключи |Описание |`git init` |`` |Создать пустой репозиторий в каталоге `` |`git clone` |`` `` |Создать в каталоге `` копию репозитория, находящегося по адресу `` |`git clone` |`--recursive ` `` |Создать в каталоге `` копию репозитория, находящегося по адресу ``, с учётом подмодулей |=== == Подмодули [width="100%",cols="15%,25%,60%",options="header",] |=== |Команда |Ключи |Описание |`git submodule` |`add ` |Добавить в каталог `` текущего репозитория подмодуль, находящийся по адресу `` |`git submodule` |`update --recursive --remote` |Обновить подмодули |`git submodule` |`sync --recursive` |Заменить адреса подмодулей на указанные в файле `.gitmodules` |=== Удаление подмодуля: [source,sh] ---- git submodule deinit git rm ---- == Фиксация [width="100%",cols="15%,20%,65%",options="header",] |=== |Команда |Ключи |Описание |`git add` |`` |Подготовить файл `` к фиксации |`git commit` | |Зафиксировать подготовленные файлы |`git commit` |`-a` |Зафиксировать все отслеживаемые файлы, которые были изменены |=== == Удаление [width="100%",cols="15%,20%,65%",options="header",] |=== |Команда |Ключи |Описание |`git rm` |`` |Удалить файл из индекса и рабочего каталога |`git rm` |`-f ` |Принудительное удаление файла |`git rm` |`--cached ` |Удаление файла из проекта, но не из рабочего каталога |=== == Информация [width="100%",cols="15%,20%,65%",options="header",] |=== |Команда |Ключи |Описание |`git status` |`-s` |Вывод информации о рабочем каталоге в краткой форме |`git log` |`--oneline` |Вывод журнала изменений в краткой форме |`git ls-files` | |Вывод списка отслеживаемых и подготовленных файлов |=== == Удалённый репозиторий [width="100%",cols="15%,20%,65%",options="header",] |=== |Команда |Ключи |Описание |`git remote` |`-v` |Список адресов удалённых репозиториев |`git branch` |`-r` |Список веток в удалённых репозиториях |`git remote` |`add ` |Создать ссылку `` на удалённый репозиторий, находящийся по адресу `` |`git remote` |`rename ` |Переименовать ссылку `` на `` |`git remote` |`rm ` |Удалить ссылку `` |=== * Обращение к удалённому репозиторию осуществляется по ссылке, создаваемой командой `git remote` * Команда `git clone` автоматически создаёт ссылку `origin` == Отправка изменений [width="100%",cols="15%,20%,65%",options="header",] |=== |Команда |Ключи |Описание |`git push` |` ` |Отправить ветку `` в удалённый репозиторий `` |`git push` |` --all` |Отправить все ветки в удалённый репозиторий `` |`git push` |`--d ` |Удалить ветку `` из удалённого репозитория `` |=== == Получение изменений [width="100%",cols="15%,20%,65%",options="header",] |=== |Команда |Ключи |Описание |`git fetch` |`` |Получить изменения из всех веток репозитория ``, но не выполнять слияние |`git fetch` |` ` |Получить изменения из ветки `` репозитория ``, но не выполнять слияние |`git merge` |`/` |Выполнить слияние с веткой `` репозитория `` |`git pull` |`` |Получение и слияние |=== == Ветки [width="100%",cols="15%,20%,65%",options="header",] |=== |Команда |Ключи |Описание |`git branch` |`-a` |Список локальных и удалённых веток |`git branch` | |Список локальных веток |`git branch` |`` |Создать ветку `` |`git checkout` |`` |Перейти к фиксации с идентификатором `` |`git branch` |`-m ` |Переименовать ветку `` в `` |`git merge` |`` |Слить изменения из ветки `` в текущую ветку |`git branch` |`-d ` |Удалить ветку `` |=== == Сравнение [width="100%",cols="15%,20%,65%",options="header",] |=== |Команда |Ключи |Описание |`git diff` | |Сравнить рабочий каталог и индекс |`git diff` |`–-cached` |Сравнить индекс и последнюю фиксацию |`git diff` |`HEAD` |Сравнить последнюю фиксацию и рабочий каталог |`git diff` |`--stat` |Краткий вывод результатов |`git diff` |` ` |Сравнить две точки с указанными идентификаторами |`git diff` |`` `` |Сравнивать только указанный каталог `` или файл `` |`git difftool` | |Отобразить результаты сравнения в программе, определяемой переменной `diff.tool` |===