Перевод статьи «Learn the hidden feature in Git — Stash».
В этой статье мы разберем такую функцию Git, как stash. Начнем с разбора самого термина. Что такое stash? В переводе с английского это слово означает «припрятывать», «тайник», «запас». Применительно к Git смысл слова сохраняется. При помощи команды git stash
мы убираем (временно) изменения из рабочей директории, «прячем» их.
Когда имеет смысл использовать git stash и как это делается?
Команда git stash пригодится вам в случаях, когда вы не хотите коммитить недоделанную работу и планируете вернуться к ней позже.
Предположим, у нас есть git-репозиторий, а в нем два файла: index.html и feature-1.js.
В той же ветке master в файле feature-2.js ведется работа над новой фичей. Фича еще не готова, вы как раз ею занимаетесь.
Внезапно вам звонит тимлид и сообщает, что в feature 1
есть проблема, блокирующая работу другого члена команды. Вы должны немедленно внести правку, чтобы разблокировать вашего коллегу.
Для этого вам нужно внести изменения в файл feature-1.js, но при этом не запушить feature-2.js (потому что вы еще не закончили работу над feature 2
).
Вот здесь вам и пригодится git stash
.
В описанной выше ситуации вам нужно проделать следующие шаги.
1. Добавьте файлы, работу над которыми вы еще не закончили, в стейджинг. Это делается при помощи команды git add
:
git add feature-2.js
2. При помощи следующей команды уберите эти файлы из рабочей директории в stash:
// при помощи флага -m можно добавлять stash-сообщение. git stash push -m "feature 2 in progress"
3. После этого запустите команду git stash list
, чтобы вывести список содержимого stash. Вы увидите идентификатор вашего «тайника», а также оставленное сообщение. В нашем случае идентификатор — stash@{0}
.
stash@{0}: On master: feature 2 in progress
4. Файл feature-2.js станет недоступен в вашем git status
, а также в рабочей директории. Теперь вы можете заняться feature-1.js и запушить ваше изменение в удаленный репозиторий.
Отлично!
Вы успешно исправили проблему в файле feature-1.js.
Но как теперь вернуться к работе над feature-2.js?
Извлекаем файлы из stash
Для того, чтобы убрать файлы из рабочей директории в stash, мы использовали команду git stash push
. А чтобы вернуть их обратно, используется команда git stash apply
. Разберем весь процесс подробно.
1. Запустите команду git stash list
, чтобы просмотреть список «тайников» с их идентификаторами. Вы увидите наш тайник с его сообщением.
git stash list stash@{0}: On master: feature 2 in progress
2. Идентификатор нашего «тайника» — stash@{0}
. Чтобы применить изменения из этого «тайника» (т. е. вернуть файлы в рабочую директорию), выполните следующую команду:
git stash apply stash@{0}
3. После выполнения этой команды вы увидите следующий вывод:
On branch master Changes to be committed: (use "git reset HEAD <file>..." to unstage) new file: feature-2.js
4. В последней строке приведенного лога вы видите, что feature-2.js возвращен из «тайника». Теперь вы можете продолжить работу над feature 2
.
Давайте еще раз запустим git stash list
.
stash@{0}: On master: feature 2 in progress
Вероятно, вы удивитесь, но «тайник» все еще на месте. Мы вернули файл feature-2.js в рабочую директорию, так почему же он все еще в stash? Дело в том, что «тайник» нужно очистить.
Как очистить stash?
Есть два способа очистить примененный stash.
Можно удалить «тайник» по id. Следующая команда позволит удалить из списка «тайников» (stash list) конкретный stash:
git stash drop stash@{0}
Или можно очистить вообще весь список. Внимание: следующая команда удалит все «тайники» из списка.
git stash clear
Вот и все!
От редакции Techrocks. Под оригинальной статьей было несколько полезных комментариев. Мы решили перевести их тоже.
1. При помощи флага -u
(команда git stash -u
) можно добавлять в stash неотслеживаемые файлы (т. е. файлы не в стейджинге).
2. При помощи команды git stash pop
можно возвращать из stash последний добавленный тайник и одновременно удалять его из стека stash.
А если добавить индекс, можно проделать то же самое для любого «тайника» по вашему выбору (git stash pop stash@{stash_index}
).
[customscript]techrocks_custom_after_post_html[/customscript]
[customscript]techrocks_custom_script[/customscript]