2019-06-01 21:08:41 +00:00
|
|
|
|
= Git: основные команды
|
2019-06-02 16:31:29 +00:00
|
|
|
|
:title-separator: {sp}|
|
2019-06-01 21:08:41 +00:00
|
|
|
|
:category: Программирование
|
|
|
|
|
:tags: программирование, git
|
2019-06-02 16:31:29 +00:00
|
|
|
|
:toc:
|
2019-06-01 21:08:41 +00:00
|
|
|
|
|
|
|
|
|
== Ссылки
|
|
|
|
|
|
|
|
|
|
* 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
|
|
|
|
|
----
|
|
|
|
|
|
|
|
|
|
== Термины
|
|
|
|
|
|
2019-06-02 16:31:29 +00:00
|
|
|
|
[width="100%",cols="18%,20%,62%",options="header",]
|
2019-06-01 21:08:41 +00:00
|
|
|
|
|===
|
2020-04-11 17:59:22 +00:00
|
|
|
|
| Термин | Англ | Определение
|
|
|
|
|
| Рабочий каталог | working tree, working directory | Набор файлов в текущем каталоге
|
|
|
|
|
| Репозиторий | repository, repo | Контейнер, хранящий историю изменений файлов проекта
|
|
|
|
|
| Индекс | index, staging area | Область между рабочим каталогом и репозиторием, в котором осуществляется подготовка к фиксации
|
|
|
|
|
| SHA-1 | SHA-1 | Уникальный идентификатор, отражающий информацию об истории
|
|
|
|
|
| Ветка | branch | Именованная последовательность в истории изменений
|
|
|
|
|
| Фиксация (коммит) | commit | Набор файлов, записанных в историю одновременно
|
|
|
|
|
| `HEAD` | `HEAD` | Имя ссылки на последнюю фиксацию в текущей ветке
|
|
|
|
|
| Метка | tag | Именованная ссылка на некоторую фиксацию в истории
|
2019-06-01 21:08:41 +00:00
|
|
|
|
|===
|
|
|
|
|
|
|
|
|
|
== Состояния
|
|
|
|
|
|
|
|
|
|
Файлы в рабочем каталоге могут отслеживаться системой контроля версий
|
2019-06-03 13:39:27 +00:00
|
|
|
|
(tracked) или нет (untracked). Отслеживаемые файлы, которые на
|
|
|
|
|
<<states,диаграмме>>
|
2019-06-01 21:08:41 +00:00
|
|
|
|
обозначены зелёным фоном, могут быть неизменёнными (unmodified),
|
2019-06-03 07:03:24 +00:00
|
|
|
|
изменёнными (modified) или подготовленными к фиксации (indexed).
|
2019-06-01 21:08:41 +00:00
|
|
|
|
|
2019-06-02 16:31:29 +00:00
|
|
|
|
|
2019-06-03 13:39:27 +00:00
|
|
|
|
[[states]]
|
2019-06-02 16:31:29 +00:00
|
|
|
|
[.text-center]
|
|
|
|
|
.Состояния
|
2019-06-01 21:08:41 +00:00
|
|
|
|
[plantuml]
|
|
|
|
|
----
|
|
|
|
|
@startuml
|
2019-08-29 14:19:41 +00:00
|
|
|
|
skinparam padding 16
|
|
|
|
|
|
2020-04-11 17:59:22 +00:00
|
|
|
|
participant untracked as "Неотслеживамые\n(untracked)"
|
2019-06-01 21:08:41 +00:00
|
|
|
|
box "Отслеживаемые"
|
2020-04-11 17:59:22 +00:00
|
|
|
|
participant staged as "Подготовленные к фиксации\n(indexed)" #55FF55
|
2019-06-01 21:08:41 +00:00
|
|
|
|
participant unmodified as "Неизменённые\n(unmodified)" #99FF99
|
2020-04-11 17:59:22 +00:00
|
|
|
|
participant modified as "Изменённые\n(modified)" #77FF77
|
2019-06-01 21:08:41 +00:00
|
|
|
|
end box
|
|
|
|
|
|
2020-04-11 17:59:22 +00:00
|
|
|
|
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
|
2019-06-01 21:08:41 +00:00
|
|
|
|
@enduml
|
|
|
|
|
----
|
|
|
|
|
|
|
|
|
|
Основные команды, осуществляющие взаимодействие между рабочим каталогом,
|
2019-06-03 13:39:27 +00:00
|
|
|
|
индексом, локальным и удалённым репозиторием, приведены на <<commands,диаграмме>>.
|
2019-06-02 16:31:29 +00:00
|
|
|
|
|
2019-06-03 13:39:27 +00:00
|
|
|
|
[[commands]]
|
2019-06-02 16:31:29 +00:00
|
|
|
|
[.text-center]
|
|
|
|
|
.Команды
|
2019-06-01 21:08:41 +00:00
|
|
|
|
[plantuml]
|
|
|
|
|
----
|
|
|
|
|
@startuml
|
2019-08-29 14:19:41 +00:00
|
|
|
|
skinparam padding 16
|
|
|
|
|
|
2019-06-01 21:08:41 +00:00
|
|
|
|
participant workspace as "Рабочий каталог\n(working dir)"
|
2020-04-11 17:59:22 +00:00
|
|
|
|
participant index as "Индекс\n(index)" #77FF77
|
|
|
|
|
participant local as "Локальный репозиторий\n(local repository)" #FF7777
|
|
|
|
|
participant remote as "Удалённый репозиторий\n(remote repository)" #7777FF
|
2019-06-01 21:08:41 +00:00
|
|
|
|
|
|
|
|
|
workspace -> local : git commit -a
|
|
|
|
|
workspace -> index : git add (-u)
|
2020-04-11 17:59:22 +00:00
|
|
|
|
index -> local : git commit
|
|
|
|
|
local -> remote : git push
|
2019-06-01 21:08:41 +00:00
|
|
|
|
|
|
|
|
|
== Обновление с сервера ==
|
|
|
|
|
|
|
|
|
|
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
|
|
|
|
|
|
2019-06-03 07:49:50 +00:00
|
|
|
|
@enduml
|
|
|
|
|
----
|
|
|
|
|
|
2019-06-03 13:39:27 +00:00
|
|
|
|
Пример последовательности действий, выполняемых пользователем в совместном
|
|
|
|
|
проекте, приведён на <<workflow,диаграмме>>.
|
|
|
|
|
|
|
|
|
|
[[workflow]]
|
2019-06-03 07:49:50 +00:00
|
|
|
|
[.text-center]
|
|
|
|
|
.Последовательность действий
|
|
|
|
|
[plantuml]
|
|
|
|
|
----
|
|
|
|
|
@startuml
|
2019-08-29 14:19:41 +00:00
|
|
|
|
skinparam defaultFontSize 24
|
|
|
|
|
skinparam padding 16
|
|
|
|
|
|
2019-06-03 07:49:50 +00:00
|
|
|
|
participant workspace as "Рабочий каталог\n(working dir)"
|
2020-04-11 17:59:22 +00:00
|
|
|
|
participant index as "Индекс\n(index)" #77FF77
|
|
|
|
|
participant local as "Локальный репозиторий\n(local repository)" #FF7777
|
|
|
|
|
participant remote as "Удалённый репозиторий\n(remote repository)" #7777FF
|
2019-06-03 07:49:50 +00:00
|
|
|
|
|
2019-06-03 13:39:27 +00:00
|
|
|
|
[-> workspace : <font color=red>Начало работы</font>
|
|
|
|
|
activate workspace
|
2020-04-11 17:59:22 +00:00
|
|
|
|
remote -> local : <font color=red>Получение изменений с сервера</font>\n<b>git fetch</b>
|
|
|
|
|
remote -> local : <font color=red>Обновление подмодулей</font>\n<b>git submodule update --recursive --init</b>
|
|
|
|
|
workspace <-> local : <font color=red>Просмотр информации</font>\n<b>git status</b>
|
|
|
|
|
workspace <-> local : <font color=red>Переход на ветку master</font>\n<b>git checkout master</b>
|
|
|
|
|
local -> workspace : <font color=red>Слияние с удалённой веткой</font>\n<b>git merge origin/master</b>
|
|
|
|
|
local <-> workspace : <font color=red>Создание новой ветки</font>\n<b>git branch temp</b>
|
|
|
|
|
local <-> workspace : <font color=red>Переход на новую ветку</font>\n<b>git checkout temp</b>
|
2019-06-03 13:39:27 +00:00
|
|
|
|
workspace ->o workspace : <font color=red>Редактирование</font>
|
2020-04-11 17:59:22 +00:00
|
|
|
|
workspace <-> local : <font color=red>Просмотр изменений</font>\n<b>git diff</b>
|
|
|
|
|
workspace -> index : <font color=red>Занесение файлов в индекс</font>\n<b>git add</b>
|
|
|
|
|
index -> local : <font color=red>Фиксация изменений</font>\n<b>git commit</b>
|
|
|
|
|
local ->o local : <font color=red>Присвоение ветки осмысленного названия</font>\n<b>git branch -m temp branch_name</b>
|
|
|
|
|
local ->o local : <font color=red>Переход на ветку</font>\n<b>git checkout branch_name</b>
|
|
|
|
|
remote -> local : <font color=red>Получение изменений с сервера</font>\n<b>git fetch</b>
|
|
|
|
|
local ->o local : <font color=red>Слияние изменений с сервера в текущую ветку (branch_name)</font>\n<b>git merge origin/master</b>
|
|
|
|
|
local -> remote : <font color=red>Отправка ветки на сервер</font>\n<b>git push origin branch_name</b>
|
|
|
|
|
remote ->] : <font color=red>Создание запроса на слияние</font>
|
2019-06-03 13:39:27 +00:00
|
|
|
|
deactivate workspace
|
2019-06-01 21:08:41 +00:00
|
|
|
|
@enduml
|
|
|
|
|
----
|
|
|
|
|
|
|
|
|
|
== Настройка
|
|
|
|
|
|
2019-06-02 16:31:29 +00:00
|
|
|
|
[width="100%",cols="15%,35%,50%",options="header",]
|
2019-06-01 21:08:41 +00:00
|
|
|
|
|===
|
2020-04-11 17:59:22 +00:00
|
|
|
|
| Команда | Ключи | Описание
|
|
|
|
|
| `git config` | `--global user.name "John Doe"` | Имя текущего пользователя
|
|
|
|
|
| `git config` | `--global user.email "mail@example.com"` | Почта текущего пользователя
|
|
|
|
|
| `git config` | `--list` | Вывод текущей конфигурации
|
|
|
|
|
| `git config` | `--global --list` | Вывод глобальной конфигурации
|
2019-06-01 21:08:41 +00:00
|
|
|
|
|===
|
|
|
|
|
|
|
|
|
|
== Инициализация
|
|
|
|
|
|
2019-06-02 16:31:29 +00:00
|
|
|
|
[width="100%",cols="15%,35%,50%",options="header",]
|
2019-06-01 21:08:41 +00:00
|
|
|
|
|===
|
2020-04-11 17:59:22 +00:00
|
|
|
|
| Команда | Ключи | Описание
|
|
|
|
|
| `git init` | `<dir>` | Создать пустой репозиторий в каталоге `<dir>`
|
|
|
|
|
| `git clone` | `<giturl>` `<dir>` | Создать в каталоге `<dir>` копию репозитория, находящегося по адресу `<giturl>`
|
|
|
|
|
| `git clone` | `--recursive <giturl>` `<dir>` | Создать в каталоге `<dir>` копию репозитория, находящегося по адресу `<giturl>`, с учётом подмодулей
|
2019-06-01 21:08:41 +00:00
|
|
|
|
|===
|
|
|
|
|
|
|
|
|
|
== Подмодули
|
|
|
|
|
|
2019-06-02 16:31:29 +00:00
|
|
|
|
[width="100%",cols="15%,25%,60%",options="header",]
|
2019-06-01 21:08:41 +00:00
|
|
|
|
|===
|
2020-04-11 17:59:22 +00:00
|
|
|
|
| Команда | Ключи | Описание
|
|
|
|
|
| `git submodule` | `add <giturl> <dir>` | Добавить в каталог `<dir>` текущего репозитория подмодуль, находящийся по адресу `<giturl>`
|
|
|
|
|
| `git submodule` | `update --recursive --remote` | Обновить подмодули
|
|
|
|
|
| `git submodule` | `sync --recursive` | Заменить адреса подмодулей на указанные в файле `.gitmodules`
|
2019-06-01 21:08:41 +00:00
|
|
|
|
|===
|
|
|
|
|
|
|
|
|
|
Удаление подмодуля:
|
|
|
|
|
|
|
|
|
|
[source,sh]
|
|
|
|
|
----
|
|
|
|
|
git submodule deinit <path/to/submodule>
|
|
|
|
|
git rm <path/to/submodule>
|
|
|
|
|
----
|
|
|
|
|
|
|
|
|
|
== Фиксация
|
|
|
|
|
|
2019-06-03 07:49:50 +00:00
|
|
|
|
[width="100%",cols="15%,20%,65%",options="header",]
|
2019-06-01 21:08:41 +00:00
|
|
|
|
|===
|
2020-04-11 17:59:22 +00:00
|
|
|
|
| Команда | Ключи | Описание
|
|
|
|
|
| `git add` | `<filename>` | Подготовить файл `<filename>` к фиксации
|
|
|
|
|
| `git commit` | | Зафиксировать подготовленные файлы
|
|
|
|
|
| `git commit` | `-a` | Зафиксировать все отслеживаемые файлы, которые были изменены
|
2019-06-01 21:08:41 +00:00
|
|
|
|
|===
|
|
|
|
|
|
2019-06-03 07:03:24 +00:00
|
|
|
|
== Удаление
|
2019-06-01 21:08:41 +00:00
|
|
|
|
|
2019-06-03 07:49:50 +00:00
|
|
|
|
[width="100%",cols="15%,20%,65%",options="header",]
|
2019-06-01 21:08:41 +00:00
|
|
|
|
|===
|
2020-04-11 17:59:22 +00:00
|
|
|
|
| Команда | Ключи | Описание
|
|
|
|
|
| `git rm` | `<filename>` | Удалить файл из индекса и рабочего каталога
|
|
|
|
|
| `git rm` | `-f <filename>` | Принудительное удаление файла
|
|
|
|
|
| `git rm` | `--cached <filename>` | Удаление файла из проекта, но не из рабочего каталога
|
2019-06-01 21:08:41 +00:00
|
|
|
|
|===
|
|
|
|
|
|
2019-06-03 07:03:24 +00:00
|
|
|
|
== Информация
|
2019-06-01 21:08:41 +00:00
|
|
|
|
|
2019-06-03 07:49:50 +00:00
|
|
|
|
[width="100%",cols="15%,20%,65%",options="header",]
|
2019-06-01 21:08:41 +00:00
|
|
|
|
|===
|
2020-04-11 17:59:22 +00:00
|
|
|
|
| Команда | Ключи | Описание
|
|
|
|
|
| `git status` | `-s` | Вывод информации о рабочем каталоге в краткой форме
|
|
|
|
|
| `git log` | `--oneline` | Вывод журнала изменений в краткой форме
|
|
|
|
|
| `git ls-files` | | Вывод списка отслеживаемых и подготовленных файлов
|
2019-06-01 21:08:41 +00:00
|
|
|
|
|===
|
|
|
|
|
|
2019-06-03 07:03:24 +00:00
|
|
|
|
== Удалённый репозиторий
|
2019-06-01 21:08:41 +00:00
|
|
|
|
|
2019-06-03 07:49:50 +00:00
|
|
|
|
[width="100%",cols="15%,20%,65%",options="header",]
|
2019-06-01 21:08:41 +00:00
|
|
|
|
|===
|
2020-04-11 17:59:22 +00:00
|
|
|
|
| Команда | Ключи | Описание
|
|
|
|
|
| `git remote` | `-v` | Список адресов удалённых репозиториев
|
|
|
|
|
| `git branch` | `-r` | Список веток в удалённых репозиториях
|
|
|
|
|
| `git remote` | `add <name> <url>` | Создать ссылку `<name>` на удалённый репозиторий, находящийся по адресу `<url>`
|
|
|
|
|
| `git remote` | `rename <old> <new>` | Переименовать ссылку `<old>` на `<new>`
|
|
|
|
|
| `git remote` | `rm <name>` | Удалить ссылку `<name>`
|
2019-06-01 21:08:41 +00:00
|
|
|
|
|===
|
|
|
|
|
|
2019-06-03 07:03:24 +00:00
|
|
|
|
* Обращение к удалённому репозиторию осуществляется по ссылке,
|
|
|
|
|
создаваемой командой `git remote`
|
|
|
|
|
* Команда `git clone` автоматически создаёт ссылку `origin`
|
2019-06-01 21:08:41 +00:00
|
|
|
|
|
2019-06-03 07:03:24 +00:00
|
|
|
|
== Отправка изменений
|
2019-06-01 21:08:41 +00:00
|
|
|
|
|
2019-06-03 07:49:50 +00:00
|
|
|
|
[width="100%",cols="15%,20%,65%",options="header",]
|
2019-06-01 21:08:41 +00:00
|
|
|
|
|===
|
2020-04-11 17:59:22 +00:00
|
|
|
|
| Команда | Ключи | Описание
|
|
|
|
|
| `git push` | `<remote> <branch>` | Отправить ветку `<branch>` в удалённый репозиторий `<remote>`
|
|
|
|
|
| `git push` | `<remote> --all` | Отправить все ветки в удалённый репозиторий `<remote>`
|
|
|
|
|
| `git push` | `--d <remote> <branch>` | Удалить ветку `<branch>` из удалённого репозитория `<remote>`
|
2019-06-01 21:08:41 +00:00
|
|
|
|
|===
|
|
|
|
|
|
2019-06-03 07:03:24 +00:00
|
|
|
|
== Получение изменений
|
2019-06-01 21:08:41 +00:00
|
|
|
|
|
2019-06-03 07:49:50 +00:00
|
|
|
|
[width="100%",cols="15%,20%,65%",options="header",]
|
2019-06-03 07:03:24 +00:00
|
|
|
|
|===
|
2020-04-11 18:06:02 +00:00
|
|
|
|
| Команда | Ключи | Описание
|
|
|
|
|
| `git fetch` | `<remote>` | Получить изменения из всех веток репозитория `<remote>`, но не выполнять слияние
|
|
|
|
|
| `git fetch` | `<remote> <branch>` | Получить изменения из ветки `<branch>` репозитория `<remote>`, но не выполнять слияние
|
|
|
|
|
| `git merge` | `<remote>/<branch>` | Выполнить слияние с веткой `<branch>` репозитория `<remote>`
|
|
|
|
|
| `git pull` | `<remote>` | Получение и слияние
|
2019-06-01 21:08:41 +00:00
|
|
|
|
|===
|
|
|
|
|
|
2019-06-03 07:03:24 +00:00
|
|
|
|
== Ветки
|
2019-06-01 21:08:41 +00:00
|
|
|
|
|
2019-06-03 07:49:50 +00:00
|
|
|
|
[width="100%",cols="15%,20%,65%",options="header",]
|
2019-06-01 21:08:41 +00:00
|
|
|
|
|===
|
|
|
|
|
|Команда |Ключи |Описание
|
2020-04-11 18:06:02 +00:00
|
|
|
|
| `git branch` | `-a` | Список локальных и удалённых веток
|
|
|
|
|
| `git branch` | | Список локальных веток
|
|
|
|
|
| `git branch` | `<branch>` | Создать ветку `<branch>`
|
|
|
|
|
| `git checkout` | `<sha-1>` | Перейти к фиксации с идентификатором `<sha-1>`
|
|
|
|
|
| `git branch` | `-m <old> <new>` | Переименовать ветку `<old>` в `<new>`
|
|
|
|
|
| `git merge` | `<branch>` | Слить изменения из ветки `<branch>` в текущую ветку
|
|
|
|
|
| `git branch` | `-d <branch>` | Удалить ветку `<branch>`
|
2019-06-01 21:08:41 +00:00
|
|
|
|
|===
|
|
|
|
|
|
2019-06-03 07:03:24 +00:00
|
|
|
|
== Сравнение
|
2019-06-01 21:08:41 +00:00
|
|
|
|
|
2019-06-03 07:49:50 +00:00
|
|
|
|
[width="100%",cols="15%,20%,65%",options="header",]
|
2019-06-01 21:08:41 +00:00
|
|
|
|
|===
|
2020-04-11 18:06:02 +00:00
|
|
|
|
| Команда | Ключи | Описание
|
|
|
|
|
| `git diff` | | Сравнить рабочий каталог и индекс
|
|
|
|
|
| `git diff` | `–-cached` | Сравнить индекс и последнюю фиксацию
|
|
|
|
|
| `git diff` | `HEAD` | Сравнить последнюю фиксацию и рабочий каталог
|
|
|
|
|
| `git diff` | `--stat` | Краткий вывод результатов
|
|
|
|
|
| `git diff` | `<sha-1> <sha-1>` | Сравнить две точки с указанными идентификаторами
|
|
|
|
|
| `git diff` | `<dir>` `<file>` | Сравнивать только указанный каталог `<dir>` или файл `<file>`
|
|
|
|
|
| `git difftool` | | Отобразить результаты сравнения в программе, определяемой переменной `diff.tool`
|
2019-06-03 07:03:24 +00:00
|
|
|
|
|===
|