Как удалить тайник, созданный с помощью git stash create?

549

Git stash, кажется, делает многое из того, что я хочу, за исключением того, что он немного сложен в сценарии, так как если у вас нет никаких изменений, тогда вы git stash; git stash popбудете делать что-то другое, чем если бы у вас были изменения в вашем хранилище.

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

Чтобы было на 100% понятно, что я делаю:

Создайте тайник:

~/tmp/a(master) $ git stash create 
60629375d0eb12348f9d31933dd348ad0f038435
~/tmp/a(master) $ git st
# On branch master
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#   new file:   b
#
~/tmp/a(master) $ git reset --hard
HEAD is now at 555d572 log message

Используйте тайник:

~/tmp/a(master) $ git apply 60629375d0eb12348f9d31933dd348ad0f038435
fatal: can't open patch '60629375d0eb12348f9d31933dd348ad0f038435': No such file or directory
~/tmp/a(master) $ git stash apply 60629375d0eb12348f9d31933dd348ad0f038435
# On branch master
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#   new file:   b
#

Удалить тайник: (за исключением того, что этот последний бит не работает)

~/tmp/a(master) $ git stash drop !$
git stash drop 60629375d0eb12348f9d31933dd348ad0f038435
'60629375d0eb12348f9d31933dd348ad0f038435' is not a stash reference
Пол Уогланд
источник
Несмотря на разницу во времени, я хочу отметить для попутчиков, что git applyзапуск во втором блоке кода на момент написания этой статьи не применял патч - об этом сообщало сообщение об ошибке в выходных данных. Таким образом, на самом деле вы пытались создать тайник (который не работал, см. Комментарии ниже), применить тайник, который не был создан, а затем выбросить тайник, который не был создан. Вот почему вы ничего не сделали.
Профессор Том
1
@ ПрофессорТом был создан тайник, именно поэтому он возвратил хэш-код и почему git stash applyон работал. В git applyпопытки прочитать локальный файл патч, который не существует. Честно говоря, это, вероятно, просто не должно быть там, и это никогда не могло бы работать. Я смутно испытываю желание убрать его из вопроса, но, учитывая, что он помог многим в его нынешнем виде, я оставлю это как есть.
Пол Уогланд

Ответы:

369

Чтобы удалить нормальный тайник, созданный с помощью git stash, вы хотите git stash dropили git stash drop stash@{n}. Подробности смотрите ниже.


Вам не нужно удалять тайник, созданный с помощью git stash create. Из документов:

Создайте запись stash (которая является обычным объектом коммита) и верните имя ее объекта, не сохраняя его где-либо в пространстве имен ref. Это должно быть полезно для сценариев. Вероятно, это не та команда, которую вы хотите использовать; см. «сохранить» выше.

Поскольку ничто не ссылается на коммит, то в конечном итоге он будет собирать мусор.


Тайник, созданный с помощью git stashили git stash saveсохраненный в refs/stash, и может быть удален с git stash drop. Как и для всех объектов Git, фактическое содержимое тайника не удаляется с вашего компьютера до gcтех пор, пока эти объекты не будут удалены после истечения срока их действия (по умолчанию это 2 недели спустя).

Старые тайники сохраняются в refs/stash reflog (try cat .git/logs/refs/stash) и могут быть удалены с помощью git stash drop stash@{n}, где nуказано число git stash list.

dahlbyk
источник
20
Это не отвечает на главный вопрос. В результате, такие люди, как я, которые приходят к вопросу через Google в поисках ответа на основной вопрос и не особо заботятся о реальных деталях, голосуют за человека, который фактически ответил на него. Некоторые люди также злобно голосуют за принятый ответ, потому что он не помогает им. Я лично только что проголосовал за ответ, который мне помог.
ArtOfWarfare
15
Итак: 1) Google "git delete stash" 2) нажмите на ссылку SO, основываясь на первой половине заголовка вопроса 3) downvote правильный ответ, относящийся ко второй половине заголовка. Это новый.
dahlbyk
10
@ArtOfWarfare Это было бы нехваткой понимания прочитанного, потому что это очень ясно ответ на «титульный вопрос».
Крис Хейс
1
Справедливо. Я создаю свои тайники, используя просто git stash- я не знаю, соответствует ли это действительности git stash createили что-то еще. Git - это, конечно, то, о чем я все еще учусь (если бы не было, я бы не читал SO Q & As вот так).
ArtOfWarfare,
1
@AdrianPronk Это именно то, что я бы рекомендовал использовать git stash createдля. Вместо того, чтобы сохранять в файле патчей с меткой времени, вы можете просто позволить git reflog сохранить его для вас в пользовательском реф (например refs/backup). Я хотел бы попробовать что - то вроде 1) git stash create, 2) сравнить дерево нового притон с refs/backup^{tree}, 3) , если дерево отличается, git update-ref --create-reflog refs/backup <stash-sha>. В конце концов старые резервные копии будут автоматически удалены.
dahlbyk
838

git stash dropне принимает никакого параметра - который сбрасывает верхний тайник - или ссылку на тайник, которая выглядит следующим образом: stash@{n}которая указывает, nкакой тайник удалить. Вы не можете передать идентификатор коммита git stash drop.

git stash drop            # drop top hash, stash@{0}
git stash drop stash@{n}  # drop specific stash - see git stash list

Отбрасывание тайник будет менять на stash@{n}обозначения всех тайниках далее вниз по стеку.

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

