Як видалити скриньку, створену за допомогою 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
@ProfessorTom був створений скрипт, саме тому він повернув хеш-код і чому git stash applyвін працював. В git applyспроби прочитати локальний файл патч, який не існує. Якщо чесно, це, мабуть, просто не повинно бути там, і це ніколи не могло працювати. Я невимушено намагаюся зняти це з питання, але враховуючи, що він так багато допоміг у своєму теперішньому вигляді, я залишу його як є.
Пол Вагленд

Відповіді:


367

Щоб видалити звичайний пристрій, створений за допомогою git stash, ви хочете git stash dropабо git stash drop stash@{n}. Дивіться нижче для отримання більш детальної інформації.


Вам не потрібно видаляти скриньку, створену за допомогою git stash create. З документів:

Створіть схований запис (який є звичайним об'єктом фіксації) і поверніть його ім'я об'єкта, не зберігаючи його ніде в області імен ref. Це призначено для корисного використання сценаріїв. Це, мабуть, не команда, яку ви хочете використовувати; див. "Зберегти" вище.

Оскільки нічого не посилається на прихильність, то згодом буде зібрано сміття.


Скриття, створене за допомогою git stashабо git stash saveзбережене в refs/stash, і може бути видалено за допомогою git stash drop. Як і у всіх об'єктах Git, фактичний вміст сховища не видаляється з комп'ютера, поки їх не gcобрізають після закінчення терміну дії (за замовчуванням - 2 тижні пізніше).

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


20
Це не відповідає титульному питанню. Як результат, такі люди, як я, які приходять на запитання через Google, шукаючи відповідь на титульне питання і не особливо дбають про фактичні деталі, голосуючи за того, хто насправді відповів на нього. Деякі люди також злісно голосують за прийняту відповідь, оскільки це їм не допомагає. Я особисто просто підтримував відповідь, яка мені допомогла.
ArtOfWarfare

15
Отже: 1) Google "git delete скринька" 2) натисніть посилання SO на основі першої половини заголовка питання 3) downvote правильну відповідь, специфічну для другої половини заголовка. Це новий.
dahlbyk

10
@ArtOfWarfare Це буде брак розуміння читання, тому що це дуже чітко відповідь на "титульне питання".
Кріс Хейс

1
Справедливо. Я створюю свої скрині, використовуючи просто git stash- не знаю, чи насправді це карта git stash createчи щось інше. Git - це, безумовно, те, про що я все ще дізнаюся (якби не так, я б не читав ТАК І як це.)
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запис, не створюється для вашого "сховища", тому нічого не можна скидати.


Ну, запис створений за допомогою "скрині" ... Логічно можна думати, що його буде видалено за допомогою "скрині".
Пол Вагленд

2
Подивіться на сторінку чоловіка, щоб дізнатись про сховище git. stash create не створює запис, лише об’єкт фіксації для сховища, щоб не було запису в журналі зберігання.
CB Bailey

3
Від людини : створіть Створити приховану скриньку (яка є звичайним об'єктом фіксації) і поверніть її ім'я об'єкта, не зберігаючи його ніде в просторі імен ref.
ruffin

40
Попередження : Ви, ймовірно, не повинні кидати кратні, як 1, 2, 3, оскільки ви насправді втратите те, що спочатку було числом 1, 3 і 5. Правильним способом відкинути 1, 2 і 3, було б: виконайте їх у порядку 3, 2, 1 або 1, 1, 1. Крім того, він індексується 0, причому 0 знаходиться у верхній частині стека.
ArtOfWarfare

2
Git Extensions видає невідому команду, коли натискається кнопка "Заховати зміни", і все, що вона робиться, зберігається через вихід та перезапуск програми. Немає очевидного способу позбутися від сховища за допомогою GUI, але в командному рядку "git stash list" відображається скрипт WIP, а "git stash clear" позбавляється від нього.
Дейв

215

Якщо ви на 100% впевнені, що у вас є лише одна скринька, або ви хочете видалити всі скриньки (зробіть git stash list107% впевненими), ви можете зробити:

git stash clear

..і забудьте про них (видаляє всі скрипки).

Примітка. Додано цю відповідь для тих, хто опинився тут, шукаючи спосіб очистити їх усіх (як я).


26
Якщо у вас є лише одна сховище, я все-таки рекомендую використовувати git stash drop, оскільки це скидає лише одну сховище, і вам не доведеться турбуватися про втрату більше, ніж очікувалося.
Пол Вагленд

Оновлений, оскільки він фактично відповідає на питання, чи це найкраща практика для цього. Мені насправді це потрібно, оскільки стаси, які я створив сьогодні, потрібно пропасти.
Алекс МакКейб

2
Я вже давно використовую приховування. Однак цього разу я не зміг позбутися останнього скрипта, який я зробив, просто використовуючи, git stash dropяк завжди. Я не впевнений у тому, що робив інакше. У всякому разі, git stash clearпрацював на мене. Не знав, що існує. +1
Костянтинос Гайтаніс

3
+1, тому що git відмовлявся скидати скриньку, оскільки один із файлів, створених
скриптом,

12
конкретно, 107% впевнені.
levininja

84

Від git doc: http://git-scm.com/docs/git-stash

крапля [-q | - тихо] []

Видаліть один прихований стан зі списку сховищ. Коли не вказано, він видаляє останню. тобто stash@{0}інакше має бути дійсною посиланням журналу сховання форми stash @ {}.

приклад:

git stash drop stash@{5}

Це дозволить видалити запис 5. Закрити список. Щоб переглянути весь список скриптів:

git stash list

4
За винятком того, що я чітко кажу внизу питання, що крапля схуднення git не робить те, що я хочу.
Пол Вагленд

1
Я рекомендую перевірити вміст сховища за допомогою - git stash show stash@{REPLACE_IT_WITH_STASH_INDEX}перед виконанням git stash drop. Повірте, це врятує багато клопоту :)
realPK

71

Ви повинні використовувати

git stash save

і ні

git stash create

тому що це створює приховану скриньку (яка є звичайним об'єктом фіксації) і повертає її ім'я об'єкта, не зберігаючи його ніде в просторі імен 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може бути корисною для «звичайних» цілей, але не для випадку використання ОП. ОП може захотіти ознайомитися з документами : є більше команд, пов’язаних із сценарієм, наприклад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

1

Документ тут (китайською), натисніть.

ви можете використовувати

git скринька

git stash drop stash @ {0}

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


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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.