Git - это распределённая система контроля версий, которая позволяет отслеживать изменения в файлах, сотрудничать с другими разработчиками и управлять историей проекта.
Репозиторий (repository) - это хранилище вашего проекта вместе с историей изменений.
# Создание нового репозитория
git init
# Клонирование существующего репозитория
git clone <url>
Коммит - это снимок состояния проекта в определенный момент времени.
# Создание коммита
git commit -m "Сообщение коммита"
# Просмотр истории коммитов
git log
Ветка - это независимая линия разработки. Ветки позволяют разрабатывать функциональность изолированно.
# Создание новой ветки
git branch <имя_ветки>
# Переключение на ветку
git checkout <имя_ветки>
# или
git switch <имя_ветки>
# Создание и переключение на новую ветку
git checkout -b <имя_ветки>
# или
git switch -c <имя_ветки>
# Просмотр всех веток
git branch
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 позволяет изменить последний коммит, добавив новые изменения или изменив сообщение.
# Изменение сообщения последнего коммита
git commit --amend -m "Новое сообщение"
# Добавление изменений в последний коммит
git add <файл>
git commit --amend --no-edit
SHA (Secure Hash Algorithm) - это уникальный идентификатор коммита.
# Получение полного SHA текущего коммита
git rev-parse HEAD
# Получение короткого SHA
git rev-parse --short HEAD
# Просмотр SHA коммитов в истории
git log --oneline
Reset позволяет отменить коммиты или изменения в индексе.
# Мягкий сброс (сохраняет изменения в рабочей директории)
git reset --soft HEAD~1
# Смешанный сброс (сохраняет изменения, но не в индексе)
git reset HEAD~1
# Жесткий сброс (удаляет все изменения)
git reset --hard HEAD~1
Blame позволяет узнать, кто и когда внёс изменения в определённые строки файла.
# Просмотр авторов строк в файле
git blame <файл>
# С ограничением по строкам
git blame -L 10,20 <файл>
Grep позволяет искать строки в файлах репозитория.
# Поиск строки во всех файлах
git grep "строка_для_поиска"
# Поиск с учетом контекста
git grep -n "строка_для_поиска"
# Поиск только в определенных файлах
git grep "строка_для_поиска" -- "*.js"
Merge объединяет изменения из одной ветки в другую.
# Слияние ветки в текущую
git merge <имя_ветки>
# Слияние с созданием коммита слияния (no fast-forward)
git merge --no-ff <имя_ветки>
# Отмена слияния
git merge --abort
- Fast-forward (FF): Если возможно, Git просто перемещает указатель текущей ветки вперед. Не создаётся отдельный коммит слияния.
- No Fast-forward (no-FF): Всегда создаётся коммит слияния, даже если можно выполнить fast-forward. Это сохраняет информацию о существовании ветки в истории.
Rebase переносит коммиты из одной ветки на конец другой, создавая линейную историю.
# Перебазирование текущей ветки на другую
git rebase <имя_ветки>
# Отмена перебазирования
git rebase --abort
# Продолжение перебазирования после разрешения конфликтов
git rebase --continue
Интерактивный rebase позволяет изменять, объединять, удалять и переупорядочивать коммиты.
# Интерактивный rebase последних N коммитов
git rebase -i HEAD~N
# Интерактивный rebase от определенного коммита
git rebase -i <хеш_коммита>^
В открывшемся редакторе вы можете:
pick
- оставить коммит как естьreword
- изменить сообщение коммитаedit
- остановиться для изменения коммитаsquash
- объединить с предыдущим коммитомfixup
- объединить с предыдущим коммитом, отбросив сообщениеdrop
- удалить коммит
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 позволяет создать архив с коммитами, который можно передать другим разработчикам без использования удаленного репозитория.
# Создание бандла со всеми ветками
git bundle create repo.bundle --all
# Создание бандла с определенной веткой
git bundle create repo.bundle <имя_ветки>
# Клонирование из бандла
git clone repo.bundle -b <имя_ветки> <директория>
Хуки - это скрипты, которые 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 позволяет временно сохранить изменения, не создавая коммит.
# Сохранение изменений
git stash
# Применение последнего stash
git stash apply
# Удаление последнего stash после применения
git stash pop
# Просмотр списка stash
git stash list
# Удаление stash
git stash drop stash@{n}
Cherry-pick позволяет применить изменения из одного коммита к текущей ветке.
# Применение коммита к текущей ветке
git cherry-pick <хеш_коммита>
# Применение нескольких коммитов
git cherry-pick <хеш1> <хеш2>
Reflog хранит историю изменений указателей (HEAD, ветки) и позволяет восстановить потерянные коммиты.
# Просмотр истории изменений HEAD
git reflog
# Восстановление до определенного состояния
git reset --hard HEAD@{n}
Bisect помогает найти коммит, в котором появилась ошибка, с помощью бинарного поиска.
# Начало бинарного поиска
git bisect start
# Отметка текущего коммита как плохого
git bisect bad
# Отметка определенного коммита как хорошего
git bisect good <хеш_коммита>
# Отметка текущего коммита как хорошего/плохого в процессе поиска
git bisect good
git bisect bad
# Завершение поиска
git bisect reset
# Установка имени пользователя
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