= 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).
[.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
----
Основные команды, осуществляющие взаимодействие между рабочим каталогом,
индексом, локальным и удалённым репозиторием, приведены на диаграмме
ниже.
[.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
----
[.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
@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`
|===