Команды и глоссарий
· Внимание статья очень большая.
Эта сатья посвящёна командам Git. Я постараюсь сделать его доступным даже для новичков, поэтому начну с краткого введения в основные концепции.
Git: теперь это не только инструмент для разработчиков!
Когда-то Git считался сугубо профессиональным инструментом для программистов. Сегодня он стал незаменим для блогеров, писателей и всех, кто любит структурировать заметки (Personal Knowledge Management, PKM) — особенно в связке с такими приложениями, как Obsidian или Logseq.
Что такое Git?
Простыми словами, Git — это система контроля версий (VCS). Она записывает изменения файлов и позволяет при необходимости вернуться к любому более раннему состоянию. Git фиксирует историю изменений кода или документов, помогает нескольким людям работать совместно и избегать конфликтов. По сути, это цифровое рабочее пространство, где всё безопасно «сохраняется» и «расшаривается».
Представьте, что вы пишете роман, затем передумываете и хотите «откатиться к версии недельной давности». Git делает такое «волшебство» реальностью.
Основные понятия Git
Рабочий процесс Git
[Рабочий каталог (Working Directory)] 🖥️
|
| (редактирование, добавление, удаление файлов)
|
| git add <файл> (добавить изменения в индекс)
↓ ↓
[Область индексирования (Staging Area)] 📦
|
| git commit -m "сообщение" (сохранить изменения в локальный репозиторий)
↓
[Локальный репозиторий (Local Repository)] 🏠
|
| git push origin <ветка> (отправить изменения в удалённый репозиторий)
↓
[Удалённый репозиторий (Remote Repository)] 🌍
|
| git pull origin <ветка> (git fetch + git merge)
↓
[Локальный репозиторий коллеги] 🏠
|
| (здесь может произойти git merge)
|
| (при необходимости разрешение конфликта)
↓
[Рабочий каталог коллеги] 🖥️
Глоссарий терминов Git
| Термин | Описание | Пример использования |
|---|---|---|
| Рабочий каталог (Working Directory) | Каталог проекта, над которым вы работаете. Здесь находятся файлы, отслеживаемые Git; это пространство для их редактирования. | git status для проверки состояния рабочего каталога |
| Область индексирования (Staging Area / Index) | Промежуточная область, куда вы временно сохраняете изменения перед фиксацией (коммитом). Файлы добавляются командой git add. | git add <файл> (добавить файл в индекс) |
| Index | Синоним Staging Area. Внутренняя структура данных Git для отслеживания состояния файлов. | git ls-files --stage (просмотр файлов в индексе) |
| Worktree (рабочее дерево) | Функция, позволяющая управлять несколькими рабочими каталогами из одного репозитория. Полезна для параллельной работы на разных ветках. | git worktree add <путь> <ветка> (добавить новый рабочий каталог) |
| HEAD | Указатель на последний коммит текущей ветки. | git checkout main (HEAD указывает на ветку main) |
| Отсоединённый HEAD (Detached HEAD) | Состояние, когда HEAD указывает напрямую на конкретный коммит, а не на ветку. Коммиты, созданные в этом состоянии, не принадлежат ни одной ветке — будьте осторожны. | git checkout <хэш-коммита> (переход в состояние Detached HEAD) |
| Репозиторий (Repository) | Хранилище проекта, управляемое Git. Бывает локальным и удалённым. | git init (создать локальный репозиторий), git clone <URL> (клонировать удалённый репозиторий) |
| Коммит (Commit) | Действие по сохранению изменений в файлах. Каждый коммит идентифицируется уникальным хэшем. | git commit -m "сообщение" |
| Ветка (Branch) | Создание независимой версии кода. По умолчанию существует ветка main или master. | git branch feature-branch (создать новую ветку) |
| Checkout | Команда для переключения на другую ветку или коммит. | git checkout feature-branch (переключиться на ветку) |
| Слияние (Merge) | Объединение изменений из двух веток в одну. | git merge feature-branch (влить feature-branch в текущую ветку) |
| Pull (вытянуть) | Получение изменений из удалённого репозитория и их слияние с локальной веткой. | git pull origin main |
| Push (отправить) | Отправка локальных изменений в удалённый репозиторий. | git push origin feature-branch |
| Fetch (получить) | Загрузка изменений из удалённого репозитория без автоматического слияния. | git fetch origin |
| Clone (клонировать) | Создание локальной копии удалённого репозитория. | git clone https://github.com/user/repo.git |
| Fork (форкнуть) | Копирование чужого удалённого репозитория в свой аккаунт (на GitHub). Обычно используется для участия в open-source. | Кнопка «Fork» на GitHub |
| Pull Request (PR) | Запрос владельцу оригинального репозитория на включение ваших изменений. | Кнопка «New Pull Request» на GitHub |
| Stash (спрятать) | Временное сохранение незавершённых изменений, чтобы очистить рабочий каталог. | git stash (временно сохранить), git stash pop (восстановить сохранённое) |
| Rebase (перебазировать) | Перенос коммитов текущей ветки на вершину другой ветки для создания линейной истории. | git rebase main |
| Тег (Tag) | Присвоение имени конкретному коммиту, обычно для отметки версий релиза. | git tag v1.0.0 |
| Remote (удалённый репозиторий) | Ссылка на удалённый репозиторий. Обычно имеет имя origin. | git remote add origin <URL> |
| Конфликт (Conflict) | Ситуация, когда при слиянии двух веток один и тот же фрагмент файла был изменён по-разному. Требует ручного разрешения. | Возникает при слиянии; нужно разрешить вручную |
| Cherry-pick | Применение выбранного коммита из другой ветки к текущей. | git cherry-pick <хэш-коммита> |
| Reset (сбросить) | Перемещение HEAD текущей ветки на указанный коммит. Опции --soft, --mixed, --hard меняют поведение. | git reset --hard HEAD~1 (полностью откатиться на один коммит назад) |
| Revert (отменить) | Создание нового коммита, который отменяет изменения указанного коммита. | git revert <хэш-коммита> |
| Blame (просмотр авторства) | Показывает для каждой строки файла, кто и когда внёс последнее изменение. | git blame <файл> |
| Log (журнал) | Просмотр истории коммитов. | git log |
| Diff (разница) | Сравнение изменений в файлах. | git diff (сравнить рабочий каталог с индексом) |
| Stage | Добавить изменения в область индексирования перед коммитом. | git add <файл> |
| Unstage | Убрать изменения из области индексирования. | git reset <файл> |
| Ignore (игнорировать) | Настроить файлы или каталоги, которые Git не должен отслеживать. Определяется в .gitignore. | Добавить node_modules/ в .gitignore |
| Субмодуль (Submodule) | Включение другого Git-репозитория в текущий проект. | git submodule add <URL> |
| Bisect (бинарный поиск) | Поиск коммита, в котором появился баг, методом бинарного поиска. | git bisect start, git bisect bad, git bisect good |
| Хуки (Hooks) | Скрипты, автоматически запускаемые при определённых событиях Git (например, перед коммитом). Хранятся в каталоге .git/hooks. | Хуки pre-commit, post-commit |
| Reflog | Журнал всех перемещений HEAD в локальном репозитории. Позволяет восстановить коммиты, на которые больше ничего не указывает. | git reflog |
| Upstream (вышестоящая ветка) | Базовая ветка на удалённом репозитории, с которой связана локальная ветка. Обычно origin/main или origin/master. | git push --set-upstream origin feature-branch (установить upstream) |
Важность указателей (пойнтеров)
Git работает на основе множества концепций и команд, но в его сердце лежат указатели (pointers). Указатели ссылаются на конкретные коммиты или объекты в репозитории — через хэш коммита, имя ветки, имя тега. Благодаря им возможна эффективная работа с версиями и ветками.
1. Указатель HEAD
- Указывает на последний коммит текущей ветки.
- Хранится в файле
.git/HEAD. Там может быть имя ветки (например,ref: refs/heads/main) или непосредственно хэш коммита (в состоянии detached HEAD). - Если выполнить
git checkoutс хэшем коммита, HEAD перейдёт в «отсоединённое состояние» и будет указывать прямо на коммит, а не на ветку.
Способы ссылаться на коммиты относительно HEAD
-
HEAD^— первый родительский коммит того, на что указывает HEAD.HEAD^^— коммит двумя поколениями выше.HEAD^2— второй родитель (полезно для merge-коммитов). -
HEAD~— первый родитель.HEAD~2— коммит двумя поколениями выше (всегда по линии первого родителя).
Разница между ^ и ~
Для коммитов с одним родителем они эквивалентны.
Для merge-коммита (два родителя):
-
HEAD^2→ второй родитель. -
HEAD~2→ два шага назад по первому родителю.
Пример
Допустим, ветка feature была влита в main с созданием merge-коммита M:
A---B---C---M (main)
\ /
D---E (feature)
-
git show HEAD^2(HEAD на M) покажет коммит E (второй родитель). -
git show HEAD~2покажет коммит B (два шага назад по первому родителю).
2. Указатели веток
- Каждая ветка указывает на свой последний коммит.
- Хранятся в
.git/refs/heads/. - При создании нового коммита указатель текущей ветки автоматически перемещается вперёд.
3. Указатели тегов
- Постоянно указывают на конкретный коммит (обычно не изменяются после создания).
- Хранятся в
.git/refs/tags/.
4. Указатели удалённых веток
- Хранятся в
.git/refs/remotes/. - Обновляются при выполнении
git fetch.
Все эти указатели — ключевой механизм Git, основа управления версиями и ветками. Особенно важны HEAD и указатели веток, которые делают возможной распределённую работу.
Команды Git
1. Настройка репозитория
git config
git config управляет настройками Git. С его помощью можно задать имя пользователя, email, редактор, псевдонимы (алиасы) и многое другое. Настройки бывают трёх уровней: system (все пользователи), global (один пользователь), local (конкретный репозиторий).
-
system (не используется часто).
macOS/Linux:/etc/gitconfig(или/usr/local/etc/gitconfigпри установке через Homebrew).
Windows:C:\Program Files\Git\etc\gitconfig. -
global —
~/.gitconfig. -
local —
<репозиторий>/.git/config.
Приоритет: local > global > system.
| Команда | Описание |
|---|---|
git config --list | Показать все текущие настройки. |
git config --global | Управлять глобальными настройками. |
git config --local | Управлять настройками конкретного репозитория. |
git config --get <ключ> | Показать значение конкретного ключа. |
git config --add <ключ> <значение> | Добавить новую настройку. |
git config --unset <ключ> | Удалить настройку. |
git config -e (или --edit) | Открыть конфигурационный файл в редакторе. |
git config --show-origin | Показать, откуда взялось значение настройки. |
Примеры:
# Показать все настройки
git config --list
# Показать глобальные настройки
git config --global --list
# Установить глобальное имя пользователя
git config --global user.name "Иван Иванов"
# Установить глобальный email
git config --global user.email "ivan@example.com"
# Получить значение user.name
git config --get user.name
# Удалить глобальную настройку user.name
git config --global --unset user.name
# Открыть глобальный конфиг в редакторе
git config --global --edit
# Узнать источник значения user.name
git config --show-origin user.name
git alias
Алиасы (псевдонимы) позволяют создавать короткие имена для часто используемых длинных команд.
1. Настройка через git config
# Популярные алиасы
git config --global alias.co checkout
git config --global alias.br branch
git config --global alias.ci commit
git config --global alias.st status
git config --global alias.unstage 'reset HEAD --'
git config --global alias.last 'log -1 HEAD'
git config --global alias.amend 'commit --amend'
# Посмотреть все алиасы
git config --get-regexp alias
# Удалить алиас
git config --global --unset alias.ко
# Использование
git co main # git checkout main
git br # git branch
git ci -m "текст"
git st
git unstage file.txt
git last
git amend
2. Вручную в .gitconfig (добавьте в файл секцию [alias]):
[alias]
co = checkout
br = branch
ci = commit
st = status
last = log -1 HEAD
lg = log --oneline --graph --decorate --all
2. Инициализация и клонирование
git init
Создаёт новый Git-репозиторий: в текущем или указанном каталоге появляется скрытая папка .git.
| Команда | Описание |
|---|---|
git init | Инициализировать репозиторий в текущем каталоге. |
git init <каталог> | Инициализировать в указанном каталоге. |
git init --bare | Создать «голый» репозиторий (без рабочего каталога). |
git init --quiet | Минимум вывода. |
git init --initial-branch <имя> | Задать имя начальной ветки (по умолчанию main). |
Примеры:
bash
git init
git init my-repo
git init --bare
git init --quiet
git init --initial-branch develop
git clone
Клонирует существующий удалённый репозиторий в локальный.
| Команда | Описание |
|---|---|
git clone <репозиторий> | Клонировать в текущий каталог (создаст подкаталог). |
git clone <репозиторий> <каталог> | Клонировать в указанный каталог. |
git clone --branch <ветка> | Клонировать только определённую ветку. |
git clone --depth <глубина> | Частичное клонирование (shallow clone) с историей указанной глубины. |
git clone --single-branch | Клонировать только одну ветку. |
git clone --recurse-submodules | Клонировать вместе с субмодулями. |
git clone --bare | Клонировать как «голый» репозиторий (без рабочего каталога). |
git clone --mirror | Зеркальное клонирование (включая все ссылки). |
Примеры:
bash
git clone https://github.com/user/repo.git
git clone https://github.com/user/repo.git my-directory
git clone --single-branch --branch main https://github.com/user/repo.git
git clone --depth 1 https://github.com/user/repo.git
git clone --recurse-submodules https://github.com/user/repo.git
git clone --bare https://github.com/user/repo.git
git clone --mirror https://github.com/user/repo.git
3. Отслеживание изменений
git status
Показывает состояние рабочего каталога и области индексирования.
Возможные состояния файлов:
| Состояние | Описание | Отслеживается? |
|---|---|---|
| Untracked | Новый файл, который Git не отслеживает. | Нет |
| Modified | Отслеживаемый файл изменён, но не добавлен в индекс. | Да |
| Staged | Изменения добавлены в индекс (готовы к коммиту). | Да |
| Unstaged | Изменения есть в рабочем каталоге, но не в индексе. | Да |
| Deleted | Отслеживаемый файл удалён. | Да |
| Renamed | Файл переименован. | Да |
| Copied | Файл скопирован. | Да |
| Unmerged | Конфликт слияния. | Да |
| Ignored | Игнорируемый файл (из .gitignore). | Нет (игнорируется) |
| Опция | Описание |
|---|---|
git status | Полный вывод. |
git status -s (--short) | Краткий формат. |
git status --branch | Показать информацию о ветке. |
git status -u (--untracked-files) | Управлять выводом неотслеживаемых файлов (no, normal, all). |
git status --verbose | Более подробный вывод. |
Примеры:
bash
git status
git status -s
git status --branch
git status --untracked-files=all
git status --verbose
git add
Добавляет изменения из рабочего каталога в область индексирования (staging area).
| Команда | Описание |
|---|---|
git add <файл> | Добавить конкретный файл. |
git add . | Добавить все изменения в текущем каталоге. |
git add -A | Добавить все изменения во всём репозитории. |
git add -u | Добавить только изменения отслеживаемых файлов. |
git add -p (--patch) | Интерактивный выбор изменений для добавления. |
git add -f (--force) | Добавить даже игнорируемые файлы. |
Примеры:
bash
git add file.txt
git add .
git add -A
git add -u
git add --patch
git add --force
git diff
Показывает различия (diff) между разными состояниями: рабочим каталогом, индексом, коммитами.
| Команда | Описание |
|---|---|
git diff | Рабочий каталог vs индекс. |
git diff --cached | Индекс vs последний коммит. |
git diff HEAD | Рабочий каталог vs последний коммит. |
git diff <коммит> | Рабочий каталог vs указанный коммит. |
git diff <коммит1> <коммит2> | Разница между двумя коммитами. |
git diff --stat | Статистика изменений (сколько строк добавлено/удалено). |
git diff --name-only | Только имена изменённых файлов. |
git diff --name-status | Имена файлов и статусы (A, M, D). |
git diff --color | Цветной вывод. |
git diff --word-diff | Показывать различия по словам. |
git diff --ignore-space-change | Игнорировать изменения пробелов. |
git diff --diff-filter=<фильтр> | Фильтровать по статусу (A — добавлен, M — изменён, D — удалён). |
git diff --check | Проверить некорректные пробелы. |
git diff --quiet | Только код возврата (есть изменения или нет). |
Примеры:
bash
git diff
git diff --cached
git diff HEAD
git diff abc1234
git diff abc1234 def5678
git diff --stat
git diff --name-only
git diff --name-status
git diff --color
git diff --word-diff
git diff --ignore-space-change
git diff --diff-filter=A
git diff --check
git diff --quiet
git stash
Временно откладывает (прячет) незавершённые изменения, оставляя рабочий каталог чистым. Изменения сохраняются в стеке.
| Команда | Описание |
|---|---|
git stash | Сохранить изменения. |
git save "сообщение" | Сохранить с сообщением. |
git stash list | Показать список сохранений. |
git stash apply | Применить последнее сохранение (не удаляя его из стека). |
git stash apply stash@{n} | Применить конкретное сохранение. |
git stash pop | Применить последнее сохранение и удалить его из стека. |
git stash drop | Удалить последнее сохранение. |
git stash clear | Удалить все сохранения. |
git stash show | Показать изменения в последнем сохранении. |
git stash show -p | Показать изменения в виде патча. |
git stash --include-untracked | Сохранить также неотслеживаемые файлы. |
Примеры:
bash
git stash
git stash save "WIP: новая фича"
git stash list
git stash apply
git stash apply stash@{1}
git stash pop
git stash drop
git stash clear
git stash show
git stash show -p
git stash --include-untracked
git commit
Сохраняет изменения из области индексирования в локальный репозиторий. Каждый коммит — это снапшот состояния проекта на определённый момент.
Составляющие коммита:
- Хэш коммита — 40-значный SHA-1, уникальный идентификатор.
- Дерево (tree) — объект, описывающий структуру файлов и каталогов на момент коммита.
- Родительский коммит(ы) — ссылка на предыдущий коммит (один для обычного, два для merge-коммита).
- Автор (author) — кто создал изменения.
- Коммитер (committer) — кто зафиксировал изменения в репозитории (может отличаться от автора).
- Дата коммита.
- Сообщение (message) — описание изменений.
- GPG-подпись (опционально) — для верификации подлинности.
| Команда | Описание |
|---|---|
git commit | Откроет редактор для ввода сообщения. |
git commit -m "сообщение" | Коммит с сообщением из командной строки. |
git commit -a | Автоматически добавить изменения всех отслеживаемых файлов и сделать коммит. |
git commit --amend | Изменить последний коммит (сообщение или состав). |
git commit --no-verify | Пропустить pre-commit хуки. |
git commit --allow-empty | Создать пустой коммит (без изменений). |
git commit --signoff | Добавить строку Signed-off-by в сообщение. |
git commit --no-edit | При --amend не менять сообщение. |
git commit --fixup=<коммит> | Создать коммит-фиксап для последующего авто-сквоша (используется с rebase --autosquash). |
git commit --squash=<коммит> | Создать коммит для сквоша с указанным коммитом. |
Примеры:
bash
git commit
git commit -m "Добавить новую функцию"
git commit -a -m "Обновить отслеживаемые файлы"
git commit --amend
git commit --no-verify -m "Игнорируем хуки"
git commit --allow-empty -m "Пустой коммит"
git commit --signoff -m "Добавить подпись"
git commit --amend --no-edit
git commit --fixup=abc1234
git commit --squash=abc1234
git log
Показывает историю коммитов.
| Команда | Описание |
|---|---|
git log | Полная история. |
git log -n <число> | Показать последние N коммитов. |
git log --oneline | Каждый коммит в одну строку. |
git log --stat | Статистика изменённых файлов. |
git log -p (--patch) | Показать изменения (дифф) для каждого коммита. |
git log --graph | Аски-граф ветвления. |
git log --pretty=<формат> | Форматированный вывод (oneline, short, full, fuller…). |
git log --since=<дата> | Коммиты после указанной даты. |
git log --until=<дата> | Коммиты до указанной даты. |
git log --author=<паттерн> | Фильтр по автору. |
git log --grep=<паттерн> | Поиск по сообщению коммита. |
git log -- <путь> | История только для указанного файла/каталога. |
git log --no-merges | Исключить merge-коммиты. |
git log --decorate | Показать ветки, теги. |
git log --abbrev-commit | Сокращённые хэши. |
git log --name-only | Только имена изменённых файлов. |
git log --name-status | Имена файлов и статусы (A, M, D). |
git log --all | История всех ссылок (веток, тегов). |
Примеры:
bash
git log
git log -n 5
git log --oneline
git log --stat
git log --patch
git log --graph
git log --pretty=oneline
git log --since="2023-10-01"
git log --until="2023-10-31"
git log --author="Иван"
git log --grep="bugfix"
git log -- src/main.c
git log --no-merges
git log --decorate
git log --abbrev-commit
git log --name-only
git log --name-status
git log --all
git show
Показывает детальную информацию об одном объекте (коммите, теге, дереве).
| Команда | Описание |
|---|---|
git show <коммит> | Показать информацию о коммите. |
git show <тег> | Показать информацию о теге и коммите, на который он указывает. |
git show <дерево> | Показать содержимое дерева. |
git show --oneline | Сокращённый вид. |
git show --stat | Статистика изменений. |
git show -p (--patch) | Показать дифф. |
git show --name-only | Только имена изменённых файлов. |
git show --name-status | Имена файлов и статусы. |
git show --format=<формат> | Пользовательский формат. |
git show --no-patch | Не показывать патч (только заголовок). |
git show --color | Цветной вывод. |
git show --quiet | Только сообщение коммита. |
Примеры:
bash
git show abc1234
git show v1.0.0
git show HEAD:path/to/file
git show --oneline abc1234
git show --stat abc1234
git show --patch abc1234
git show --name-only abc1234
git show --name-status abc1234
git show --format="%h - %an, %ar : %s" abc1234
git show --no-patch abc1234
git show --color abc1234
git show --quiet abc1234
5. Управление ветками
git branch
Управление ветками: создание, просмотр, удаление.
| Команда | Описание |
|---|---|
git branch | Список локальных веток. |
git branch <ветка> | Создать новую ветку (не переключаясь). |
git branch -d <ветка> | Удалить ветку (только если она уже слита). |
git branch -D <ветка> | Принудительно удалить ветку (даже если не слита). |
git branch -m <новая-ветка> | Переименовать текущую ветку. |
git branch -a | Все ветки (локальные + удалённые). |
git branch -r | Только удалённые ветки. |
git branch --merged | Ветки, которые уже слиты с текущей. |
git branch --no-merged | Ветки, которые ещё не слиты. |
git branch --set-upstream-to=<удалённая>/<ветка> | Установить upstream для текущей ветки. |
git branch --unset-upstream | Убрать upstream. |
git branch -v (--verbose) | Список веток с последним коммитом. |
Примеры:
bash
git branch
git branch feature-branch
git branch -d feature-branch
git branch -D feature-branch
git branch -m new-name
git branch -a
git branch -r
git branch --merged
git branch --no-merged
git branch --set-upstream-to=origin/main
git branch --unset-upstream
git branch --verbose
git checkout
Переключение между ветками, восстановление файлов, переход к конкретным коммитам.
Примечание: Многие считают
git checkoutсложным для понимания, потому что он объединяет две разные функции (переключение веток и восстановление файлов). Начиная с Git 2.23 появились отдельные команды:git switch(для переключения) иgit restore(для восстановления). Однакоgit checkoutвсё ещё широко используется и не планируется к удалению.
| Команда | Описание |
|---|---|
git checkout <ветка> | Переключиться на ветку. |
git checkout -b <новая-ветка> | Создать новую ветку и переключиться на неё. |
git checkout <коммит> | Переключиться на коммит (detached HEAD). |
git checkout -- <файл> | Отменить изменения файла в рабочем каталоге (восстановить из последнего коммита). |
git checkout . | Отменить все изменения в текущем каталоге. |
git checkout -f | Принудительно переключиться (потерять локальные изменения). |
git checkout -p (--patch) | Интерактивно отменить изменения. |
git checkout --track <удалённая>/<ветка> | Создать локальную ветку, отслеживающую удалённую, и переключиться. |
git checkout --detach | Переключить HEAD в detached состояние (прямо на текущий коммит). |
git checkout --merge | При переключении попытаться автоматически смержить изменения. |
Примеры:
bash
git checkout main
git checkout -b feature-branch
git checkout abc1234
git checkout -- file.txt
git checkout .
git checkout -f
git checkout --patch
git checkout --track origin/feature-branch
git checkout --detach
git checkout --merge feature-branch
git switch
Новая команда (Git 2.23+), специализированная именно на переключении веток. Более интуитивна и безопасна.
| Команда | Описание |
|---|---|
git switch <ветка> | Переключиться на ветку. |
git switch -c <новая-ветка> | Создать ветку и переключиться. |
git switch --detach <коммит> | Переключиться на коммит (detached HEAD). |
git switch --track <удалённая>/<ветка> | Создать локальную ветку, отслеживающую удалённую. |
git switch --force | Переключиться принудительно (с потерей изменений). |
git switch --merge | При переключении попытаться автоматически смержить изменения. |
Примеры:
bash
git switch main
git switch -c feature-branch
git switch --detach abc1234
git switch --track origin/feature-branch
git switch --force feature-branch
git switch --merge feature-branch
git merge
Сливает изменения из одной ветки в текущую.
Стратегии слияния:
| Режим | Условия | Описание |
|---|---|---|
--ff (по умолчанию) | Нет расхождений | Просто перемещает указатель ветки (fast-forward). Коммита слияния не создаёт. |
--no-ff | Любое | Всегда создаёт merge-коммит, даже если fast-forward возможен. |
--ff-only | Нет расхождений | Разрешает только fast-forward; иначе отменяет слияние. |
| 3-way (трёхстороннее) | Ветки разошлись | Создаёт merge-коммит на основе общего предка. |
--squash | Любое | Берёт все изменения из другой ветки, но упаковывает их в один коммит (без истории отдельных коммитов). |
Пример fast-forward vs no-ff:
Исходно:
main: A --- B --- C
\
feature: D --- E --- F
git merge --no-ff feature
main: A --- B --- C ------------------- M
\ /
feature: D --- E --- F -------
(создан merge-коммит M)
git merge --ff feature (если возможно)
main: A --- B --- C --- D --- E --- F
(просто переместили указатель main)
| Команда | Описание |
|---|---|
git merge <ветка> | Слить указанную ветку в текущую. |
git merge --no-ff <ветка> | Всегда создавать merge-коммит. |
git merge --ff-only <ветка> | Только fast-forward (иначе остановиться). |
git merge --squash <ветка> | Взять изменения из ветки, но упаковать в один коммит (без истории). |
git merge --abort | Отменить слияние (если конфликт) и вернуться к исходному состоянию. |
git merge --continue | После разрешения конфликта продолжить слияние. |
git merge --no-commit | Выполнить слияние, но не автоматически коммитить. |
git merge --stat | Показать статистику изменений после слияния. |
git merge --strategy=<стратегия> | Выбрать стратегию (recursive, ours, subtree…). |
git merge --strategy-option=<опция> | Дополнительные опции для стратегии (ours, theirs, patience…). |
Примеры:
bash
git merge feature-branch
git merge --no-ff feature-branch
git merge --ff-only feature-branch
git merge --squash feature-branch
git merge --abort
git merge --continue
git merge --no-commit feature-branch
git merge --stat feature-branch
git merge --strategy=recursive feature-branch
git merge --strategy-option=ours feature-branch
6. Удалённые репозитории
git remote
Управление удалёнными репозиториями (добавление, удаление, изменение URL).
| Команда | Описание |
|---|---|
git remote | Список имён удалённых репозиториев. |
git remote -v | Список с URL. |
git remote add <имя> <url> | Добавить новый удалённый репозиторий. |
git remote remove <имя> | Удалить удалённый репозиторий. |
git remote rename <старое> <новое> | Переименовать удалённый репозиторий. |
git remote set-url <имя> <url> | Изменить URL. |
git remote show <имя> | Показать подробную информацию о удалённом репозитории. |
git remote prune <имя> | Удалить локальные ссылки на ветки, которые уже удалены в удалённом репозитории. |
git remote update | Обновить все удалённые ветки и теги (без слияния). |
git remote get-url <имя> | Показать URL удалённого репозитория. |
git remote set-branches <имя> <ветка> | Задать, какие удалённые ветки отслеживать. |
git remote add --track <ветка> <имя> <url> | Добавить удалённый репозиторий и сразу настроить отслеживание указанной ветки. |
Примеры:
bash
git remote
git remote -v
git remote add origin https://github.com/user/repo.git
git remote remove origin
git remote rename origin upstream
git remote set-url origin https://github.com/user/new-repo.git
git remote show origin
git remote prune origin
git remote update
git remote get-url origin
git remote set-branches origin main
git remote add --track main origin https://github.com/user/repo.git
git pull
Загружает изменения из удалённого репозитория и сливает их с текущей веткой (git fetch + git merge).
| Команда | Описание |
|---|---|
git pull | Загрузить изменения для текущей ветки и смержить. |
git pull <удалённый> <ветка> | Загрузить указанную ветку из удалённого репозитория и смержить. |
git pull --rebase | Загрузить изменения и сделать rebase вместо merge. |
git pull --ff-only | Только fast-forward (иначе отменить). |
git pull --no-ff | Всегда создавать merge-коммит. |
git pull --autostash | Перед pull автоматически сделать stash, а после pull — pop. |
git pull --no-commit | Не создавать коммит слияния автоматически. |
git pull --tags | Загрузить также все теги. |
git pull --no-tags | Не загружать теги. |
Примеры:
bash
git pull
git pull origin main
git pull --rebase
git pull --ff-only
git pull --no-ff
git pull --autostash
git pull --no-commit
git pull --tags
git pull --no-tags
git push
Отправляет локальные изменения в удалённый репозиторий.
| Команда | Описание |
|---|---|
git push | Отправить изменения текущей ветки в её upstream. |
git push <удалённый> <ветка> | Отправить ветку в удалённый репозиторий. |
git push <удалённый> <тег> | Отправить конкретный тег. |
git push --all | Отправить все ветки. |
git push --tags | Отправить все теги. |
git push --force (-f) | Принудительная отправка (перезаписывает удалённую ветку). Осторожно! |
git push --force-with-lease | Более безопасный форс: только если удалённая ветка не изменилась с момента вашего последнего fetch. |
git push --delete <удалённый> <ветка> | Удалить ветку на удалённом репозитории. |
git push --set-upstream <удалённый> <ветка> | Отправить ветку и настроить её как upstream для текущей локальной ветки. |
git push --dry-run | Имитация отправки (ничего не отправляет). |
git push --prune | Удалить на удалённой стороне ветки, которых нет в локальном репозитории. |
git push --no-verify | Пропустить pre-push хуки. |
git push --follow-tags | Отправить коммиты и теги, которые относятся к отправляемым коммитам. |
Примеры:
bash
git push
git push origin main
git push origin v1.0.0
git push --all
git push --tags
git push --force
git push --force-with-lease
git push --delete origin old-branch
git push --set-upstream origin feature-branch
git push --dry-run
git push --prune origin
git push --no-verify
git push --follow-tags
git fetch
Загружает изменения из удалённого репозитория, не сливая их с текущей веткой.
| Команда | Описание |
|---|---|
git fetch | Загрузить все изменения из удалённого по умолчанию. |
git fetch <удалённый> | Загрузить изменения из указанного удалённого репозитория. |
git fetch <удалённый> <ветка> | Загрузить только указанную ветку. |
git fetch --all | Загрузить из всех удалённых репозиториев. |
git fetch --prune | После загрузки удалить локальные ссылки на ветки, удалённые в удалённом репозитории. |
git fetch --tags | Загрузить все теги. |
git fetch --force | Принудительно обновить ссылки, даже если это перезапишет историю (осторожно). |
Примеры:
bash
git fetch
git fetch origin
git fetch origin main
git fetch --all
git fetch --prune
git fetch --tags
git fetch --force
7. Теги
git tag
Управление тегами. Теги бывают:
- Лёгкие (lightweight) — просто имя, указывающее на коммит.
- Аннотированные (annotated) — содержат также сообщение, подпись, дату, автора.
| Команда | Описание |
|---|---|
git tag | Список всех тегов. |
git tag <имя-тега> | Создать лёгкий тег на текущем коммите. |
git tag -a <имя-тега> | Создать аннотированный тег (откроет редактор для сообщения). |
git tag -a <имя-тега> -m "сообщение" | Аннотированный тег с сообщением. |
git tag <имя-тега> <коммит> | Создать тег на указанном коммите. |
git tag -d <имя-тега> | Удалить тег локально. |
git tag -l "<паттерн>" | Список тегов, соответствующих паттерну (например, v1.*). |
git tag --contains <коммит> | Показать теги, содержащие указанный коммит. |
git tag --points-at <коммит> | Показать теги, указывающие на указанный коммит. |
git tag --sort=<ключ> | Сортировать теги. Например, version:refname. |
git tag -f <имя-тега> | Принудительно переместить существующий тег (осторожно). |
git tag --sign | Добавить GPG-подпись (для аннотированного тега). |
Примеры:
bash
git tag
git tag v1.0.0
git tag -a v1.0.0
git tag -a v1.0.0 -m "Релиз 1.0.0"
git tag v1.0.0 abc1234
git tag -d v1.0.0
git tag -l "v1.*"
git tag --contains abc1234
git tag --points-at abc1234
git tag --sort=version:refname
git tag --sort=-version:refname
git tag -f v1.0.0
git tag --sign v1.0.0
8. История и логи
(Разделы git log и git show были описаны выше.)
git blame
Показывает для каждой строки файла, какой коммит и автор изменили её в последний раз.
| Команда | Описание |
|---|---|
git blame <файл> | Показать авторство для всех строк. |
git blame -L <начало>,<конец> <файл> | Только для указанных строк. |
git blame -C <файл> | Отслеживать копирование внутри файла. |
git blame -M <файл> | Отслеживать перемещение строк внутри файла. |
git blame -w | Игнорировать изменения пробелов. |
git blame -e | Показывать email автора. |
git blame -l | Показывать полный хэш коммита. |
git blame -t | Показывать временную метку коммита (unix timestamp). |
git blame -s | Показывать сокращённый хэш. |
git blame --ignore-rev <коммит> | Игнорировать указанный коммит. |
git blame --ignore-revs-file <файл> | Игнорировать коммиты, перечисленные в файле (например, .git-blame-ignore-revs). |
Примеры:
bash
git blame README.md
git blame -L 10,20 README.md
git blame -C README.md
git blame -M README.md
git blame -w README.md
git blame -e README.md
git blame -l README.md
git blame -t README.md
git blame -s README.md
git blame --ignore-rev abc1234 README.md
git blame --ignore-revs-file .git-blame-ignore-revs README.md
git reflog
Reference Logs — журнал всех перемещений HEAD в локальном репозитории. Позволяет восстановить «потерянные» коммиты, на которые нет ссылок.
| Команда | Описание |
|---|---|
git reflog | Показать историю перемещений HEAD. |
git reflog <ветка> | Показать историю для конкретной ветки. |
git reflog --all | Показать историю всех ссылок (ветки, теги, удалённые). |
git reflog --date=<формат> | Задать формат даты (iso, relative, local). |
git reflog --since=<время> | Показать записи после указанного времени. |
git reflog --until=<время> | Показать записи до указанного времени. |
git reflog --grep=<паттерн> | Показать только записи с сообщением, содержащим паттерн. |
Примеры:
bash
git reflog
git reflog main
git reflog --all
git reflog --date=iso
git reflog --since=2.weeks.ago
git reflog --until=1.day.ago
git reflog --grep=merge
9. Восстановление и отмена изменений
(Раздел git checkout уже был рассмотрен.)
git reset
Передвигает указатель текущей ветки на другой коммит, а также (опционально) сбрасывает индекс и/или рабочий каталог.
Три режима:
-
--soft— перемещает HEAD, но не трогает индекс и рабочий каталог. -
--mixed(по умолчанию) — перемещает HEAD и сбрасывает индекс, рабочий каталог не трогает. -
--hard— перемещает HEAD, сбрасывает индекс и рабочий каталог (изменения теряются навсегда — осторожно!).
| Команда | Описание |
|---|---|
git reset <коммит> | Переместить HEAD на коммит (по умолчанию --mixed). |
git reset --soft <коммит> | HEAD перемещён, индекс и рабочий каталог не тронуты. |
git reset --mixed <коммит> | HEAD перемещён, индекс сброшен, рабочий каталог не тронут. |
git reset --hard <коммит> | HEAD, индекс, рабочий каталог — всё сброшено до состояния коммита. |
git reset <файл> | Убрать файл из индекса (unstage). |
git reset -p (--patch) | Интерактивно выбрать, какие изменения убрать из индекса. |
git reset --keep <коммит> | Переместить HEAD, но сохранить локальные изменения в рабочем каталоге (если они не конфликтуют). |
Примеры:
bash
git reset abc1234 git reset --soft abc1234 git reset --mixed abc1234 git reset --hard abc1234 git reset file.txt git reset --patch git reset --keep abc1234
git restore
Новая команда (Git 2.23+), предназначенная для восстановления файлов в рабочем каталоге и/или индексе. Заменяет часть функций git checkout.
| Команда | Описание |
|---|---|
git restore <файл> | Восстановить файл в рабочем каталоге из последнего коммита. |
git restore --staged <файл> | Убрать файл из индекса (unstage), оставив изменения в рабочем каталоге. |
git restore --source=<коммит> <файл> | Восстановить файл из указанного коммита (в рабочий каталог и/или индекс). |
git restore --worktree <файл> | Восстановить только рабочий каталог (оставить индекс нетронутым). |
git restore -p (--patch) | Интерактивно выбрать, что восстановить. |
git restore --quiet | Минимум вывода. |
git restore --ignore-unmerged | Пропустить файлы с конфликтами слияния. |
git restore --recurse-submodules | Восстановить также субмодули. |
Примеры:
bash
git restore file.txt
git restore --staged file.txt
git restore --source=HEAD~2 file.txt
git restore --worktree file.txt
git restore --patch file.txt
git restore --quiet file.txt
git restore --ignore-unmerged file.txt
git restore --recurse-submodules
10. Rebase (перебазирование)
git rebase
Перемещает коммиты текущей ветки на вершину другой ветки (или другого коммита), создавая линейную историю.
| Команда | Описание |
|---|---|
git rebase <ветка> | Перебазировать текущую ветку на указанную. |
git rebase -i <коммит> | Интерактивный rebase (можно изменять, сквошить, переупорядочивать коммиты). |
git rebase --continue | Продолжить rebase после разрешения конфликта. |
git rebase --abort | Прервать rebase и вернуться к исходному состоянию. |
git rebase --skip | Пропустить текущий коммит (при конфликте). |
git rebase --onto <новый-базис> | Переместить коммиты из диапазона на другой базис. |
git rebase --autostash | Перед rebase сделать stash, после — pop. |
git rebase --root | Перебазировать включая самый первый коммит. |
git rebase --no-verify | Пропустить pre-rebase хуки. |
Примеры:
bash
git rebase main
git rebase -i HEAD~3
git rebase --continue
git rebase --abort
git rebase --skip
git rebase --onto newbase oldbase
git rebase --autostash
git rebase --root
git rebase --no-verify
11. Субмодули
git submodule
Позволяет включать в репозиторий другие Git-репозитории как подпроекты.
| Команда | Описание |
|---|---|
git submodule add <репозиторий> | Добавить новый субмодуль. |
git submodule init | Инициализировать субмодули (подготовить к загрузке). |
git submodule update | Обновить субмодули до коммитов, которые зафиксированы в родительском репозитории. |
git submodule update --init | Инициализировать и обновить. |
git submodule update --remote | Обновить субмодули до последних коммитов из их удалённых репозиториев. |
git submodule sync | Синхронизировать URL субмодулей с .gitmodules. |
git submodule status | Показать состояние субмодулей. |
git submodule deinit <путь> | Деинициализировать (отключить) субмодуль. |
git submodule foreach <команда> | Выполнить команду для каждого субмодуля. |
Примеры:
bash
git submodule add https://github.com/user/repo.git path/to/submodule
git submodule init
git submodule update
git submodule update --init
git submodule update --remote
git submodule sync
git submodule status
git submodule deinit path/to/submodule
git submodule foreach 'git checkout main'
12. Другие полезные команды
git cherry-pick
Применяет указанный коммит(ы) из другой ветки к текущей.
| Команда | Описание |
|---|---|
git cherry-pick <коммит> | Применить один коммит. |
git cherry-pick <коммит1> <коммит2> | Применить несколько коммитов. |
git cherry-pick <начало>^..<конец> | Применить диапазон коммитов (включая <начало>). |
git cherry-pick --continue | Продолжить после разрешения конфликта. |
git cherry-pick --abort | Отменить cherry-pick. |
git cherry-pick --skip | Пропустить конфликтный коммит. |
git cherry-pick --no-commit | Применить изменения, но не создавать коммит. |
git cherry-pick --edit | Редактировать сообщение коммита перед созданием. |
git cherry-pick --signoff | Добавить Signed-off-by. |
git cherry-pick --ff | Если возможно, применить как fast-forward. |
Примеры:
bash
git cherry-pick abc1234
git cherry-pick abc1234 def5678
git cherry-pick start-commit^..end-commit
git cherry-pick --continue
git cherry-pick --abort
git cherry-pick --skip
git cherry-pick --no-commit abc1234
git cherry-pick --edit abc1234
git cherry-pick --signoff abc1234
git cherry-pick --ff abc1234
git bisect
Бинарный поиск коммита, в котором был внесён баг. Требуется пометить один коммит как «хороший» (без бага), другой как «плохой» (с багом), а затем Git сужает круг поиска.
| Команда | Описание |
|---|---|
git bisect start | Начать сессию bisect. |
git bisect good <коммит> | Отметить коммит как хороший. |
git bisect bad <коммит> | Отметить коммит как плохой. |
git bisect reset | Завершить bisect и вернуться к исходной ветке. |
git bisect run <команда> | Автоматический bisect: запускать команду (скрипт) для каждого коммита. |
git bisect log | Показать лог сессии bisect. |
git bisect skip | Пропустить текущий коммит (не подходит для тестирования). |
Примеры:
bash
git bisect start
git bisect bad # текущий коммит плохой
git bisect good abc1234 # коммит abc1234 хороший
# ... Git переключается на промежуточный коммит, вы тестируете ...
git bisect good # если в этом коммите бага нет
# или
git bisect bad # если баг ещё есть
# Повторяете, пока Git не найдёт первый плохой коммит
git bisect reset # завершить поиск
# Автоматический режим (./test-script.sh должен возвращать 0 для "хорошо" и !=0 для "плохо")
git bisect start HEAD HEAD~100
git bisect run ./test-script.sh







