Git -stash vs. git -branch

В предыдущем Git вопросе Daniel Benamy говорил о рабочем процессе в Git:

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

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

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

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


@Jordi Bunster: Спасибо, это проясняет ситуацию. Наверное, я бы назвал "застревание" похожим на легкую, безымянную, ветку. Таким образом, все, что может сделать штемпель, может быть веткой, но с большим количеством слов. Ницца!

Ответ 1

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

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

git stash branch <branchname> [<stash>]

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

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

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

Ответ 2

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

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

$ git stash save 
Saved "WIP on master: e71813e..."

Вы также можете иметь более одного тайника. Закладка работает как стек. Каждый раз, когда вы сохраняете новый тайник, он помещается поверх стека.

$ git stash list
[email protected]{0}: WIP on master: e71813e..."

Обратите внимание на часть [email protected]{0}? Это ваш идентификатор кошелька. Вам понадобится его, чтобы восстановить его позже. Давайте сделаем это прямо сейчас. Идентификатор stash изменяется с каждым сделанным вами типом. stash @{0} относится к последнему типу, который вы сделали.

Чтобы применить штамп

$ git stash apply [email protected]{0}

Вы можете заметить, что прикосновение к нему все еще сохраняется. Вы можете отказаться от него, если вам это больше не нужно.

$ git stash drop [email protected]{0}

Или, поскольку stash действует как стек, вы можете вытащить последний сохраненный тайник:

$ git stash pop

Если вы хотите стереть все ваши штампы, запустите команду "clear":

$ git stash clear

Очень хорошо, что вы часто не используете приступы. Если вы просто хотите быстро скопировать свои изменения, чтобы восстановить их позже, вы можете оставить идентификатор stash.

$ git stash
...
$ git stash pop

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

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

Ответ 3

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

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

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

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

Ответ 4

Если вы ищете рабочий процесс, который может быть более подходящим, чем 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. Можно размещать и передавать эти коммиты среди репозиториев. Это может быть полезно для удаленных сборок, где у вас есть другой репозиторий на удаленном сервере только для создания или для взаимодействия с другими людьми при разрешении конфликтов.