Ответ 1
Возможно ли это?
Да, это!
git checkout -p [email protected]{0}
Где вы можете заменить 0
в [email protected]{0}
индексом кошелька, который вы хотите применить.
Используйте git stash list
и git show -p [email protected]{n}
, если не уверены, какой n
- это тавро, которое вы хотите применить.
Не забывайте git stash drop [email protected]{n}
, когда вам известно, что этот тайник больше не нужен, так как git checkout
, очевидно, не отбросит вас.
Почему это работает?
Ключ должен понять, что stashes по существу references для фиксирует точно так же, как теги и ветки.
В самом деле, они хранятся в .git/refs/stash
, одна строка в хэш-таблице.
Предостережения
Поскольку @mgadda упоминает int комментарии ниже, git checkout -p
пытается применить всю разницу между фиксацией и текущей рабочей областью.
В случае git stash, если stash, который вы пытаетесь применить, был сделан против другой фиксации, тогда git checkout -p [email protected]{n}
попытается интерактивно применить все различия между [email protected]{n}
и всеми он parent совершает и текущую рабочую область.
Например, если вы пытаетесь применить к текущему рабочему пространству сохраненный "много коммитов назад", git checkout -p [email protected]{n}
попытается применить не только изменения в своде, но и попытаться выполнить вернуть все изменения, произошедшие между фиксацией, на которой основан stash, и текущей фиксацией.
Аналогичным образом, если вы пытаетесь применить кошелек "из будущего", т.е. в ветку, которая представляет собой количество коммитов до фиксации, на которой основан stash, тогда git checkout -p [email protected]{n}
будет также применяться все другие изменения, которые произошли между текущим фиксацией и фиксацией из будущего, кроме изменений самого стата.
(В случае, если вам интересно, git checkout -p [email protected]{n}
, тайник из параллельной ветки попытается вернуть все изменения между текущей фиксацией и исходной точкой ветвления, а также применить все изменения между точкой ветвления и другой веткой, кроме того изменение кошелька).
Есть несколько обходных решений, ни одна из них не идеальна для любой ситуации:
-
Будьте осторожны с патчами, которые вы принимаете, когда вы делаете
git checkout -p [email protected]{n}
-
Сделайте
git stash pop
, затемgit stash
еще раз перед тем, как сделатьgit checkout -p ...
. Но если вы хотите сделать частичное применение своего кошелька, чтобы избежать конфликтов, это не поможет. -
Если у вас есть инструмент графического разграничения, поддерживаемый git (например, meld), вы можете использовать
git difftool
и "применить левые" все изменения, которые вас интересуют.-
git difftool -d [email protected]{n}
, чтобы сравнить весь файл и все его файлы -
git difftool [email protected]{n} -- path/to/file
для сравнения одного файла
-