CB Bailey
источник
Ну, запись создается с использованием «stash» ... Логично подумать, что она будет удалена с помощью «stash».
Пол Уогланд
2
Посмотрите на справочную страницу для git stash. stash create не создает запись, только объект фиксации для stash, поэтому в журнале stash нет записи для удаления.
CB Bailey
3
От man : create Создайте stash (который является обычным объектом коммита) и верните его имя объекта, не сохраняя его где-либо в пространстве имен ref.
ruffin
41
Предостережение : вам, вероятно, не следует отбрасывать кратные значения, такие как 1, 2, 3, поскольку на самом деле вы в конечном итоге отбрасываете то, что изначально было числами 1, 3 и 5. Правильный способ отбрасывания 1, 2 и 3 - это делайте их в порядке 3, 2, 1 или 1, 1, 1. Кроме того, он проиндексирован 0, причем 0 находится на вершине стека.
ArtOfWarfare
2
Git Extensions выдает неизвестную команду, когда нажимается кнопка «Stash Changes», и все, что она делает, сохраняется при выходе и перезапуске приложения. Не существует очевидного способа избавиться от тайника с помощью графического интерфейса, но из командной строки «git stash list» показывает тайник WIP, а «git stash clear» избавляется от него.
Дейв
215

Если вы на 100% уверены, что у вас есть только один тайник или хотите удалить все тайники (убедитесь, git stash listчто вы уверены на 107%), вы можете сделать следующее:

git stash clear

..и забыть о них (он удаляет все тайники).

Примечание: добавлен этот ответ для тех, кто попал сюда и ищет способ очистить их всех (как я).

Фелипе Перейра
источник
26
Если у вас есть только один тайник, я бы порекомендовал использовать его git stash drop, так как он оставляет только один тайник, и вам не нужно беспокоиться о потере больше, чем ожидалось.
Пол Уогланд
Утвержденный, поскольку это фактически отвечает на вопрос, является ли это лучшей практикой, чтобы сделать это. Я действительно нуждаюсь в этом, поскольку тайники, которые я создал сегодня, должны исчезнуть.
Алекс МакКейб
2
Я давно использую тайник. Однако на этот раз я не смог избавиться от последнего сундука, который я сделал, просто используя git stash dropкак обычно. Я не уверен, что я сделал по-другому. Во всяком случае, git stash clearработал на меня. Не знал, что это существует. +1
Константинос Гайтанис
3
+1, потому что git отказывался сбрасывать тайник, так как один из файлов, созданных тайником, уже существовал сейчас
Тьяго Баркала,
12
в частности, 107% уверены.
Левининя
84

Из git doc: http://git-scm.com/docs/git-stash

drop [-q | --quiet] []

Удалить одно спрятанное состояние из списка. Если нет, он удаляет самый последний. т. е. в stash@{0}противном случае должна быть действительная ссылка на журнал stash вида stash @ {}.

пример:

git stash drop stash@{5}

Это приведет к удалению записи тайника 5. Чтобы увидеть весь список тайников:

git stash list
Jorge
источник
4
За исключением того, что я прямо говорю в нижней части вопроса, что git stash drop не делает то, что я хочу.
Пол Уогланд
1
Я бы порекомендовал проверить содержимое тайника с помощью - git stash show stash@{REPLACE_IT_WITH_STASH_INDEX}перед выполнением git stash drop. Поверьте, это избавит вас от многих неприятностей :)
realPK 10.10.16
71

Вы должны использовать

git stash save

и не

git stash create

потому что это создает stash (который является обычным объектом коммита) и возвращает его имя объекта, не сохраняя его где-либо в пространстве имен ref. Следовательно не будет доступно с применением тайника.

Используется, git stash save "some comment"когда у вас есть неустановленные изменения, которые вы хотите скопировать / перенести в другую ветку.

Используйте git stash apply stash@{0}(при условии, что ваш сохраненный индекс хранилища равен 0), если вы хотите, чтобы ваши сохраненные (спрятанные) изменения отражались на вашей текущей ветке

Вы всегда можете использовать, git stash listчтобы проверить все ваши тайники

и используйте git stash drop stash@{0}(при условии, что ваш сохраненный индекс тайника равен 0, и вы хотите удалить его), чтобы удалить конкретный тайник.

Шалом Сэм
источник
3
Просто для информации - просто ввод команды по git stashумолчаниюgit stash save
RBT
1
git stash createпредназначен для использования скриптами. Это вариант использования ОП. Таким образом, рекомендации git stash saveмогут быть полезны для «нормального» использования, но не для варианта использования OP. OP может захотеть взглянуть на документы : например, есть больше команд, связанных со сценариямиgit stash store
Adrian W
1
git stash save "message"в наше время следует читать git stash push -m "message". Сравнитеgit commit -m "message"
Тино
2

Это тоже работает

git stash drop <index>

подобно

git stash drop 5
MonTea
источник
1

Документ находится здесь (на китайском языке), пожалуйста, нажмите.

ты можешь использовать

git stash list

git stash drop stash @ {0}

введите описание изображения здесь

Longalei
источник
git stash createотличается git stash save, в частности, форма создания не отображается в списке и не может быть удалена, поэтому вопрос.
Пол Уогланд
@PaulWagland Спасибо за ваш ответ и предоставить ответ. Честно говоря, я не могу найти "git stash create" в официальном документе. Но об этом, меня это интересует. Если вы хотите найти «git stash create» в «git stash list». Вы можете сделать это выше.
Лонгалей
0
git stash           // create stash,
git stash push -m "message" // create stash with msg,
git stash apply         // to apply stash,
git stash apply indexno // to apply  specific stash, 
git stash list          //list stash,
git stash drop indexno      //to delete stash,
git stash pop indexno,
stash pop = stash drop + stash apply
git stash clear         //clear all your local stashed code
Билал Якуб
источник