Введение
С возвращением, исследователь Git! Сегодня мы погрузимся в одну из самых полезных функций Git для управления незавершенными делами — механизм «stash» (тайник). Случалось ли вам быть в самом разгаре работы над новой функцией, когда внезапно требовалось переключиться на другую задачу? Git stash спешит на помощь!
Представьте Git stash как магический ящик стола, куда можно временно сложить неоконченную работу. Это позволяет мгновенно сменить контекст, не создавая «грязных» коммитов с полуготовым кодом. Это невероятно удобно, когда нужно переключить ветку, подтянуть обновления из удаленного репозитория или срочно исправить критическую ошибку.
В этом практическом руководстве мы разберем, как использовать Git stash для сохранения промежуточных результатов, как возвращать эти изменения, создавать ветки на основе тайников, управлять списком из нескольких записей и наводить в нем порядок. К концу занятия в вашем арсенале появится мощный инструмент, который сделает ваш рабочий процесс более плавным и гибким.
Давайте приступим и раскроем возможности Git stash!
Подготовка рабочего пространства
Прежде чем мы начнем прятать изменения в тайник, давайте подготовим среду для экспериментов. Мы создадим новый каталог, инициализируем Git-репозиторий и добавим начальный контент.
Откройте терминал и введите следующие команды:
cd ~/project
mkdir git-stash-lab
cd git-stash-lab
git init
echo "## Git Stash Lab" > README.md
git add README.md
git commit -m "Initial commit"
Разберем, что делают эти команды:
cd ~/project: Переход в папку "project" в вашем домашнем каталоге.mkdir git-stash-lab: Создание новой папки с именем "git-stash-lab".cd git-stash-lab: Переход в только что созданную директорию.git init: Инициализация нового репозитория Git.echo "## Git Stash Lab" > README.md: Создание файла "README.md" с заголовком внутри.git add README.md: Добавление файла в индекс (подготовка к коммиту).git commit -m "Initial commit": Создание первого коммита с подготовленными изменениями.
Отлично! Теперь у нас есть репозиторий с одним коммитом. Проверим состояние:
git status
Вы должны увидеть сообщение о том, что рабочее дерево чисто (working tree clean). Это значит, что мы готовы к экспериментам с Git stash!
Если возникнут проблемы, убедитесь, что вы находитесь в правильной директории и Git корректно установлен. Проверить версию Git можно командой git --version.
Сохранение изменений в тайник
Теперь, когда рабочее пространство готово, давайте внесем изменения и научимся их «прятать».
Сначала изменим файл README.md:
echo "This is a work in progress" >> README.md
Эта команда добавляет новую строку в конец файла. Также создадим совершенно новый файл:
echo "Some important notes" > notes.txt
Теперь, если запустить git status, мы увидим как измененные, так и неотслеживаемые файлы:
git status
В выводе будет указано, что README.md изменен, а notes.txt является неотслеживаемым (untracked).
Представьте, что в этот момент вам нужно срочно переключиться на другую задачу, но вы не хотите фиксировать эти промежуточные правки коммитом. Здесь-то и пригодится git stash!
Чтобы убрать изменения в тайник, выполните:
git stash
Вы увидите сообщение, похожее на это:
Saved working directory and index state WIP on master: 1234567 Initial commit
Теперь снова проверьте статус:
git status
Вы заметите нечто любопытное: README.md больше не числится измененным, но notes.txt всё еще висит в списке неотслеживаемых файлов. Это важный нюанс работы git stash:
Важно: По умолчанию git stash сохраняет только:
- Изменения в отслеживаемых файлах (тех, о которых Git уже знает).
- Файлы, добавленные в индекс (staged).
Неотслеживаемые файлы (как наш notes.txt) по умолчанию не попадают в тайник. Это сделано для того, чтобы Git случайно не спрятал новые файлы, которые вы, возможно, и не собирались включать в репозиторий.
Если вы хотите включить неотслеживаемые файлы в тайник, используйте флаг -u (или --include-untracked):
git stash -u
После этой команды и правки в README.md, и новый файл notes.txt будут надежно спрятаны.
Чтобы посмотреть содержимое вашего тайника, используйте:
git stash list
Вы увидите одну или две записи, в зависимости от того, использовали ли вы флаг -u.
Нажмите q, чтобы выйти из режима просмотра списка.
Помните, что stash идеально подходит для быстрого переключения контекста. Однако это не замена коммитам в долгосрочной перспективе. Тайники предназначены для временного хранения.
Применение сохраненных изменений
Теперь, когда мы спрятали наши наработки, давайте научимся их возвращать. Для этого существуют две основные команды: git stash apply и git stash pop.
Начнем с git stash apply:
git stash apply
После выполнения этой команды вы можете заметить нечто неожиданное. Проверим статус:
git status
Вы увидите примерно следующее:
On branch master
Untracked files:
(use "git add <file>..." to include in what will be committed)
notes.txt
nothing added to commit but untracked files present (use "git add" to track)
Удивительно, но вы видите только notes.txt как неотслеживаемый файл, а изменений в README.md нет. Это произошло потому что:
- На шаге 2 мы сначала использовали
git stashбез флага-u, что спрятало только изменения в README.md. - Затем мы использовали
git stash -u, что спрятало неотслеживаемый notes.txt (README.md на тот момент уже был «чистым» после предыдущего stash). - При вызове
applyGit применяет самый свежий тайник (созданный с-u), который содержал только notes.txt. Поэтому изменения README.md не появились.
Чтобы вернуть все изменения, включая те, что в README.md, можно обратиться к конкретной записи:
git stash apply stash@{1}
Теперь при проверке статуса вы увидите и изменения в README.md, и файл notes.txt.
Эта ситуация подчеркивает важный аспект: порядок создания и применения тайников влияет на результат. Хорошей практикой считается проверка содержимого тайников перед их применением, особенно если их накопилось несколько.
Разница между apply и pop заключается в том, что apply просто накладывает изменения, оставляя их в списке тайников, а pop применяет изменения и сразу удаляет запись из списка.
git stash clear
git stash -u
git stash list
Мы сначала очистили все тайники, чтобы начать с чистого листа, затем снова спрятали изменения с флагом -u. Наконец, проверили список.
Теперь попробуем вернуть изменения через pop:
git stash pop
Результат будет таким же, как и раньше, но если вы введете git stash list, то увидите, что список пуст.
Зачем нужны обе команды? apply полезен, когда вы хотите применить одни и те же изменения к нескольким разным веткам. pop чаще используется, когда вы просто возвращаетесь к работе в той же ветке, где прервались.
Создание ветки из тайника
Иногда в процессе работы вы понимаете, что изменения, которые вы спрятали в тайник, на самом деле заслуживают отдельной ветки. Git позволяет легко это реализовать с помощью команды git stash branch.
Сначала создадим новые изменения и спрячем их:
echo "Feature in progress" >> README.md
echo "More notes" >> notes.txt
git stash -u
Теперь создадим новую ветку на основе этих изменений:
git stash branch feature-branch
Эта команда создает новую ветку с именем "feature-branch", переключается на нее и применяет к ней изменения из тайника. После этого запись автоматически удаляется из списка stash.
Вы увидите примерно такой вывод:
Switched to a new branch 'feature-branch'
On branch feature-branch
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git restore <file>..." to discard changes in working directory)
modified: README.md
Untracked files:
(use "git add <file>..." to include in what will be committed)
notes.txt
no changes added to commit (use "git add" and/or "git commit -a")
Dropped refs/stash@{0} (1234567890abcdef1234567890abcdef12345678)
Эта функция особенно полезна, когда вы спрятали какие-то экспериментальные правки, а позже решили, что их стоит развивать в отдельном потоке разработки.
Не забудьте, что после создания ветки из тайника вам нужно зафиксировать изменения коммитом, если вы хотите их сохранить:
git add README.md notes.txt
git commit -m "Start new feature"
Чтобы вернуться в основную ветку, используйте:
git checkout master
Управление несколькими тайниками
В процессе работы вы можете обнаружить, что у вас накопилось несколько наборов изменений в тайнике. Git позволяет легко ими управлять. Давайте научимся создавать, просматривать и упорядочивать несколько записей.
Для начала создадим три разных тайника:
## Первый тайник
echo "Change 1" >> README.md
git stash push -m "First change"
## Второй тайник с неотслеживаемым файлом
echo "Change 2" >> README.md
echo "Note 2" >> notes.txt
git stash push -u -m "Second change"
## Третий тайник
echo "Change 3" >> README.md
git stash push -m "Third change"
Примечание: Вы заметили, что теперь мы используем git stash push вместо простого git stash. Подкоманда push — это современный и предпочтительный способ создания тайников, особенно когда вы хотите добавить пояснительное сообщение с помощью флага -m. Хотя git stash и git stash -u всё еще работают (это сокращения для push), явное использование git stash push дает больше контроля и ясности.
Что мы сделали:
- Создали первый тайник с изменением в README.md.
- Создали второй тайник с изменением в README.md и новым файлом.
- Создали третий тайник с еще одной правкой в README.md.
- Использовали флаг
-mдля добавления описательных комментариев. - Использовали флаг
-uдля второго тайника, чтобы включить новый файл.
Теперь посмотрим на список:
git stash list
Вы увидите что-то подобное:
stash@{0}: On master: Third change
stash@{1}: On master: Second change
stash@{2}: On master: First change
Вы можете изучить содержимое конкретного тайника, не применяя его:
git stash show stash@{1}
Для более детального просмотра добавьте флаг -p, чтобы увидеть полный дифф (разницу в коде):
git stash show -p stash@{1}
Создадим еще пару записей для практики:
## Четвертый тайник
echo "Change 4" >> README.md
git stash push -m "Fourth change"
## Пятый тайник
echo "Change 5" >> README.md
git stash push -m "Fifth change"
Снова проверьте список:
git stash list
Теперь в списке должно быть пять записей:
stash@{0}: On master: Fifth change
stash@{1}: On master: Fourth change
stash@{2}: On master: Third change
stash@{3}: On master: Second change
stash@{4}: On master: First change
Управление несколькими тайниками полезно, когда вы жонглируете несколькими задачами одновременно. Однако старайтесь не накапливать их слишком много, чтобы не запутаться. Для долгосрочных задач лучше использовать ветки.
Помните: тайники временны. Если вы храните что-то в stash неделями, возможно, пришло время оформить это в виде ветки или коммита.
Очистка списка тайников
По мере использования stash в вашем рабочем процессе могут накапливаться записи, которые вам больше не нужны. Регулярная очистка — хороший тон, помогающий поддерживать порядок.
Чтобы удалить одну конкретную запись, используйте команду drop:
git stash drop stash@{2}
Это удалит третий по счету тайник (с пометкой "Third change") из списка.
Если вы хотите удалить абсолютно все записи разом, используйте:
git stash clear
Будьте предельно осторожны с этой командой! Она безвозвратно удаляет все ваши сохраненные в тайнике изменения.
Еще одна полезная команда — git stash pop, которую мы изучили ранее. Она применяет самый свежий тайник и тут же удаляет его из списка:
git stash pop
Старайтесь держать список тайников коротким. Если их становится слишком много, это сигнал о том, что стоит чаще делать коммиты или переносить работу в тематические ветки (feature branches).
Резюме
Поздравляем, мастер Git stash! Вы только что добавили мощный инструмент в свой арсенал разработчика. Давайте повторим основные моменты:
- Сохранение изменений: Вы научились временно прятать работу с помощью
git stash. - Применение изменений: Вы узнали, как возвращать правки командами
git stash applyиgit stash pop. - Создание веток из тайника: Вы увидели, как превратить спрятанные изменения в новую ветку через
git stash branch. - Управление списком: Вы научились работать с несколькими записями, просматривать их содержимое и выбирать нужные.
- Очистка: Вы освоили правила гигиены рабочего пространства, удаляя ненужные записи по одной или все сразу.
Git stash — это невероятно полезная функция, позволяющая мгновенно переключаться между задачами, не засоряя историю коммитов недоделанной работой. Она незаменима, когда нужно срочно сменить контекст.
Помните: хотя тайники очень удобны, они предназначены для временного хранения. Для серьезной и долгой работы лучше использовать коммиты или ветки. Используйте stash с умом, и ваш рабочий процесс станет гораздо более гибким и эффективным!



