Вопрос
В предыдущий вопрос по Git, Дэниел Бенами рассказывал о рабочем процессе в Git:
Я работал над master и кое-что сделал, а потом решил, что хочу приостановить эту работу.Я сделал резервную копию нескольких коммитов, а затем разветвил их до того, как начал свою дерьмовую работу.
Он хотел восстановить свое рабочее состояние на предыдущий момент времени без потери текущих изменений.Все ответы по-разному вращались вокруг чего-то вроде
git branch -m master crap_work
git branch -m previous_master master
Как это соотносится с git stash
?Я немного сбит с толку, пытаясь понять, какой другой вариант использования здесь, когда это кажется как и все остальное git stash
does уже обрабатывается ветвлением…
@Джорди Банстер:Спасибо, это проясняет ситуацию.Наверное, я бы предпочел, чтобы "заначка" была чем-то вроде легкой, безымянной ветви.Так что все, что может сделать stash, может и branch, но с большим количеством слов.Мило!
Решение
'stash' принимает незафиксированное, " dirty " что-то на вашей рабочей копии и хранит ее, оставляя чистую рабочую копию.
Это действительно не разветвляется вообще. Затем вы можете применить тайник поверх любой другой ветви. Или, начиная с Git 1.6, вы можете сделать:
git stash branch <branchname> [<stash>]
чтобы применить тайник поверх новой ветви, все в одной команде.
Итак, stash отлично работает, если вы не указали на неправильный " ветвь еще.
Если вы уже сделали это, то лучшим вариантом будет рабочий процесс, который вы описываете в своем вопросе. И, между прочим, вы правы: Git очень гибок, и с этой гибкостью приходит дублирующая функциональность.
Другие советы
Когда вы восстанавливаете свой тайник, ваши изменения вступают в силу, и вы продолжаете работать над своим кодом.
Чтобы сохранить текущие изменения
$ git stash save
Saved "WIP on master: e71813e..."
Вы также можете иметь более одного тайника. Тайник работает как стек. Каждый раз, когда вы сохраняете новый тайник, он помещается поверх стека.
$ git stash list
stash@{0}: WIP on master: e71813e..."
Обратите внимание на часть stash @ {0}
? Это твой тайник. Вам понадобится, чтобы восстановить его позже. Давайте сделаем это прямо сейчас. Идентификатор тайника меняется при каждом создании тайника. тайник @ {0} относится к последнему тайнику, который ты сделал.
Чтобы применить тайник
$ git stash apply stash@{0}
Вы можете заметить, что тайник все еще там после того, как вы применили его. Вы можете оставить его, если он вам больше не нужен.
$ git stash drop stash@{0}
Или, поскольку тайник работает как стопка, вы можете извлечь последний сохраненный тайник:
$ git stash pop
Если вы хотите стереть все ваши тайники, введите команду очистки:
$ git stash clear
Вполне возможно, что вы не часто используете тайники. Если вы просто хотите быстро спрятать свои изменения, чтобы потом восстановить их, вы можете не указывать идентификатор тайника.
$ git stash
...
$ git stash pop
Не стесняйтесь экспериментировать с тайником, прежде чем использовать его на действительно важной работе.
У меня также есть более подробная версия этого сообщения, размещенная на мой блог .
Я всегда настороженно отношусь к паршивости. Если вы прячете несколько раз, все становится беспорядочным. git stash list отобразит нумерованный список созданных вами тайников с сообщениями, если вы их предоставили ... Но проблема заключается в том, что вы не можете очистить тайники, кроме как с помощью брутальной очистки git stash (которая удаляет их все) , Так что, если вы не всегда любите давать суперинскриптивные сообщения для своих тайников (это противоречит философии тайника), у вас получается непонятная куча тайников.
Единственный известный мне способ выяснить, какой из них использовать gitk - все и найти тайники. По крайней мере, это позволяет увидеть, на каком коммите был создан тайник, а также различие всего, что включено в этот тайник.
Обратите внимание, что я использую git 1.5.4.3, и я думаю, что 1.6 добавляет git stash pop, который, я думаю, применил бы выбранный stash и удалил его из списка. Который кажется намного чище.
Пока я всегда стараюсь переходить, если я не уверен, что вернусь к этому тайнику в тот же день, даже в течение часа.
Если вы ищете рабочий процесс, который может быть более подходящим, чем git stash, вы можете посмотреть на мерзавец-бутылка.Это утилита для сохранения и восстановления различных рабочих состояний git в виде обычных коммитов git, эффективно делающая моментальные снимки текущего и соответствующего состояния вашего рабочего дерева и ВСЕ различные состояния файлов, показанные в разделе git status.
Ключевые отличия от git stash
:
git stash
сохраняет грязное состояние git в узком смысле (измененные файлы и добавленные файлы в индекс), тогда какgit-bottle
предназначен для экономии все это отличается отHEAD
, и он сохраняет различия между измененными, модифицированными и не добавленными, не добавленными, несвязанными путями и полными состояниями перебазирования / слияния (только пути в разделе.gitignore
не сохраняются).git stash
сохраняет для хранения объекты, которые вам нужно отслеживать отдельно.Если бы я спрятал что-то 2 недели назад, я мог бы этого не помнить, тогда какgit-bottle
сохраняет как предварительные фиксации в текущей ветке.Обратное действие заключается вgit-unbottle
что является эквивалентомgit stash
хлоп.Эти коммиты можно передавать и делиться ими между репозиториями.Это может быть полезно при удаленных сборках, когда у вас есть другой репозиторий на удаленном сервере только для сборки или для совместной работы с другими людьми по разрешению конфликтов.