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


513

У меня есть 2 филиала: мастер | дизайн

Работая в дизайне, я сделал тайник и переключился на мастера, внёс некоторые коррективы. Вернулся к дизайну и 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

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


26
Обратите внимание, что теперь у вас есть (Q4 2016, Git 2.11) синтаксис git stash apply 0(вместо git stash apply stash@{0}). Смотрите мой ответ здесь .
VonC

Ответы:


839

Ключи от тайника - это 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 применить ее к вашему текущему местоположению.


90
Просто обратите внимание, что в некоторых оболочках stash @ {n} должен быть в кавычках.
Сенджаи

7
Другой совет: вы можете сделать, например, gitk stash@{0}чтобы показать изменения, которые вы сделали в конкретном тайнике.
Антином

11
Пользователям zsh нужно ставить двойные кавычки, напримерgit stash apply "stash@{0}"
mynameistechno

7
stash@{n}самая неловкая команда для ввода. Есть ли какие-либо ярлыки для этого, кроме создания собственного псевдонима или функции?
Dylanthepiguy

2
git stash apply nмирный
Виктор

242

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

git stash pop stash@{n}

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

git stash apply stash@{n}

8
Это здорово, спасибо за различие между двумя вариантами. Я только что попробовал это, и кажется, что если вы поместите тайник из ветви-a в ветку-b, тайник все равно останется в тайнике. Я думаю, это было бы так, чтобы у вас все еще была возможность добавить / применить тайник к ветке-a в будущем. Очень надеюсь, что это имело смысл. Handy!
Longda

42
Для PowerShell:git stash pop "stash@{n}"
ankitjaininfo

1
PowerShell доволен только фигурными скобками в кавычках / одинарных кавычках:git stash apply stash@"{n}"
m1kael

PowerShell также примет git stash apply stash@`{n`}(обратите внимание на галочки перед фигурными скобками).
Ян Кемп

52

Начиная с версии 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}», когда присваивает имя отдельному элементу в расположении по умолчанию для хранилища, то есть повторно ставит отметки в refs / stash. Команда "git stash" научилась принимать "git stash apply 4" как сокращение от "git stash apply stash @ {4}"

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


41

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

git stash apply "stash@{0}"

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

git stash pop "stash@{0}"

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

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


Очевидно, это то, как вы должны делать это при использовании fish shell на Mac OSX 10.11.
LPS

8
git stash list

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

git stash apply 1

2
Git Stash list 

В списке будут показаны все спрятанные элементы, например: stash @ {0} :, stash @ {1}:, .., stash @ {n}:

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

git stash apply n 

for eg: git stash apply 1 will apply that particular stashed changes to the current branch
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.