git stash, reflog і reset: збереження та порятунок змін
Коротко: За допомогою stash ви відкладаєте незавершену роботу, за допомогою reset відкочуєте стани, а reflog допомагає відновити майже будь-який, здавалося б, втрачений коміт.
Докладніше: Git зберігає набагато більше, ніж ви думаєте: навіть після reset --hard, випадково видаленої гілки чи невдалого rebase часто можна врятувати все, якщо діяти швидко. Достатньо невеликого репертуару.
Подробиці
git stash: відкласти роботу
git stash # відкласти поточні зміни
git stash -u # також нові (невідстежувані) файли
git stash list # список
git stash pop # повернути останній stash (і видалити)
git stash apply stash@{1} # повернути конкретний (зберегти)
git stash drop # видалити
git stash push -m "experiment" file.txtКорисно, коли потрібно швидко перемкнути гілку, не роблячи коміт. Stash належать лише локально вам; важливу роботу краще закомітити в окрему гілку.
git reset: скидання
git reset --soft HEAD~1: скасувати останній коміт, зміни лишаються підготовленими (staged).git reset HEAD~1(mixed): скасувати коміт, зміни лишаються в робочому каталозі.git reset --hard HEAD~1: відкинути коміт і зміни (небезпечно!).git restore fileвідкидає зміни файлу,git restore --staged fileприбирає його з області підготовки.- На спільних гілках краще
git revert <commit>, ніж reset: створює новий коміт, що скасовує зміну без переписування історії.
git reflog: страхувальна сітка
Reflog записує, куди вказували HEAD і гілки в останні тижні:
git reflog
git reset --hard e4f5g6h # відновити старий стан
git branch rescued e4f5g6h # або зберегти як нову гілкуТак відновлюються втрачені коміти після неправильного reset, rebase чи видаленої гілки (за замовчуванням близько 90 днів, лише в локальному репозиторії).
Типові порятунки
- Гілку видалено випадково:
git reflog, потімgit branch name <sha>. - Rebase зламаний:
git rebase --abortабоgit reset --hard ORIG_HEAD. - Закомітили не в ту гілку:
git branch new, потім у старійgit reset --hard HEAD~1. - Файл видалено, але був закомічений:
git restore --source=<commit> -- file. - Ніколи не комітили: тоді Git часто не може допомогти; комітьте регулярно, навіть незавершене (WIP-коміти), і наводьте лад пізніше.
Див. також: Git, git rebase, git bisect і cherry-pick, Розв’язання конфлікту злиття, Push відхилено