Stash: знакомимся со «скрытым» функционалом Git

0
854
views

Перевод статьи «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}).

ОСТАВЬТЕ ОТВЕТ

Please enter your comment!
Please enter your name here