EMZETT.
Увійти

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 відхилено