Skip to content

Instantly share code, notes, and snippets.

@dmitry-osin
Created April 30, 2025 07:37
Show Gist options
  • Save dmitry-osin/c9aab2c594050c72e56d56eafbb925d2 to your computer and use it in GitHub Desktop.
Save dmitry-osin/c9aab2c594050c72e56d56eafbb925d2 to your computer and use it in GitHub Desktop.
Шпаргалка по Git

Шпаргалка по Git

Git - это распределённая система контроля версий, которая позволяет отслеживать изменения в файлах, сотрудничать с другими разработчиками и управлять историей проекта.

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

Репозиторий

Репозиторий (repository) - это хранилище вашего проекта вместе с историей изменений.

# Создание нового репозитория
git init

# Клонирование существующего репозитория
git clone <url>

Коммит (commit)

Коммит - это снимок состояния проекта в определенный момент времени.

# Создание коммита
git commit -m "Сообщение коммита"

# Просмотр истории коммитов
git log

Ветки (branches)

Ветка - это независимая линия разработки. Ветки позволяют разрабатывать функциональность изолированно.

# Создание новой ветки
git branch <имя_ветки>

# Переключение на ветку
git checkout <имя_ветки>
# или
git switch <имя_ветки>

# Создание и переключение на новую ветку
git checkout -b <имя_ветки>
# или
git switch -c <имя_ветки>

# Просмотр всех веток
git branch

HEAD

HEAD - это указатель на текущий коммит, с которым вы работаете. Обычно HEAD указывает на последний коммит в текущей ветке.

# Просмотр, на что указывает HEAD
git rev-parse HEAD

# Переключение HEAD на определенный коммит (detached HEAD state)
git checkout <хеш_коммита>

Базовые команды

Добавление файлов в индекс

# Добавление файла в индекс
git add <файл>

# Добавление всех измененных файлов
git add .

# Интерактивное добавление
git add -i

Проверка статуса

# Проверка статуса репозитория
git status

# Краткий статус
git status -s

Просмотр изменений

# Просмотр неиндексированных изменений
git diff

# Просмотр индексированных изменений
git diff --staged

Отмена изменений

# Отмена изменений в рабочей директории
git checkout -- <файл>
# или
git restore <файл>

# Отмена индексации
git reset HEAD <файл>
# или
git restore --staged <файл>

Работа с коммитами

Изменение последнего коммита (amend)

Amend позволяет изменить последний коммит, добавив новые изменения или изменив сообщение.

# Изменение сообщения последнего коммита
git commit --amend -m "Новое сообщение"

# Добавление изменений в последний коммит
git add <файл>
git commit --amend --no-edit

Получение SHA коммита

SHA (Secure Hash Algorithm) - это уникальный идентификатор коммита.

# Получение полного SHA текущего коммита
git rev-parse HEAD

# Получение короткого SHA
git rev-parse --short HEAD

# Просмотр SHA коммитов в истории
git log --oneline

Сброс (reset)

Reset позволяет отменить коммиты или изменения в индексе.

# Мягкий сброс (сохраняет изменения в рабочей директории)
git reset --soft HEAD~1

# Смешанный сброс (сохраняет изменения, но не в индексе)
git reset HEAD~1

# Жесткий сброс (удаляет все изменения)
git reset --hard HEAD~1

Поиск автора кода (blame)

Blame позволяет узнать, кто и когда внёс изменения в определённые строки файла.

# Просмотр авторов строк в файле
git blame <файл>

# С ограничением по строкам
git blame -L 10,20 <файл>

Поиск в коде (grep)

Grep позволяет искать строки в файлах репозитория.

# Поиск строки во всех файлах
git grep "строка_для_поиска"

# Поиск с учетом контекста
git grep -n "строка_для_поиска"

# Поиск только в определенных файлах
git grep "строка_для_поиска" -- "*.js"

Работа с ветками

Слияние (merge)

Merge объединяет изменения из одной ветки в другую.

# Слияние ветки в текущую
git merge <имя_ветки>

# Слияние с созданием коммита слияния (no fast-forward)
git merge --no-ff <имя_ветки>

# Отмена слияния
git merge --abort

Fast-forward (FF) vs No Fast-forward (no-FF)

  • Fast-forward (FF): Если возможно, Git просто перемещает указатель текущей ветки вперед. Не создаётся отдельный коммит слияния.
  • No Fast-forward (no-FF): Всегда создаётся коммит слияния, даже если можно выполнить fast-forward. Это сохраняет информацию о существовании ветки в истории.

