Основы Git
Git — распределённая система контроля версий, которая сохраняет историю изменений проекта, помогает сравнивать версии файлов, создавать независимые ветки разработки и совместно работать над кодом.
Git отслеживает не отдельные действия в редакторе, а состояния файлов, сохранённые в виде коммитов.
Типичный цикл работы:
Изменение файлов
↓
git add
↓
Индекс (staging area)
↓
git commit
↓
История репозиторияПроверить установленную версию Git:
git --versionПеред первым использованием рекомендуется указать имя и электронную почту:
git config --global user.name "Ivan Ivanov"
git config --global user.email "ivan@example.com"Посмотреть текущие настройки:
git config --listСодержание
- Зачем нужна система контроля версий
- Разница между Git, GitHub и GitLab
- Основные области Git
- Создание репозитория: `git init`
- Клонирование репозитория: `git clone`
- Проверка состояния: `git status`
- Добавление изменений: `git add`
- Создание коммита: `git commit`
- Просмотр изменений: `git diff`
- Просмотр истории: `git log`
- Базовый цикл работы
- Ветки
- Объединение веток: `git merge`
- Fast-forward merge
- Конфликты слияния
- Файл `.gitignore`
- Удалённые репозитории: `git remote`
- Отправка изменений: `git push`
- Получение информации: `git fetch`
- Получение и объединение: `git pull`
- Связь локальных и удалённых веток
- Создание репозитория на GitHub или GitLab
- README
- Pull Request и Merge Request
- Что сделано
- Как проверить
- Откат незакоммиченных изменений
- Откат через `git checkout --`
- Удаление файла из индекса
- Откат коммитов: `git reset`
- Безопасная отмена коммита: `git revert`
- Выбор команды для отката
- Типичный сценарий индивидуальной работы
- Типичный сценарий командной работы
- Полезные команды
- Общий пример
Зачем нужна система контроля версий
VCS (Version Control System) — система контроля версий. Она хранит историю изменений файлов и позволяет управлять разными версиями проекта.
Без VCS разработчики часто создают копии каталогов:
project
project-final
project-final-2
project-final-really
project-final-fixedСистема контроля версий решает эту проблему и позволяет:
- сохранять историю изменений;
- узнавать, кто, когда и зачем изменил код;
- возвращаться к предыдущим версиям;
- сравнивать версии файлов;
- разрабатывать несколько функций параллельно;
- объединять изменения разных разработчиков;
- создавать резервную копию репозитория на удалённом сервере;
- проводить проверку кода перед добавлением в основную ветку.
Локальные и удалённые репозитории
Локальный репозиторий находится на компьютере разработчика. В нём можно создавать коммиты, ветки и просматривать историю без подключения к интернету.
Удалённый репозиторий находится на сервере, например GitHub или GitLab. Он используется для обмена изменениями и совместной работы.
Локальный репозиторий ←→ Удалённый репозиторийРазница между Git, GitHub и GitLab
Git — программа и система контроля версий. Она работает локально и управляется командами из терминала.
GitHub — веб-сервис для хранения Git-репозиториев и совместной работы.
GitLab — другой веб-сервис для Git-репозиториев. Он предоставляет похожие возможности и может разворачиваться на собственном сервере.
| Инструмент | Назначение |
|---|---|
| Git | Управление версиями и историей проекта |
| GitHub | Размещение Git-репозиториев и совместная работа |
| GitLab | Размещение репозиториев, совместная работа и автоматизация |
| Git Bash | Терминал для работы с Git, обычно используемый в Windows |
Git можно использовать без GitHub и GitLab:
git init
git add .
git commit -m "Первый коммит"GitHub и GitLab используют Git, но добавляют веб-интерфейс и дополнительные возможности:
- просмотр файлов и истории;
- Pull Request или Merge Request;
- обсуждение изменений;
- управление задачами;
- проверку кода;
- автоматическую сборку и тестирование;
- управление участниками проекта.
Основные области Git
В базовой модели Git используются три области.
Рабочая директория
Рабочая директория (working tree) — файлы проекта, которые разработчик видит и редактирует.
Например:
project/
├── index.html
├── styles.css
└── script.jsИндекс
Индекс (staging area) — промежуточная область, в которой собираются изменения для следующего коммита.
Команда:
git add index.htmlдобавляет текущую версию index.html в индекс.
Репозиторий
Репозиторий хранит историю зафиксированных изменений.
Команда:
git commit -m "Добавлена главная страница"создаёт коммит из изменений, находящихся в индексе.
Рабочая директория → Индекс → Репозиторий
git add git commitСоздание репозитория: git init
Команда git init создаёт новый локальный Git-репозиторий в существующей директории.
mkdir my-project
cd my-project
git initGit создаст скрытую директорию .git:
my-project/
└── .git/В .git хранятся:
- история коммитов;
- ветки;
- настройки репозитория;
- служебные данные Git.
Удаление .git удаляет историю Git, но не удаляет обычные файлы проекта.
Проверить состояние нового репозитория:
git statusПример создания первого коммита:
git init
git add .
git commit -m "Первый коммит"Указать имя основной ветки при инициализации:
git init -b mainЕсли репозиторий уже создан, переименовать текущую ветку можно так:
git branch -M mainПовторный вызов git init в существующем репозитории обычно не удаляет историю и не создаёт вложенный репозиторий. Git только повторно инициализирует текущий репозиторий.
Клонирование репозитория: git clone
Команда git clone загружает существующий удалённый репозиторий на компьютер.
git clone https://github.com/user/project.gitGit:
- создаст директорию
project; - загрузит файлы;
- загрузит историю коммитов;
- настроит удалённый репозиторий с именем
origin; - переключится на основную ветку.
После клонирования:
cd project
git status
git remote -vКлонирование в директорию с другим именем:
git clone https://github.com/user/project.git local-projectКлонирование по SSH:
git clone git@github.com:user/project.gitHTTPS обычно проще для первого знакомства. SSH удобен для регулярной работы после настройки ключей.
git init или git clone
Используйте git init, если проект уже находится на компьютере и для него нужно начать вести историю:
cd existing-project
git initИспользуйте git clone, если репозиторий уже существует на GitHub, GitLab или другом сервере:
git clone https://example.com/user/project.gitНе нужно выполнять git init внутри репозитория, полученного через git clone: он уже инициализирован.
Проверка состояния: git status
Команда git status показывает текущее состояние рабочей директории и индекса:
git statusОна сообщает:
- текущую ветку;
- наличие изменённых файлов;
- изменения, добавленные в индекс;
- неотслеживаемые файлы;
- наличие конфликтов;
- отличие локальной ветки от удалённой.
Короткий формат:
git status --shortПример:
M styles.css
A script.js
?? notes.txtОбозначения:
| Статус | Значение |
|---|---|
?? |
Новый неотслеживаемый файл |
M |
Изменённый файл |
A |
Новый файл добавлен в индекс |
D |
Файл удалён |
R |
Файл переименован |
В коротком формате два столбца показывают состояние индекса и рабочей директории:
XY имя-файлаПервый символ относится к индексу, второй — к рабочей директории.
Добавление изменений: git add
Команда git add добавляет изменения в индекс для следующего коммита.
Добавить один файл:
git add index.htmlДобавить несколько файлов:
git add index.html styles.cssДобавить все изменения из текущей директории:
git add .Добавить все изменения в репозитории, включая удаления:
git add -AДобавить все изменения уже отслеживаемых файлов:
git add -uПосле git add полезно проверить состояние:
git statusgit add не создаёт коммит и не отправляет изменения на сервер. Команда только помещает выбранную версию файлов в индекс.
Если после git add снова изменить файл, Git будет видеть две версии изменений:
- версию, уже добавленную в индекс;
- новые изменения в рабочей директории.
Посмотреть различия можно командами:
git diff
git diff --stagedСоздание коммита: git commit
Коммит — сохранённое состояние подготовленных изменений с автором, датой, идентификатором и сообщением.
Создать коммит:
git commit -m "Добавлена форма регистрации"В коммит попадут только изменения, добавленные через git add.
Пример базового цикла:
git status
git add index.html styles.css
git commit -m "Добавлена главная страница"Хорошее сообщение коммита кратко описывает выполненное изменение:
git commit -m "Добавлена проверка электронной почты"
git commit -m "Исправлено отображение меню на мобильных устройствах"
git commit -m "Обновлена инструкция по запуску проекта"Малоинформативные сообщения:
git commit -m "Изменения"
git commit -m "Исправления"
git commit -m "Готово"Коммит всех отслеживаемых файлов
Команда:
git commit -am "Исправлена навигация"автоматически добавляет в индекс изменения уже отслеживаемых файлов и создаёт коммит.
Новые неотслеживаемые файлы она не добавляет. Для них всё равно нужен git add.
Изменение последнего коммита
Добавить забытые изменения в последний локальный коммит:
git add forgotten-file.txt
git commit --amend --no-editИзменить сообщение последнего коммита:
git commit --amend -m "Новое сообщение"--amend создаёт новый коммит вместо предыдущего, поэтому изменяется его идентификатор. Не рекомендуется изменять таким способом коммит, который уже отправлен другим разработчикам.
Просмотр изменений: git diff
Команда git diff показывает различия между версиями файлов.
Изменения, не добавленные в индекс
git diffКоманда сравнивает рабочую директорию с индексом.
Изменения, добавленные в индекс
git diff --stagedАльтернативная запись:
git diff --cachedКоманда показывает изменения, которые попадут в следующий коммит.
Все изменения относительно последнего коммита
git diff HEADИзменения конкретного файла
git diff styles.cssСравнение двух коммитов
git diff abc123 def456Сравнение веток
git diff main feature/loginВ выводе строки с - обозначают удалённый текст, а строки с + — добавленный:
-const title = "Old title";
+const title = "New title";Перед коммитом полезно выполнить:
git diff
git diff --stagedЭто помогает проверить, какие изменения ещё не подготовлены и какие уже войдут в коммит.
Просмотр истории: git log
Команда git log показывает историю коммитов:
git logОбычно для каждого коммита отображаются:
- идентификатор;
- автор;
- дата;
- сообщение.
Краткий формат:
git log --onelineПример:
4f28c1a Добавлена форма входа
72e91bf Создана главная страница
a15b302 Первый коммитПоказать граф веток:
git log --oneline --graph --decorate --allПоказать последние пять коммитов:
git log -5Показать историю конкретного файла:
git log -- index.htmlПоказать изменения внутри коммитов:
git log -pПоказать краткую статистику изменённых файлов:
git log --statИдентификатор коммита
Каждый коммит имеет уникальный хеш:
4f28c1ae3dc5b3d80d637a7c3f25049ac781ab12В командах часто достаточно использовать первые несколько символов:
git show 4f28c1aПоказать содержимое и информацию о коммите:
git show 4f28c1aHEAD
HEAD — указатель на текущий коммит и обычно на текущую ветку.
HEAD → main → последний коммитПредыдущий коммит:
HEAD~1Два коммита назад:
HEAD~2Пример:
git show HEAD~1Базовый цикл работы
Типичная последовательность действий:
git status
git diff
git add .
git diff --staged
git commit -m "Добавлена страница профиля"
git log --onelineПолный смысл команд:
git status → проверить состояние
git diff → посмотреть неподготовленные изменения
git add → подготовить изменения
git diff --staged → проверить будущий коммит
git commit → сохранить коммит
git log → посмотреть историюОдин коммит желательно посвящать одной логически завершённой задаче.
Например, исправление ошибки и полная переработка дизайна обычно должны находиться в разных коммитах.
Ветки
Ветка — независимая линия разработки. Ветки позволяют работать над новой функцией или исправлением, не изменяя основную версию проекта до завершения работы.
Основная ветка обычно называется main.
A — B — C main
\
D — E feature/loginВетка является указателем на определённый коммит. Создание ветки не копирует весь проект.
Просмотр веток: git branch
Показать локальные ветки:
git branchТекущая ветка отмечается символом *:
* main
feature/loginПоказать локальные и удалённые ветки:
git branch --allПоказать дополнительную информацию:
git branch -vСоздание ветки
Создать ветку без переключения:
git branch feature/loginСоздать ветку и сразу переключиться:
git switch -c feature/loginСтарый вариант:
git checkout -b feature/loginВ имени ветки удобно указывать назначение:
feature/login
feature/profile-page
fix/header-layout
docs/readmeПереключение веток: git switch
Переключиться на существующую ветку:
git switch feature/loginВернуться в основную ветку:
git switch mainПереключение через git checkout
До появления git switch для переключения использовалась команда:
git checkout feature/loginСоздать ветку и переключиться:
git checkout -b feature/loginДля работы с ветками предпочтительнее git switch, потому что она имеет более узкое и понятное назначение.
Удаление ветки
Удалить объединённую локальную ветку:
git branch -d feature/loginПринудительно удалить ветку, даже если изменения не объединены:
git branch -D feature/login-D может привести к потере коммитов, если они недоступны из других веток.
Объединение веток: git merge
Команда git merge добавляет изменения указанной ветки в текущую ветку.
Допустим, работа выполнялась в feature/login:
git switch feature/loginПосле завершения создаётся коммит:
git add .
git commit -m "Добавлена форма входа"Для объединения нужно перейти в ветку, которая должна получить изменения:
git switch main
git merge feature/loginВажно запомнить правило:
Сначала перейти в принимающую ветку,
затем выполнить git merge с именем подключаемой ветки.После успешного объединения рабочую ветку можно удалить:
git branch -d feature/loginFast-forward merge
Fast-forward — простое объединение, при котором основная ветка не изменялась после создания рабочей ветки.
До объединения:
A — B main
\
C — D feature/loginКоманда:
git switch main
git merge feature/loginПосле объединения:
A — B — C — D main, feature/loginGit просто перемещает указатель main на последний коммит рабочей ветки. Отдельный merge-коммит не создаётся.
Пример сообщения Git:
Fast-forwardЕсли после создания рабочей ветки в main появились новые коммиты, fast-forward может быть невозможен:
A — B — C main
\
D — E feature/loginВ таком случае Git обычно создаёт отдельный merge-коммит или просит разрешить конфликты.
Принудительно создать merge-коммит даже при возможности fast-forward:
git merge --no-ff feature/loginРазрешить только fast-forward и отменить команду в остальных случаях:
git merge --ff-only feature/loginКонфликты слияния
Конфликт возникает, когда разные ветки несовместимо изменили один и тот же участок файла.
Git отмечает конфликтующий участок:
<<<<<<< HEAD
Текст из текущей ветки
=======
Текст из подключаемой ветки
>>>>>>> feature/loginДля разрешения конфликта нужно:
- открыть конфликтующий файл;
- выбрать правильный вариант или объединить изменения вручную;
- удалить маркеры
<<<<<<<,=======и>>>>>>>; - добавить исправленный файл в индекс;
- завершить слияние коммитом.
git add conflicted-file.txt
git commitПосмотреть конфликтующие файлы:
git statusОтменить незавершённое слияние:
git merge --abortФайл .gitignore
Файл .gitignore содержит правила для файлов и директорий, которые Git не должен отслеживать.
Пример структуры проекта:
project/
├── .gitignore
├── index.html
├── node_modules/
└── .envСодержимое .gitignore:
node_modules/
.env
dist/
*.logОсновные шаблоны
Игнорировать конкретный файл:
config.local.jsИгнорировать директорию:
node_modules/Игнорировать все файлы с расширением .log:
*.logИгнорировать все .tmp-файлы во всех директориях:
**/*.tmpИгнорировать директорию только в корне репозитория:
/build/Не игнорировать конкретный файл:
*.log
!important.logКомментарий:
# Зависимости проекта
node_modules/Пустые строки не влияют на правила.
Типичный .gitignore для frontend-проекта
# Зависимости
node_modules/
# Результат сборки
dist/
build/
# Переменные окружения
.env
.env.local
.env.*.local
# Логи
*.log
npm-debug.log*
yarn-debug.log*
# Настройки редакторов
.vscode/
.idea/
# Системные файлы
.DS_Store
Thumbs.dbНе следует добавлять в репозиторий:
- пароли;
- секретные ключи;
- токены доступа;
- локальные настройки;
- автоматически установленные зависимости;
- временные файлы;
- результаты сборки, если проект не требует их хранения.
Уже отслеживаемые файлы
.gitignore не перестаёт отслеживать файл, который ранее был добавлен в Git.
Если .env уже отслеживается:
git rm --cached .env
git commit -m "Файл .env исключён из репозитория"Для директории:
git rm -r --cached node_modules
git commit -m "Директория node_modules исключена из репозитория"Флаг --cached удаляет объект из индекса Git, но сохраняет его в рабочей директории.
Проверить, почему файл игнорируется:
git check-ignore -v .envУдалённые репозитории: git remote
Удалённый репозиторий (remote) — ссылка на репозиторий, расположенный на сервере.
Показать настроенные удалённые репозитории:
git remoteПоказать их адреса:
git remote -vПример:
origin https://github.com/user/project.git (fetch)
origin https://github.com/user/project.git (push)origin — стандартное имя основного удалённого репозитория. Это соглашение, а не обязательное слово.
Добавление удалённого репозитория
git remote add origin https://github.com/user/project.gitПроверка:
git remote -vИзменение адреса
git remote set-url origin https://github.com/user/new-project.gitУдаление подключения
git remote remove originКоманда удаляет только локальную ссылку. Репозиторий на сервере не удаляется.
Информация об удалённом репозитории
git remote show originОтправка изменений: git push
Команда git push отправляет локальные коммиты в удалённый репозиторий.
Первая отправка основной ветки:
git push -u origin mainЗдесь:
origin— имя удалённого репозитория;main— имя отправляемой ветки;-u— связывает локальную ветку с удалённой.
После установки связи обычно достаточно:
git pushОтправить рабочую ветку:
git push -u origin feature/loginУдалить ветку на сервере:
git push origin --delete feature/logingit push отправляет только созданные коммиты. Изменения, которые находятся только в рабочей директории или индексе, не отправляются.
Изменить файл → git add → git commit → git pushПолучение информации: git fetch
Команда git fetch загружает информацию о новых коммитах и ветках из удалённого репозитория, но не изменяет текущие файлы:
git fetchДля конкретного удалённого репозитория:
git fetch originПосле загрузки можно посмотреть историю:
git log --oneline --graph --decorate --allУдалённая ветка обычно отображается как:
origin/mainСравнить локальную и удалённую ветки:
git diff main..origin/mainОбъединить полученные изменения вручную:
git merge origin/maingit fetch удобен, когда сначала нужно посмотреть изменения и только затем решить, объединять ли их с локальной веткой.
Получение и объединение: git pull
Команда git pull получает изменения с сервера и объединяет их с текущей веткой:
git pullВ базовом варианте она приблизительно соответствует последовательности:
git fetch
git mergeЯвное указание репозитория и ветки:
git pull origin mainПеред git pull желательно:
- проверить текущую ветку;
- создать коммит для важных локальных изменений;
- убедиться, что рабочая директория находится в понятном состоянии.
git status
git pullЕсли локальная и удалённая ветки содержат несовместимые изменения, может возникнуть конфликт.
Разница между fetch и pull
| Команда | Загружает изменения | Изменяет текущую ветку |
|---|---|---|
git fetch |
Да | Нет |
git pull |
Да | Да |
Безопасный вариант с предварительной проверкой:
git fetch origin
git log --oneline main..origin/main
git merge origin/mainБыстрый вариант:
git pullСвязь локальных и удалённых веток
После команды:
git push -u origin mainлокальная ветка main начинает отслеживать origin/main.
Проверить связь:
git branch -vvПример:
* main 4f28c1a [origin/main] Добавлена главная страницаОсновные обозначения в git status:
Your branch is up to date with 'origin/main'.Локальная ветка синхронизирована с удалённой.
Your branch is ahead of 'origin/main' by 2 commits.Есть два локальных коммита, которые ещё не отправлены. Обычно нужен:
git pushYour branch is behind 'origin/main' by 2 commits.На сервере есть два новых коммита. Обычно нужен:
git pullYour branch and 'origin/main' have diverged.Локально и на сервере появились разные коммиты. Их необходимо объединить с помощью merge или rebase в соответствии с правилами проекта.
Создание репозитория на GitHub или GitLab
Общий порядок действий в веб-интерфейсе:
- войти в учётную запись;
- выбрать создание нового проекта или репозитория;
- указать имя;
- при необходимости добавить описание;
- выбрать видимость;
- решить, нужно ли автоматически создавать
README; - создать репозиторий.
Основные варианты видимости:
| Видимость | Описание |
|---|---|
| Public | Репозиторий доступен всем |
| Private | Доступ имеют только приглашённые участники |
| Internal | Доступен участникам организации или сервера, если платформа поддерживает режим |
Подключение существующего локального проекта
Если удалённый репозиторий создан пустым:
cd my-project
git init
git add .
git commit -m "Первый коммит"
git branch -M main
git remote add origin https://github.com/user/my-project.git
git push -u origin mainДля GitLab последовательность та же, меняется адрес:
git remote add origin https://gitlab.com/user/my-project.git
git push -u origin mainЕсли на сервере уже создан README, .gitignore или лицензия, удалённый репозиторий содержит собственный коммит. В таком случае проще сначала клонировать его:
git clone https://github.com/user/my-project.git
cd my-projectЗатем добавить файлы проекта, создать коммит и выполнить git push.
README
README.md — основной файл с описанием проекта. GitHub и GitLab обычно показывают его содержимое на главной странице репозитория.
Минимальный пример:
# Название проекта
Краткое описание проекта.
## Установка
```bash
npm install
\```
## Запуск
```bash
npm run dev
\```
## Использование
Описание основных возможностей проекта.Обычно README содержит:
- название проекта;
- краткое описание;
- требования;
- инструкцию по установке;
- инструкцию по запуску;
- примеры использования;
- структуру проекта;
- информацию о настройке;
- правила участия в разработке.
Добавить README в существующий проект:
git add README.md
git commit -m "Добавлено описание проекта"
git pushPull Request и Merge Request
Pull Request (PR) — запрос на добавление изменений из одной ветки в другую. Такое название используется на GitHub.
На GitLab аналогичный механизм называется Merge Request (MR).
Типичный процесс:
main
↓
создание feature-ветки
↓
изменения и коммиты
↓
push ветки
↓
Pull Request / Merge Request
↓
проверка
↓
merge в mainСоздание рабочей ветки
git switch main
git pull
git switch -c feature/loginВнести изменения и создать коммит:
git add .
git commit -m "Добавлена форма входа"Отправить ветку:
git push -u origin feature/loginСоздание простого Pull Request на GitHub
В веб-интерфейсе GitHub нужно:
- открыть репозиторий;
- перейти к созданию Pull Request;
- выбрать базовую ветку
main; - выбрать ветку с изменениями, например
feature/login; - проверить список коммитов и изменённых файлов;
- указать заголовок и описание;
- создать Pull Request;
- после проверки выполнить merge.
Направление объединения:
base: main ← compare: feature/loginПример заголовка:
Добавлена форма входаПример описания:
## Что сделано
Добавлена форма входа с полями электронной почты и пароля.
## Как проверить
1. Открыть страницу входа.
2. Заполнить поля.
3. Нажать кнопку «Войти».Создание Merge Request на GitLab
Последовательность почти такая же:
- отправить рабочую ветку;
- открыть проект в GitLab;
- создать Merge Request;
- выбрать
feature/loginкак source branch; - выбрать
mainкак target branch; - заполнить заголовок и описание;
- отправить Merge Request на проверку;
- после одобрения выполнить merge.
После объединения локальную ветку можно удалить:
git switch main
git pull
git branch -d feature/loginЕсли ветка осталась на сервере:
git push origin --delete feature/loginОткат незакоммиченных изменений
Способ отката зависит от того, где находятся изменения:
Рабочая директория → Индекс → Коммит → Удалённый репозиторийПеред откатом всегда полезно проверить:
git status
git diff
git diff --stagedОткат через git checkout --
Старая команда для отмены изменений файла в рабочей директории:
git checkout -- index.htmlРазделитель -- показывает, что после него указано имя файла, а не ветки.
Команда восстанавливает файл из индекса. Если файл не добавлялся через git add, его содержимое обычно вернётся к состоянию последнего коммита.
Явно восстановить файл из HEAD:
git checkout HEAD -- index.htmlОтменить все незакоммиченные изменения в текущей директории:
git checkout -- .Эти действия удаляют локальные изменения без создания резервной копии.
Современный и более понятный вариант:
git restore index.htmlВосстановить все файлы:
git restore .Удаление файла из индекса
Если изменения были добавлены через git add, но их не нужно включать в следующий коммит:
git reset HEAD index.htmlВ современных версиях Git можно использовать:
git restore --staged index.htmlКоманда удаляет изменения из индекса, но сохраняет их в рабочей директории.
До команды:
изменения находятся в индексе
После команды:
изменения остаются в файле,
но не попадут в следующий коммитДля всех файлов:
git reset HEAD .Или:
git restore --staged .Откат коммитов: git reset
Команда git reset перемещает текущую ветку на другой коммит. В зависимости от режима она также может изменить индекс и рабочую директорию.
git reset --soft
Отменяет коммит, но сохраняет изменения в индексе:
git reset --soft HEAD~1После команды изменения готовы к новому коммиту:
git status
git commit -m "Исправленное сообщение"Подходит, если нужно пересобрать последний локальный коммит.
git reset или git reset --mixed
Режим по умолчанию:
git reset HEAD~1То же самое:
git reset --mixed HEAD~1Команда:
- отменяет последний коммит;
- удаляет его изменения из индекса;
- сохраняет изменения в рабочих файлах.
После этого изменения можно отредактировать и добавить заново:
git add .
git commit -m "Новый коммит"git reset --hard
Полностью возвращает репозиторий к указанному коммиту:
git reset --hard HEAD~1Команда изменяет:
- текущую ветку;
- индекс;
- рабочую директорию.
Все отслеживаемые изменения после выбранного коммита удаляются.
Вернуться к конкретному коммиту:
git reset --hard 4f28c1a--hard следует использовать только после проверки истории и состояния:
git status
git log --onelineСравнение режимов reset
| Команда | Перемещает ветку | Сбрасывает индекс | Изменяет файлы |
|---|---|---|---|
git reset --soft |
Да | Нет | Нет |
git reset --mixed |
Да | Да | Нет |
git reset --hard |
Да | Да | Да |
reset изменяет историю. Поэтому его обычно используют для локальных коммитов, которые ещё не были отправлены другим разработчикам.
Безопасная отмена коммита: git revert
Команда git revert создаёт новый коммит, который отменяет изменения указанного коммита:
git revert 4f28c1aОтменить последний коммит:
git revert HEADИстория до revert:
A — B — CПосле отмены коммита C:
A — B — C — DКоммит D содержит обратные изменения для C. Сам коммит C остаётся в истории.
git revert рекомендуется использовать для коммитов, которые уже опубликованы:
git revert HEAD
git pushreset и revert
| Команда | Изменяет существующую историю | Создаёт новый коммит | Подходит для опубликованных изменений |
|---|---|---|---|
git reset |
Да | Нет | Обычно нет |
git revert |
Нет | Да | Да |
Правило:
Локальный неопубликованный коммит → reset
Опубликованный общий коммит → revertПри отмене старого коммита может возникнуть конфликт, если последующие коммиты изменили тот же код.
Выбор команды для отката
Отменить изменения файла, которые ещё не добавлены в индекс:
git restore file.txtСтарый вариант:
git checkout -- file.txtУбрать файл из индекса, сохранив изменения:
git restore --staged file.txtСтарый вариант:
git reset HEAD file.txtОтменить последний локальный коммит, оставив изменения в индексе:
git reset --soft HEAD~1Отменить последний локальный коммит, оставив изменения только в файлах:
git reset HEAD~1Полностью удалить последний локальный коммит и его изменения:
git reset --hard HEAD~1Безопасно отменить опубликованный коммит:
git revert HEAD
git pushТипичный сценарий индивидуальной работы
Создание проекта:
mkdir my-project
cd my-project
git init -b mainСоздание файлов и первого коммита:
git add .
git commit -m "Первый коммит"Подключение GitHub или GitLab:
git remote add origin https://github.com/user/my-project.git
git push -u origin mainРабота над новой функцией:
git switch -c feature/profileСохранение изменений:
git status
git diff
git add .
git diff --staged
git commit -m "Добавлена страница профиля"Отправка ветки:
git push -u origin feature/profileПосле объединения Pull Request:
git switch main
git pull
git branch -d feature/profileТипичный сценарий командной работы
Перед началом задачи обновить основную ветку:
git switch main
git pullСоздать отдельную ветку:
git switch -c feature/searchВнести изменения и создать коммиты:
git add .
git commit -m "Добавлен интерфейс поиска"Отправить ветку:
git push -u origin feature/searchСоздать Pull Request или Merge Request.
После объединения обновить локальную основную ветку:
git switch main
git pullУдалить завершённую локальную ветку:
git branch -d feature/searchПолезные команды
| Команда | Назначение |
|---|---|
git init |
Создать локальный репозиторий |
git clone URL |
Клонировать удалённый репозиторий |
git status |
Показать состояние файлов |
git add file |
Добавить файл в индекс |
git add . |
Добавить изменения текущей директории |
git commit -m "Текст" |
Создать коммит |
git diff |
Показать неподготовленные изменения |
git diff --staged |
Показать подготовленные изменения |
git log |
Показать историю |
git log --oneline |
Показать краткую историю |
git branch |
Показать локальные ветки |
git branch name |
Создать ветку |
git switch name |
Переключиться на ветку |
git switch -c name |
Создать ветку и переключиться |
git checkout name |
Переключиться на ветку старым способом |
git merge name |
Объединить указанную ветку с текущей |
git remote -v |
Показать удалённые репозитории |
git push |
Отправить коммиты |
git fetch |
Загрузить информацию без объединения |
git pull |
Загрузить и объединить изменения |
git restore file |
Отменить изменения рабочего файла |
git reset |
Переместить ветку и сбросить состояние |
git revert commit |
Создать отменяющий коммит |
Общий пример
Создание локального проекта:
mkdir git-example
cd git-example
git init -b mainСоздание README.md:
# Git Example
Учебный проект для изучения Git.Первый коммит:
git status
git add README.md
git commit -m "Добавлен README"Создание рабочей ветки:
git switch -c feature/home-pageДобавление файлов:
git-example/
├── README.md
├── index.html
└── styles.cssСохранение изменений:
git status
git diff
git add index.html styles.css
git diff --staged
git commit -m "Добавлена главная страница"Объединение с помощью fast-forward:
git switch main
git merge feature/home-page
git branch -d feature/home-pageПодключение удалённого репозитория:
git remote add origin https://github.com/user/git-example.git
git push -u origin mainСледующая задача:
git switch -c feature/navigationПосле изменений:
git add .
git commit -m "Добавлена навигация"
git push -u origin feature/navigationЗатем изменения можно добавить в main через Pull Request или Merge Request.