Выбор команды
| Ситуация | Команда |
|---|---|
| Откатить изменения в файле | git restore файл |
| Убрать файл из индекса | git restore --staged файл |
| Поправить последний коммит | git commit --amend |
| Отменить коммит, уже отправленный на сервер | git revert |
| Убрать локальные коммиты | git reset |
| Отложить незаконченную работу | git stash |
| Вернуть «потерянное» | git reflog |
restore: рабочая папка и индекс
git restore app.txtgit restore .git restore --staged app.txtgit restore --source=HEAD~2 app.txtgit restore файл необратимо отбрасывает несохраненные изменения. Будьте осторожны.
amend: исправить последний коммит
Забыли файл или опечатка в сообщении:
git add forgotten.txtgit commit --amendgit commit --amend -m "Новое сообщение"git commit --amend --no-editamend создает новый коммит с новым хэшем. Не применяйте к коммитам, которые уже запушены в общую ветку.
reset: переместить ветку
git reset --soft HEAD~1git reset HEAD~1git reset --hard HEAD~1git reset --hard origin/main| Режим | Коммит | Индекс | Рабочая папка |
|---|---|---|---|
--soft | отменен | изменения остаются | остаются |
--mixed (по умолчанию) | отменен | сброшен | остаются |
--hard | отменен | сброшен | удалены |
--hard уничтожает несохраненные изменения. Для общих веток reset не используют: он переписывает историю.
revert: безопасная отмена
Создает новый коммит, который отменяет изменения указанного:
git revert a1b2c3dgit revert HEADgit revert -m 1 хэш-merge-коммитаИстория не переписывается, поэтому revert подходит для коммитов, уже попавших в main или в прод.
stash: отложить работу
Нужно срочно переключиться на другую ветку, а текущая работа не готова:
git stashgit stash push -m "половина формы входа"git stash -ugit stash listgit stash popgit stash apply stash@{1}git stash drop stash@{0}git stash clearpopприменяет последний stash и удаляет его;applyприменяет и оставляет в списке;-uвключает неотслеживаемые файлы.
reflog: машина времени
Git помнит, куда указывал HEAD, даже после reset --hard:
git refloggit reset --hard HEAD@{2}git switch -c rescue a1b2c3dЗаписи reflog хранятся примерно 90 дней. Удаленный коммит почти всегда можно вернуть, если вы его хотя бы один раз коммитили.
Если закоммитили в не ту ветку
git switch правильная-веткаgit cherry-pick хэшgit switch неправильная-веткаgit reset --hard HEAD~1Если случайно закоммитили секрет
Удаление из следующего коммита недостаточно: пароль остался в истории.
- Немедленно отзовите и замените ключ или пароль у сервиса. Это главное.
- Затем при необходимости почистите историю инструментом
git filter-repoи заставьте всех пересклонировать репозиторий.
Считайте, что любой секрет, попавший на сервер, уже скомпрометирован.
Очистка
git clean -ngit clean -fdgit clean -n показывает, что будет удалено. -fd удаляет неотслеживаемые файлы и папки безвозвратно.
