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