В каких случаях используется stash в Git?

Ответ

git stash используется для временного сохранения незакоммиченных изменений (как в рабочей директории, так и в индексе) без создания нового коммита. Это позволяет быстро очистить рабочую директорию, чтобы переключиться на другую ветку или выполнить другие операции, а затем вернуться к прерванной работе.

Основные сценарии использования git stash:

  • Смена контекста: Вам нужно срочно переключиться на другую ветку (например, для исправления бага или проверки чужого кода), но текущие изменения ещё не готовы для коммита. git stash сохраняет их, позволяя безопасно переключиться.
  • Обновление ветки: Перед выполнением git pull или git rebase на текущей ветке, чтобы избежать конфликтов с незакоммиченными локальными изменениями. После обновления можно применить stash обратно.
  • Эксперименты: Вы хотите попробовать новую идею или внести временные изменения, не загрязняя историю коммитов. git stash позволяет сохранить текущее состояние, провести эксперимент, а затем либо применить stash, либо отбросить его.
  • Очистка рабочей директории: Если вы хотите временно убрать все локальные изменения, чтобы начать с чистого листа, но не хотите их терять.

Примеры команд:

  • Сохранить изменения в stash:
    git stash save "WIP: Feature X" # С сообщением
    git stash                     # Без сообщения
  • Просмотреть список stash'ей:
    git stash list
  • Применить последний stash и удалить его из списка (pop):
    git stash pop
  • Применить последний stash, но оставить его в списке (apply):
    git stash apply
  • Применить конкретный stash (например, stash@{1}):
    git stash apply stash@{1}
  • Удалить последний stash:
    git stash drop

Важное замечание: По умолчанию git stash не сохраняет неотслеживаемые файлы (untracked files) и игнорируемые файлы (ignored files). Чтобы включить неотслеживаемые файлы, используйте флаг -u или --include-untracked:

git stash -u

Ответ 18+ 🔞

А, слушай, про эту вашу git stash! Ну, это ж как такая волшебная тумбочка, куда можно нахуй всё свалить, когда начальник (или твой же собственный мозг) требует срочно переключиться на другую задачу.

Представь: сидишь ты, такой, в коде по уши, всё уже почти работает, но выглядит как пиздец. И тут — бац! — надо срочно перебежать в другую ветку, баг пофиксить. Коммитить эту недоделанную хуйню нельзя, а терять — жалко. Вот тут-то и выручает git stash, ёпта!

Короче, зачем это нужно:

  • Срочно переключиться: Твой тимлид орёт, что в master всё горит, а у тебя в рабочей директории — творческий бардак. git stash — и рабочая папка чиста, как слеза младенца. Переключился, всё починил, вернулся — git stash pop, и твой бардак снова на месте, будто ничего и не было. Магия, блядь!
  • Обновиться без боли: Хочешь стянуть свежие изменения (git pull), но твои правки ещё не готовы. Если потянешь — будут конфликты, пиздец и ругань. Просто сделай stash, обнови ветку, потом верни свои правки обратно. Всё чисто.
  • Поэкспериментировать: Хочется попробовать какую-то дикую идею, но страшно всё сломать. Засейвил текущее состояние в stash, натворил дел. Если эксперимент провалился — просто выкинул stash и вернулся к исходнику. Если удался — ну, там видно будет.

Как этим пользоваться, чтобы не обосраться:

  • Быстро всё спрятать:
    git stash save "Тут я пытался починить авторизацию, но нихуя" # С пояснением, а то потом забудешь
    git stash                                                     # Или просто так, по-быстрому
  • Посмотреть, что там уже назапасли:
    git stash list

    Выведет что-то вроде stash@{0}: On main: Тут я пытался.... Нумерованные, блядь, сейфы!

  • Достать последнюю заначку и выкинуть пустую коробку (pop):
    git stash pop
  • Достать, но коробку оставить — вдруг ещё пригодится (apply):
    git stash apply
  • Достать конкретную заначку (например, позавчерашнюю):
    git stash apply stash@{1}
  • Выкинуть нахуй последний stash, если он не нужен:
    git stash drop

Важный нюанс, про который все забывают, а потом охуевают: По умолчанию эта команда игнорирует новые, неотслеживаемые файлы (untracked). То есть если ты создал super_secret_test.py и не добавил его в git, то git stash его проигнорит, и он так и останется болтаться. Чтобы спрятать ВСЁ, включая этот файл, надо крикнуть:

git stash -u

Вот тогда уж точно ничего не потеряется. Ну, почти точно.