git stash применить версию

У меня есть 2 ветки: master | дизайн

Работая в дизайне сделал заначку и перешел на мастер, внес некоторые коррективы. Вернулся к дизайну и сделал stash apply только для того, чтобы потерять все мои изменения в ветке дизайна.

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

Если я делаю список тайников, я получаю 4 результата:

stash@{0}: WIP on design: f2c0c72... Adjust Password Recover Email
stash@{1}: WIP on design: f2c0c72... Adjust Password Recover Email
stash@{2}: WIP on design: eb65635... Email Adjust
stash@{3}: WIP on design: eb65635... Email Adjust

Если я попробую git stash apply f2c0c72, я получаю сообщение об ошибке:

fatal: Needed a single revision
f2c0c72: no valid stashed state found

Как я могу применить конкретный тайник?


person Lee    schedule 15.12.2009    source источник
comment
Обратите внимание, что теперь (4 квартал 2016 г., Git 2.11) у вас есть синтаксис git stash apply 0 (вместо git stash apply stash@{0}). См. мой ответ здесь.   -  person VonC    schedule 11.11.2016


Ответы (7)


Ключи в тайнике на самом деле являются stash@{n} предметами слева. Так что постарайтесь:

git stash apply stash@{0}

(обратите внимание, что в некоторых оболочках вам нужно заключать в кавычки "stash@{0}", например zsh, fish и powershell).

Начиная с версии 2.11, это довольно просто, вы можете использовать номер стека N вместо stash@{n}. Итак, теперь вместо использования:

git stash apply "stash@{n}"

Вы можете ввести:

git stash apply n

Чтобы получить список тайников:

git stash list

На самом деле stash@{0} — это версия git, на которую вы можете переключиться... но git stash apply ... следует выяснить, как DTRT применить ее к вашему текущему местоположению.

person araqnid    schedule 15.12.2009
comment
Просто обратите внимание, что в некоторых оболочках stash@{n} необходимо заключать в кавычки. - person Senjai; 20.01.2015
comment
Еще один совет: вы можете сделать, например. gitk stash@{0}, чтобы показать изменения, внесенные вами в конкретный тайник. - person antinome; 12.06.2015
comment
Пользователям zsh необходимо двойные кавычки, например. git stash apply "stash@{0}" - person mynameistechno; 10.08.2015
comment
Zsh: Это также работает: git stash apply stash@\{n\}. - person Hindol; 28.08.2015
comment
В документации указано apply [--index] [-q|--quiet] [<stash>]. Как мне извлечь синтаксис stash@{n} из --index? - person P.Brian.Mackey; 10.02.2016
comment
Это отлично подходит для хранения некоторых локальных конфигураций и их применения по мере необходимости без загрязняющих коммитов. - person sashok_bg; 02.05.2016
comment
stash@{n} — самая неудобная команда для ввода. Есть ли какие-либо ярлыки для этого, кроме создания собственного псевдонима или функции? - person Dylanthepiguy; 07.07.2016
comment
почему git вообще использует этот дурацкий синтаксис? - person DanDan; 08.03.2019
comment
@Dylanthepiguy обновил ответ, включая новый синтаксис в 2.11. - person Vadim Kotov; 17.04.2019
comment
git stash apply n мирный - person Victor; 28.08.2019

Чтобы применить тайник и удалить его из списка тайников, запустите:

git stash pop stash@{n}

Чтобы применить тайник и сохранить его в кэше тайника, запустите:

git stash apply stash@{n}
person dwlz    schedule 15.12.2009
comment
Это здорово, спасибо за различие между двумя вариантами. Я только что попробовал это, и оказалось, что если вы перетащите тайник из ветки-a в ветку-b, тайник все равно останется в кеше тайника. Я предполагаю, что это было бы так, у вас все еще есть возможность вытолкнуть / применить тайник к ветке-a в будущем. Очень надеюсь, что это имело смысл. Удобно! - person longda; 28.03.2013
comment
Для PowerShell: git stash pop "stash@{n}" - person ankitjaininfo; 04.04.2014
comment
PowerShell устраивает только фигурные скобки в кавычках/одинарных кавычках: git stash apply stash@"{n}" - person m1kael; 22.06.2016
comment
PowerShell также принимает git stash apply stash@`{n`} (обратите внимание на обратные кавычки перед фигурными скобками). - person Ian Kemp; 07.11.2016

Начиная с версии 2.11, это довольно просто, вы можете использовать номер стека N вместо того, чтобы говорить "stash@{n}". Итак, теперь вместо использования:

git stash apply "stash@{n}"

Вы можете ввести:

git stash apply n

Например, в вашем списке:

stash@{0}: WIP on design: f2c0c72... Adjust Password Recover Email
stash@{1}: WIP on design: f2c0c72... Adjust Password Recover Email
stash@{2}: WIP on design: eb65635... Email Adjust
stash@{3}: WIP on design: eb65635... Email Adjust

Если вы хотите применить stash@{1}, вы можете ввести:

git stash apply 1

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

error: Your local changes to the following files would be overwritten by merge:
        file
Please commit your changes or stash them before you merge.

В версиях до 1.7.5.1 он отказывался работать при смене рабочего каталога.


Примечания к выпуску Git:

Пользователь всегда должен говорить «stash@{$N}» при именовании одного элемента в расположении тайника по умолчанию, т.е. reflogs в refs/stash. Команда "git stash" научилась принимать "git stash apply 4" как сокращение от "git stash apply stash@{4}"

git stash apply" использовался для отказа от работы, если в рабочем дереве было какое-либо изменение, даже если это изменение не пересекалось с изменением, записанным в тайнике.

person Pau    schedule 09.06.2017

Если вы работаете на компьютере с Windows и в PowerShell, вам нужно указать аргумент, например:

git stash apply "stash@{0}"

...или применить изменения и удалить из тайника:

git stash pop "stash@{0}"

В противном случае без кавычек вы можете получить эту ошибку:

фатальный: неоднозначный аргумент 'stash@': неизвестная ревизия или путь не в рабочем дереве.

person jterry    schedule 16.10.2015
comment
По-видимому, именно так вы должны это делать и при использовании fish shell в Mac OSX 10.11. - person lps; 11.11.2015

Чтобы просмотреть свою недавнюю работу и в какой ветке она произошла при запуске

git stash list

затем выберите тайник для применения и используйте только номер:

git stash apply n

Где n (в приведенном выше примере) — это число, соответствующее незавершенному производству.

person panthari    schedule 05.05.2019

git Stash list 

Список покажет все спрятанные предметы, например:тайник@{0}:,тайник@{1}:,..,тайник@{n}:

Затем выберите число n, обозначающее stash@{n}:

git stash apply n 

Например:

git stash apply 1 

применит эти конкретные спрятанные изменения к текущей ветке

person Harshavardhan reddy.    schedule 09.07.2019

Просто сделать простым для понимания для начинающих.

Проверьте свой список git stash с помощью следующей команды:

git stash list

А затем примените команду ниже:

git stash apply stash@{n}

Например: я применяю свой последний тайник (последний всегда имеет индекс {0} вверху списка тайников).

 git stash apply stash@{0}
person shrikant    schedule 15.06.2020
comment
Это в основном говорит то же самое, что и многие предыдущие ответы. - person JGallardo; 12.11.2020