Вопрос

В предыдущий вопрос по 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 хлоп.Эти коммиты можно передавать и делиться ими между репозиториями.Это может быть полезно при удаленных сборках, когда у вас есть другой репозиторий на удаленном сервере только для сборки или для совместной работы с другими людьми по разрешению конфликтов.
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top