Перейти к основному содержимому

Git: полное руководство по командам и терминологии

Git: больше не только для разработчиков!

В прошлом Git считался профессиональным инструментом разработчиков, но теперь он стал незаменимым для блогеров, писателей и всех, кто любит упорядочивать заметки.

Что такое Git?

Git — это система управления версиями. Она записывает изменения файлов и позволяет при необходимости вернуться к любой предыдущей точке. Проще говоря, это цифровое рабочее пространство, где все изменения безопасно «сохраняются» и «публикуются».

Например, если вы пишете роман и хотите откатиться к версии недельной давности — Git сделает это возможным.

Сегодня Git также активно используется в связке с Obsidian, Logseq для личного управления знаниями (PKM).

Новичкам рекомендуется начинать с графических инструментов: Sourcetree, GitKraken, GitHub Desktop, VS Code.


Основы Git (концепции)

Git Workflow

[Рабочий каталог (Working Directory)]  🖥️
|
| работа с файлами (изменение, добавление, удаление)
| |
| | git add <файл> (индексация изменений)
| ↓

[Область индексирования (Staging Area)] 📦
|
| git commit -m "сообщение" (сохранить изменения в локальном репозитории)

[Локальный репозиторий (Local Repository)] 🏠
|
| git push origin <ветка> (отправить изменения в удалённый репозиторий)

[Удалённый репозиторий (Remote Repository)] 🌍
|
| git pull origin <ветка> (git fetch + git merge)

[Локальный репозиторий коллеги] 🏠
|
| возникает слияние (merge)
| |
| | разрешение конфликтов (при необходимости)
| ↓

[Рабочий каталог коллеги] 🖥️

Глоссарий терминов Git

