dsp-site/wiki/Prog/Git/Git основные команды.adoc

316 lines
11 KiB
Plaintext
Raw Normal View History

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
|===
|Термин |Англ |Определение
|Рабочий каталог |working tree, working directory |Набор файлов в
текущем каталоге
|Репозиторий |repository, repo |Контейнер, хранящий историю изменений
файлов проекта
|Индекс |index, staging area |Область между рабочим каталогом и
2019-06-02 16:31:29 +00:00
репозиторием, в котором осуществляется подготовка к фиксации
2019-06-01 21:08:41 +00:00
|SHA-1 |SHA-1 |Уникальный идентификатор, отражающий информацию об
истории
|Ветка |branch |Именованная последовательность в истории изменений
|Фиксация (коммит) |commit |Набор файлов, записанных в историю
одновременно
|`HEAD` |`HEAD` |Имя ссылки на последнюю фиксацию в текущей ветке
|Метка |tag |Именованная ссылка на некоторую фиксацию в истории
|===
== Состояния
Файлы в рабочем каталоге могут отслеживаться системой контроля версий
(tracked) или нет (untracked). Отслеживаемые файлы, которые на диаграмме
обозначены зелёным фоном, могут быть неизменёнными (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
[.text-center]
.Состояния
2019-06-01 21:08:41 +00:00
[plantuml]
----
@startuml
participant untracked as "Неотслеживамые\n(untracked)"
box "Отслеживаемые"
2019-06-03 07:03:24 +00:00
participant staged as "Подготовленные к фиксации\n(indexed)" #55FF55
2019-06-01 21:08:41 +00:00
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
----
Основные команды, осуществляющие взаимодействие между рабочим каталогом,
индексом, локальным и удалённым репозиторием, приведены на диаграмме
ниже.
2019-06-02 16:31:29 +00:00
[.text-center]
.Команды
2019-06-01 21:08:41 +00:00
[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
2019-06-03 07:49:50 +00:00
@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
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
|===
|Команда |Ключи |Описание
|`git config` |`--global user.name "John Doe"` |Имя текущего
пользователя
|`git config` |`--global user.email "mail@example.com"` |Почта текущего
пользователя
|`git config` |`--list` |Вывод текущей конфигурации
|`git config` |`--global --list` |Вывод глобальной конфигурации
|===
== Инициализация
2019-06-02 16:31:29 +00:00
[width="100%",cols="15%,35%,50%",options="header",]
2019-06-01 21:08:41 +00:00
|===
|Команда |Ключи |Описание
|`git init` |`<dir>` |Создать пустой репозиторий в каталоге `<dir>`
|`git clone` |`<giturl>` `<dir>` |Создать в каталоге `<dir>` копию
репозитория, находящегося по адресу `<giturl>`
|`git clone` |`--recursive <giturl>` `<dir>` |Создать в каталоге `<dir>`
копию репозитория, находящегося по адресу `<giturl>`, с учётом
подмодулей
|===
== Подмодули
2019-06-02 16:31:29 +00:00
[width="100%",cols="15%,25%,60%",options="header",]
2019-06-01 21:08:41 +00:00
|===
|Команда |Ключи |Описание
|`git submodule` |`add <giturl> <dir>` |Добавить в каталог `<dir>`
2019-06-02 23:26:28 +00:00
текущего репозитория подмодуль, находящийся по адресу `<giturl>`
2019-06-01 21:08:41 +00:00
|`git submodule` |`update --recursive --remote` |Обновить подмодули
|`git submodule` |`sync --recursive` |Заменить адреса подмодулей на
указанные в файле `.gitmodules`
|===
Удаление подмодуля:
[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
|===
|Команда |Ключи |Описание
|`git add` |`<filename>` |Подготовить файл `<filename>` к фиксации
|`git commit` | |Зафиксировать подготовленные файлы
|`git commit` |`-a` |Зафиксировать все отслеживаемые файлы, которые были
изменены
|===
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
|===
|Команда |Ключи |Описание
2019-06-03 07:03:24 +00:00
|`git rm` |`<filename>` |Удалить файл из индекса и рабочего каталога
2019-06-01 21:08:41 +00:00
2019-06-03 07:03:24 +00:00
|`git rm` |`-f <filename>` |Принудительное удаление файла
2019-06-01 21:08:41 +00:00
2019-06-03 07:03:24 +00:00
|`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
|===
|Команда |Ключи |Описание
2019-06-03 07:03:24 +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
|===
|Команда |Ключи |Описание
2019-06-03 07:03:24 +00:00
|`git remote` |`-v` |Список адресов удалённых репозиториев
2019-06-01 21:08:41 +00:00
2019-06-03 07:03:24 +00:00
|`git branch` |`-r` |Список веток в удалённых репозиториях
2019-06-01 21:08:41 +00:00
2019-06-03 07:03:24 +00:00
|`git remote` |`add <name> <url>` |Создать ссылку `<name>` на удалённый
репозиторий, находящийся по адресу `<url>`
2019-06-01 21:08:41 +00:00
2019-06-03 07:03:24 +00:00
|`git remote` |`rename <old> <new>` |Переименовать ссылку `<old>` на
`<new>`
2019-06-01 21:08:41 +00:00
2019-06-03 07:03:24 +00:00
|`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
|===
|Команда |Ключи |Описание
2019-06-03 07:03:24 +00:00
|`git push` |`<remote> <branch>` |Отправить ветку `<branch>` в удалённый
репозиторий `<remote>`
2019-06-01 21:08:41 +00:00
2019-06-03 07:03:24 +00:00
|`git push` |`<remote> --all` |Отправить все ветки в удалённый
репозиторий `<remote>`
2019-06-01 21:08:41 +00:00
2019-06-03 07:03:24 +00:00
|`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
|===
|Команда |Ключи |Описание
|`git fetch` |`<remote>` |Получить изменения из всех веток репозитория
`<remote>`, но не выполнять слияние
2019-06-01 21:08:41 +00:00
2019-06-03 07:03:24 +00:00
|`git fetch` |`<remote> <branch>` |Получить изменения из ветки
`<branch>` репозитория `<remote>`, но не выполнять слияние
2019-06-01 21:08:41 +00:00
2019-06-03 07:03:24 +00:00
|`git merge` |`<remote>/<branch>` |Выполнить слияние с веткой `<branch>`
репозитория `<remote>`
2019-06-01 21:08:41 +00:00
2019-06-03 07:03:24 +00:00
|`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
|===
|Команда |Ключи |Описание
2019-06-03 07:03:24 +00:00
|`git branch` |`-a` |Список локальных и удалённых веток
2019-06-01 21:08:41 +00:00
2019-06-03 07:03:24 +00:00
|`git branch` | |Список локальных веток
2019-06-01 21:08:41 +00:00
2019-06-03 07:03:24 +00:00
|`git branch` |`<branch>` |Создать ветку `<branch>`
2019-06-01 21:08:41 +00:00
2019-06-03 07:03:24 +00:00
|`git checkout` |`<sha-1>` |Перейти к фиксации с идентификатором
`<sha-1>`
2019-06-01 21:08:41 +00:00
2019-06-03 07:03:24 +00:00
|`git branch` |`-m <old> <new>` |Переименовать ветку `<old>` в `<new>`
2019-06-01 21:08:41 +00:00
2019-06-03 07:03:24 +00:00
|`git merge` |`<branch>` |Слить изменения из ветки `<branch>` в текущую
ветку
2019-06-01 21:08:41 +00:00
2019-06-03 07:03:24 +00:00
|`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
|===
2019-06-03 07:03:24 +00:00
|Команда |Ключи |Описание
|`git diff` | |Сравнить рабочий каталог и индекс
2019-06-01 21:08:41 +00:00
2019-06-03 07:03:24 +00:00
|`git diff` |`-cached` |Сравнить индекс и последнюю фиксацию
2019-06-01 21:08:41 +00:00
2019-06-03 07:03:24 +00:00
|`git diff` |`HEAD` |Сравнить последнюю фиксацию и рабочий каталог
2019-06-01 21:08:41 +00:00
2019-06-03 07:03:24 +00:00
|`git diff` |`--stat` |Краткий вывод результатов
2019-06-01 21:08:41 +00:00
2019-06-03 07:03:24 +00:00
|`git diff` |`<sha-1> <sha-1>` |Сравнить две точки с указанными
идентификаторами
2019-06-01 21:08:41 +00:00
2019-06-03 07:03:24 +00:00
|`git diff` |`<dir>` `<file>` |Сравнивать только указанный каталог
`<dir>` или файл `<file>`
2019-06-01 21:08:41 +00:00
2019-06-03 07:03:24 +00:00
|`git difftool` | |Отобразить результаты сравнения в программе,
определяемой переменной `diff.tool`
|===