Команды и глоссарий

· Внимание статья очень большая.

Эта сатья посвящёна командам 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 startgit bisect badgit bisect good
Хуки (Hooks)Скрипты, автоматически запускаемые при определённых событиях Git (например, перед коммитом). Хранятся в каталоге .git/hooks.Хуки pre-commitpost-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

0 0 голоса
Рейтинг статьи
Подписаться
Уведомить о
guest
0 комментариев
Популярные
Новые Старые

0
Оставьте комментарий! Напишите, что думаете по поводу статьи.x
Menu