ТерминОписаниеПример использования
Working DirectoryКаталог, где вы сейчас работаете; Git отслеживает файлы в нём.git status — просмотр состояния рабочего каталога
Staging AreaПромежуточная область для подготовки коммита.git add <file> — добавить файл в Staging Area
IndexТо же, что и Staging Area; внутренняя структура данных Git.git ls-files --stage
WorktreeПозволяет работать с несколькими рабочими каталогами в одном репозитории.git worktree add <path> <branch>
HEADУказатель на последний коммит текущей ветки.git checkout main — HEAD указывает на main
Detached HEADHEAD указывает непосредственно на коммит (не на ветку).git checkout <хэш-коммита>
RepositoryХранилище проекта (локальное или удалённое).git init, git clone <URL>
CommitСохранение изменений с уникальным хэшем.git commit -m "сообщение"
BranchОтдельная линия разработки.git branch feature-branch
CheckoutПереключение между ветками или коммитами.git checkout feature-branch
MergeСлияние изменений из двух веток.git merge 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).Кнопка "Fork" на GitHub
Pull Request (PR)Запрос на вливание изменений в оригинальный репозиторий.Кнопка "New Pull Request"
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 и (опционально) сбросить индексацию/рабочий каталог.git reset --hard HEAD~1
RevertОтменить коммит, создав новый коммит с обратными изменениями.git revert <хэш>
BlameПоказать, кто и когда изменил каждую строку файла.git blame <file>
LogПоказать историю коммитов.git log
DiffПоказать различия между состояниями.git diff
StageДобавить изменения в индекс.git add <file>
UnstageУбрать изменения из индекса.git reset <file>
IgnoreИгнорировать файлы/каталоги (через .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
ReflogЖурнал всех перемещений HEAD и ссылок.git reflog
UpstreamВетка в удалённом репозитории, связанная с локальной.git push --set-upstream origin feature-branch

🔒 БЕЗОПАСНОСТЬ (MITRE T1552.001):
Избегайте хранения паролей, токенов и ключей в любых файлах, которые могут попасть в репозиторий. Используйте .gitignore для секретных файлов и pre-commit хуки с инструментами типа gitleaks, чтобы автоматически блокировать коммиты с чувствительными данными.


Важность указателей (pointers) в Git

Git основан на указателях: коммиты, ветки, HEAD, теги — всё это ссылки на объекты.

1. Указатель HEAD

  • Указывает на последний коммит текущей ветки.
  • Хранится в .git/HEAD.
  • При переключении на конкретный коммит переходит в состояние Detached HEAD.

Синтаксис для навигации:
HEAD^ — родительский коммит (первый родитель).
HEAD^^ — два поколения назад.
HEAD^2 — второй родитель (для merge-коммитов).
HEAD~2 — два шага назад по первому родителю.

2. Указатели веток (branch pointers)

  • Каждая ветка — это файл в .git/refs/heads/, содержащий хэш последнего коммита.
  • При создании нового коммита указатель ветки автоматически перемещается.

3. Указатели тегов

  • Файлы в .git/refs/tags/ содержат хэш коммита.
  • Обычно не изменяются после создания (легковесные теги — только имя, аннотированные — включают метаданные).

4. Указатели удалённых веток

  • Хранятся в .git/refs/remotes/.
  • Обновляются командой git fetch.

🔒 БЕЗОПАСНОСТЬ (целостность истории):
Указатели являются критически важными для аудита. Регулярно проверяйте журнал reflog (git reflog), чтобы обнаружить несанкционированные reset, rebase или amend. Согласно 187-ФЗ (о КИИ), любое переписывание истории должно быть задокументировано.


Команды Git

1. Настройка репозитория

git config

Управляет настройками Git: имя пользователя, email, редактор, алиасы. Уровни: system, global, local.

КомандаОписание
git config --listПоказать все действующие настройки
git config --global user.name "Имя"Задать глобальное имя
git config --global user.email "email@example.com"Задать глобальный email
git config --get <key>Показать значение ключа
git config --global --editРедактировать глобальный конфиг
git config --show-origin user.nameПоказать, откуда взято значение

Примеры:

git config --global user.name "Иван Иванов"
git config --global user.email "i.ivanov@company.ru"

🔒 БЕЗОПАСНОСТЬ:
Никогда не используйте личный email в корпоративных репозиториях — это может привести к утечке информации о сотрудниках (152-ФЗ, персональные данные). Для подписи коммитов используйте корпоративные сертификаты или GPG-ключи, привязанные к служебному адресу.

git alias

Создание сокращений для часто используемых команд.

git config --global alias.co checkout
git config --global alias.st status
git config --global alias.last 'log -1 HEAD'

2. Инициализация и клонирование

git init

Создаёт новый локальный репозиторий (папку .git).

git init                     # в текущем каталоге
git init my-project # в указанном каталоге
git init --bare # голый репозиторий (без рабочего каталога)
git init --initial-branch main

git clone

Клонирует удалённый репозиторий.

git clone https://github.com/user/repo.git
git clone --branch develop --single-branch <URL>
git clone --depth 1 <URL> # shallow clone (только последний коммит)
git clone --recurse-submodules <URL>

🔒 БЕЗОПАСНОСТЬ (MITRE T1195):
При клонировании чужих репозиториев проверяйте их на наличие вредоносных хуков или подмодулей. Используйте git clone --depth 1, если полная история не нужна — это снижает риск извлечения старых секретов из коммитов.

3. Отслеживание изменений и управление

git status

Показывает состояние рабочего каталога и индекса.

СтатусОписание
UntrackedНовый файл, не отслеживаемый Git
ModifiedИзменённый отслеживаемый файл (не в индексе)
StagedИзменения добавлены в индекс
UnmergedКонфликт после слияния
git status
git status -s # короткий формат

git add

Добавляет изменения в индекс.

git add file.txt
git add . # все изменения в текущем каталоге
git add -A # все изменения во всём репозитории
git add -u # только изменённые/удалённые отслеживаемые файлы
git add --patch # интерактивное добавление частями

🔒 БЕЗОПАСНОСТЬ:
Будьте осторожны с git add -f (force) — он может добавить игнорируемые файлы (например, .env с секретами). Всегда проверяйте git status перед добавлением.

git diff

Показывает различия.

git diff                      # рабочий каталог vs индекс
git diff --cached # индекс vs последний коммит
git diff HEAD # рабочий каталог vs последний коммит
git diff HEAD~1..HEAD # между двумя коммитами
git diff --stat # статистика изменений
git diff --name-only # только имена файлов

git stash

Временно прячет незакоммиченные изменения.

git stash
git stash save "WIP: feature X"
git stash list
git stash apply stash@{1}
git stash pop
git stash drop
git stash clear
git stash --include-untracked

🔒 БЕЗОПАСНОСТЬ:
В стэше могут остаться пароли или токены, если вы их случайно добавили. Периодически очищайте стэш (git stash clear) на общих рабочих станциях. Согласно приказу ФСТЭК № 21, временные данные должны удаляться после использования.

git commit

Создаёт коммит из изменений в индексе.

Структура коммита: хэш, дерево, родитель(и), автор, коммитер, дата, сообщение, опционально GPG-подпись.

git commit -m "Add new feature"
git commit -a -m "Auto-add tracked files"
git commit --amend # изменить последний коммит
git commit --amend --no-edit
git commit --signoff # добавить Signed-off-by
git commit --no-verify # пропустить pre-commit хуки

🔒 БЕЗОПАСНОСТЬ (MITRE T1565.001):
Всегда подписывайте коммиты (-S), если ваша политика безопасности требует подтверждения авторства. В российских государственных системах допускается использование только сертифицированных средств ЭП (ГОСТ 34.10-2012).
--no-verify отключает проверки безопасности — используйте только по согласованию с ИБ.

git log

Просмотр истории.

git log
git log --oneline -n 10
git log --graph --all --decorate
git log --author="Иван"
git log --grep="security"
git log --since="2025-01-01"
git log -- path/to/file

git show

Показать информацию об объекте.

git show abc1234
git show v1.0.0
git show --stat abc1234

4. Управление ветками

git branch

git branch                 # список локальных веток
git branch feature-branch # создать ветку
git branch -d feature-branch # удалить (слитую)
git branch -D feature-branch # принудительно удалить
git branch -m old new # переименовать
git branch -a # все ветки (включая удалённые)
git branch --merged # ветки, которые уже слиты

git checkout / git switch

Переключение между ветками.

git checkout main
git checkout -b new-feature
git checkout -- file.txt # откатить файл до последнего коммита

🔒 БЕЗОПАСНОСТЬ:
git checkout -- . откатит все незакоммиченные изменения без возможности восстановления. Убедитесь, что вы не потеряли важные правки. Используйте git stash перед опасными операциями.

git switch (новый синтаксис):

git switch main
git switch -c new-branch
git switch --detach abc1234

git merge

Слияние веток.

git merge feature-branch
git merge --no-ff feature-branch # всегда создавать merge-коммит
git merge --ff-only # только fast-forward
git merge --squash feature-branch # "сквош" всех коммитов в один
git merge --abort # отменить слияние при конфликтах

🔒 БЕЗОПАСНОСТЬ:
Запретите git merge --squash на критических ветках без ревью — это скрывает детальную историю изменений, что затрудняет аудит (нарушает ГОСТ Р 57580.1). Всегда используйте --no-ff для веток, связанных с КИИ.

5. Работа с удалёнными репозиториями

git remote

git remote -v
git remote add origin https://github.com/user/repo.git
git remote remove origin
git remote set-url origin git@github.com:user/repo.git # переключение на SSH
git remote show origin

🔒 БЕЗОПАСНОСТЬ (187-ФЗ, приказ ФСТЭК № 239):
Используйте SSH вместо HTTPS для аутентификации на корпоративных Git-серверах. SSH-ключи должны быть длиной не менее 3072 бит и храниться на токенах (HSM). Доступ по паролю должен быть отключён.

git pull

git pull origin main
git pull --rebase # перебазирование вместо слияния
git pull --ff-only # только fast-forward (безопаснее)
git pull --autostash # автоматически применить stash

git push

git push origin main
git push --force # ОПАСНО! перезаписывает историю
git push --force-with-lease # более безопасный force push (проверяет состояние)
git push --delete origin old-branch
git push --tags
git push --set-upstream origin feature

🔒 БЕЗОПАСНОСТЬ (MITRE T1565, Defense Evasion):
git push --force уничтожает историю и может быть использован злоумышленником для сокрытия следов. Запретите force push на защищённых ветках (main, release) через политику сервера.
В системах КИИ каждый push должен логироваться и проходить контроль целостности.

git fetch

git fetch origin
git fetch --prune # удалить локальные ссылки на удалённые ветки, которых больше нет
git fetch --tags

6. Теги

git tag

git tag                     # список тегов
git tag v1.0.0 # легковесный тег
git tag -a v1.0.0 -m "Release v1.0.0" # аннотированный
git tag -d v1.0.0
git push origin v1.0.0
git push --tags

🔒 БЕЗОПАСНОСТЬ (целостность поставки):
Подписывайте теги релизов git tag -s v1.0.0 (GPG). Это позволяет верифицировать, что релиз создан авторизованным лицом. Соответствует требованию 187-ФЗ о защите КИИ от подмены артефактов.

7. Логи и история изменений

git blame

git blame main.py
git blame -L 10,20 main.py
git blame -C # искать копирования внутри файла

Используется для выяснения, кто внёс уязвимый код.

git reflog

Журнал ссылок — показывает все перемещения HEAD, веток, тегов.

git reflog
git reflog main
git reflog --since=2.weeks.ago

🔒 БЕЗОПАСНОСТЬ (расследование инцидентов):
git reflog — ключевой инструмент для обнаружения несанкционированного переписывания истории. При подозрении на взлом выполните git reflog | grep -E "reset|rebase|amend". В соответствии с приказом ФСТЭК № 21 (п. 15), reflog должен храниться не менее 1 года.

8. Восстановление и отмена изменений

git reset

git reset --soft HEAD~1    # откатить коммит, но оставить изменения в индексе
git reset --mixed HEAD~1 # откатить коммит и снять с индекса (по умолчанию)
git reset --hard HEAD~1 # ПОЛНОСТЬЮ УДАЛИТЬ коммит и изменения (необратимо)

🔒 БЕЗОПАСНОСТЬ:
git reset --hard уничтожает незакоммиченные данные. Никогда не используйте его без предварительного git stash. В случае срабатывания политики ИБ — оповестите администратора.

git restore (новый синтаксис)

git restore file.txt            # откатить рабочий каталог
git restore --staged file.txt # убрать из индекса
git restore --source=HEAD~2 file.txt

9. Rebase (перебазирование)

git rebase main
git rebase -i HEAD~3 # интерактивный rebase (изменение истории)
git rebase --continue
git rebase --abort

🔒 БЕЗОПАСНОСТЬ (MITRE T1565):
Rebase переписывает историю коммитов — это может быть использовано для удаления записей о вредоносных изменениях. Запретите rebase для уже опубликованных веток (main, develop). В корпоративной политике должно быть указано, что rebase разрешён только в локальных ветках.

10. Submodules

git submodule add https://github.com/user/lib.git lib/
git submodule update --init --recursive
git submodule foreach 'git checkout main'

🔒 БЕЗОПАСНОСТЬ (MITRE T1195.001):
Подмодули — это риск цепочки поставок. Всегда проверяйте хэши коммитов, на которые ссылаются подмодули. Настройте git submodule absorbgitdirs для безопасного перемещения.

11. Другие полезные команды

git cherry-pick

git cherry-pick abc1234
git cherry-pick abc1234..def5678
git cherry-pick --continue

git bisect

git bisect start
git bisect bad HEAD
git bisect good v1.0.0
# Git переключает коммиты, вы помечаете good/bad
git bisect reset

🔒 БЕЗОПАСНОСТЬ (анализ уязвимостей):
git bisect помогает быстро найти коммит, который внёс уязвимость. Это соответствует ГОСТ Р 57580.1 в части управления инцидентами.


Дополнительный раздел: Безопасность Git в российском правовом поле

В дополнение к оригинальной статье, ниже приведены обязательные меры для организаций, работающих с персональными данными (152-ФЗ), критической инфраструктурой (187-ФЗ) или государственными информационными системами.

ТребованиеРеализация в GitНормативный акт
Контроль целостностиПодписанные коммиты (GPG, ГОСТ)Приказ ФСТЭК № 21 (СОВ)
Защита от утечекPre-commit хуки с поиском секретов (gitleaks)152-ФЗ, ст. 19
Аудит действийЛогирование всех push, force push, branch delete на сервере187-ФЗ, ст. 13
Разграничение доступаРоли: читатель, автор, мейнтейнер. Запрет прямого push в mainГОСТ Р 57580.1
Резервное копированиеЕжедневное копирование репозиториев на изолированный носитель187-ФЗ, п. 7

Рекомендуемые инструменты для аудита:

  • gitleaks, trufflehog — поиск секретов.
  • git log --grep — поиск подозрительных паттернов.
  • git fsck — проверка целостности объектов.
  • Серверные решения: GitLab Audit Events, Bitbucket Server Logs.

Что пропущено? Дальнейшие темы по безопасности

Данная статья (перевод с дополнениями) охватывает основы Git и базовые меры безопасности. Однако полноценная защита Git-инфраструктуры требует изучения следующих тем:

  1. Безопасная настройка Git-сервера (GitLab/Gitea/Bitbucket) с аттестацией ФСТЭК.
  2. Использование ГОСТ-алгоритмов для подписи коммитов (замена GPG на КриптоПро).
  3. Интеграция Git с SIEM-системами (MaxPatrol, ArcSight) для централизованного сбора событий.
  4. Продвинутые техники очистки истории (git filter-repo, BFG) при утечках секретов.
  5. Политика безопасности для Git Hooks (запуск статического анализа, SAST).
  6. MITRE ATT&CK для Git: детальное картирование тактик (Exfiltration, Persistence, Command and Control).