Перебазирование (rebase)

Rebase переносит коммиты из одной ветки на конец другой, создавая линейную историю.

# Перебазирование текущей ветки на другую
git rebase <имя_ветки>

# Отмена перебазирования
git rebase --abort

# Продолжение перебазирования после разрешения конфликтов
git rebase --continue

Интерактивный rebase

Интерактивный rebase позволяет изменять, объединять, удалять и переупорядочивать коммиты.

# Интерактивный rebase последних N коммитов
git rebase -i HEAD~N

# Интерактивный rebase от определенного коммита
git rebase -i <хеш_коммита>^

В открывшемся редакторе вы можете:

  • pick - оставить коммит как есть
  • reword - изменить сообщение коммита
  • edit - остановиться для изменения коммита
  • squash - объединить с предыдущим коммитом
  • fixup - объединить с предыдущим коммитом, отбросив сообщение
  • drop - удалить коммит

Объединение коммитов (squash)

Squash позволяет объединить несколько коммитов в один.

# Объединение последних N коммитов через интерактивный rebase
git rebase -i HEAD~N
# Затем замените "pick" на "squash" или "fixup" для коммитов, которые нужно объединить

Удаленные репозитории

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

# Просмотр удаленных репозиториев
git remote -v

# Добавление удаленного репозитория
git remote add <имя> <url>

# Получение изменений без слияния
git fetch <имя_удаленного_репозитория>

# Получение изменений и слияние
git pull <имя_удаленного_репозитория> <имя_ветки>

# Отправка изменений
git push <имя_удаленного_репозитория> <имя_ветки>

Bundle

Bundle позволяет создать архив с коммитами, который можно передать другим разработчикам без использования удаленного репозитория.

# Создание бандла со всеми ветками
git bundle create repo.bundle --all

# Создание бандла с определенной веткой
git bundle create repo.bundle <имя_ветки>

# Клонирование из бандла
git clone repo.bundle -b <имя_ветки> <директория>

Git Hooks (хуки)

Хуки - это скрипты, которые Git запускает перед или после определенных событий.

Основные хуки:

  • pre-commit: запускается перед созданием коммита
  • prepare-commit-msg: запускается перед открытием редактора сообщения коммита
  • commit-msg: запускается для проверки сообщения коммита
  • post-commit: запускается после создания коммита
  • pre-push: запускается перед отправкой изменений
  • post-checkout: запускается после переключения веток
# Хуки хранятся в директории .git/hooks/
# Пример создания pre-commit хука
echo '#!/bin/sh
# Проверка стиля кода
npm run lint' > .git/hooks/pre-commit
chmod +x .git/hooks/pre-commit

Дополнительные команды

Stash

Stash позволяет временно сохранить изменения, не создавая коммит.

# Сохранение изменений
git stash

# Применение последнего stash
git stash apply

# Удаление последнего stash после применения
git stash pop

# Просмотр списка stash
git stash list

# Удаление stash
git stash drop stash@{n}

Cherry-pick

Cherry-pick позволяет применить изменения из одного коммита к текущей ветке.

# Применение коммита к текущей ветке
git cherry-pick <хеш_коммита>

# Применение нескольких коммитов
git cherry-pick <хеш1> <хеш2>

Reflog

Reflog хранит историю изменений указателей (HEAD, ветки) и позволяет восстановить потерянные коммиты.

# Просмотр истории изменений HEAD
git reflog

# Восстановление до определенного состояния
git reset --hard HEAD@{n}

Bisect

Bisect помогает найти коммит, в котором появилась ошибка, с помощью бинарного поиска.

# Начало бинарного поиска
git bisect start

# Отметка текущего коммита как плохого
git bisect bad

# Отметка определенного коммита как хорошего
git bisect good <хеш_коммита>

# Отметка текущего коммита как хорошего/плохого в процессе поиска
git bisect good
git bisect bad

# Завершение поиска
git bisect reset

Конфигурация Git

# Установка имени пользователя
git config --global user.name "Имя Фамилия"

# Установка email
git config --global user.email "[email protected]"

# Установка редактора
git config --global core.editor "vim"

# Просмотр конфигурации
git config --list

Алиасы (сокращения команд)

# Создание алиаса
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 co -b new-branch
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment