мерзавец против мерзавца - PullRequest
86 голосов
/ 02 сентября 2008

В предыдущем вопросе Git Даниэль Бенами говорил о рабочем процессе в Git:

Я работал над мастером и совершил кое-что, а затем решил, что хочу приостановить эту работу. Я сделал резервные копии нескольких коммитов, а затем разветвился до того, как начал свою дерьмовую работу.

Он хотел восстановить свое рабочее состояние в предыдущий момент времени, не теряя своих текущих изменений. Все ответы по-разному вращались вокруг чего-то вроде

git branch -m master crap_work
git branch -m previous_master master

Как это соотносится с git stash? Я немного сбит с толку, пытаясь понять, какой здесь другой вариант использования, когда кажется , как все, что делает git stash, уже обрабатывается ветвлением…


@ Джорди Бунстер : Спасибо, это проясняет ситуацию. Думаю, я бы посчитал, что "копить" - это как легкая, безымянная ветвь. Так что все, что может сделать stash, ветвь тоже может, но с большим количеством слов. Nice!

Ответы [ 4 ]

108 голосов
/ 02 сентября 2008

'stash' берет незафиксированные, " пакостные " материалы на вашу рабочую копию и прячет их, оставляя вам чистую рабочую копию.

На самом деле это совсем не ветвление. Затем вы можете применить тайник поверх любой другой ветви. Или, начиная с Git 1.6, вы можете сделать:

git stash branch <branchname> [<stash>]

, чтобы применить тайник поверх новой ветви, все в одной команде.

Итак, stash отлично работает, если вы еще не зафиксировали ветку " неправильно ".

Если вы уже подтвердили свою приверженность, то рабочий процесс, который вы описываете в своем вопросе, является лучшей альтернативой. И, между прочим, вы правы: Git очень гибок, и с этой гибкостью приходит пересекающаяся функциональность.

48 голосов
/ 05 июня 2009

Когда вы восстанавливаете свой тайник, ваши изменения вступают в силу, и вы продолжаете работать над своим кодом.

Чтобы сохранить текущие изменения

$ 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

Не стесняйтесь экспериментировать с тайником, прежде чем использовать его на действительно важной работе.

У меня также есть более подробная версия этого, опубликованная в моем блоге .

8 голосов
/ 25 сентября 2008

Я всегда настороженно отношусь к паршивости. Если вы прячете несколько раз, все становится беспорядочным. git stash list будет отображать нумерованный список созданных вами тайников с сообщениями, если вы их предоставили ... Но проблема заключается в том, что вы не можете очистить тайники, кроме как с помощью брутальной очистки git stash (которая удаляет их все) , Так что, если вы не всегда любите давать сверхописательные сообщения для ваших тайников (это противоречит философии тайника), вы в конечном итоге получите непонятную кучу тайников.

Единственный известный мне способ выяснить, какой из них - использовать gitk - all и обнаружить тайники. По крайней мере, это позволяет вам увидеть, на каком коммите был создан тайник, а также различие всего, что включено в этот тайник.

Обратите внимание, что я использую git 1.5.4.3, и я думаю, что 1.6 добавляет git stash pop, который, я думаю, применил бы выбранный stash и удалил его из списка. Который кажется намного чище.

Пока я всегда стараюсь переходить, если я не уверен, что вернусь к этому тайнику в тот же день, даже в течение часа.

3 голосов
/ 19 июля 2015

Если вы ищете рабочий процесс, который может быть более подходящим, чем git stash, вы можете посмотреть на git-bottle . Это утилита, предназначенная для сохранения и восстановления различных рабочих состояний git как обычных git-коммитов, эффективного создания снимков текущего и соответствующего состояния вашего рабочего дерева и всех различных состояний файлов, отображаемых в состоянии git.

Ключевые отличия от git stash:

  • git stash узко сохраняет грязное состояние git (измененные файлы и добавленные файлы в индексе), тогда как git-bottle предназначен для сохранения всего , отличного от HEAD, и оно дифференцирует сохраняющим способом между измененными, измененными и не добавленными, не добавленными, неотправленными путями и полными состояниями перебазирования / слияния (только пути под .gitignore не сохраняются).
  • git stash сохраняет для хранения объектов, которые необходимо отслеживать отдельно. Если я спрятал что-то 2 недели назад, я мог бы этого не помнить, тогда как git-bottle сохраняет как предварительные коммиты в текущую ветку . Обратное действие - git-unbottle, что эквивалентно git stash pop. Можно передавать и делиться этими коммитами среди репозиториев. Это может быть полезно для удаленных сборок, когда у вас есть другой репозиторий на удаленном сервере только для сборки или для сотрудничества с другими людьми по разрешению конфликтов.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...