Является ли это возможным?
Да, это так!
git checkout -p stash@{0}
Где вы можете заменить 0
в stash@{0}
индексом тайника, который хотите применить.
Используйте git stash list
и git show -p stash@{n}
, если не уверены, какой n
тайник вы хотите применить.
Не забудьте git stash drop stash@{n}
, когда знаете, что этот тайник вам больше не понадобится, поскольку git checkout
, очевидно, не сбросит его за вас.
Почему это работает?
Ключ в том, чтобы понять, что тайники, по сути, являются ссылками в фиксирует точно так же, как теги и ветки.
В самом деле, они хранятся в .git/refs/stash
, по одной строке на хеш тайника.
Предостережения
Как упоминалось в комментариях @mgadda, git checkout -p
пытается применить всю разницу между фиксацией и текущей рабочей областью.
В случае git stash, если тайник, который вы пытаетесь применить, был создан для другого коммита, тогда git checkout -p stash@{n}
попытается интерактивно применить все различия между фиксацией stash@{n}
и фиксацией текущей рабочей области, включая все их родительские коммиты отличаются.
Например, если вы пытаетесь применить тайник, который был сохранен много коммитов назад, в текущую рабочую область, git checkout -p stash@{n}
попытается применить не только изменения в самом тайнике, но также попытается вернуться все изменения, которые произошли между фиксацией, на которой основан тайник, и текущей фиксацией.
И наоборот, если вы пытаетесь применить тайник из будущего, то есть в ветку, которая представляет собой количество коммитов, сделанных до фиксации, на которой основан тайник, тогда git checkout -p stash@{n}
попытается также применить все другие изменения, которые произошли между текущая фиксация и фиксация из будущего, помимо изменений из самого тайника.
(Если вам интересно, git checkout -p stash@{n}
тайник из параллельной ветки попытается отменить все изменения между текущей фиксацией и исходной точкой ветвления и также применить все изменения между точкой ветвления и другой ветвью , кроме сдачи в заначку).
Обходные пути
Есть несколько обходных путей, ни один из них не идеален для каждой ситуации:
-
- Be really careful with the patches you accept when you do
git checkout -p stash@{n}
-
- Do a
git stash pop
, then git stash
again before doing git checkout -p ...
. But if you wanted to do a partial apply of your stash to avoid conflicts, this won't really help. In that case, see solution 4 below.
-
- If you have a graphical diff tool supported by git (like meld), you can use
git difftool
and "apply left" only the changes you're interested in:
-
- (Based on @andrew's answer) On a detached head, go back to the "parent" commit of the stash you're interested in, apply the stash, re-stash interactively only the parts you're interested in, go back and reapply the smaller stash.
Шаг за шагом:
git checkout stash@{n}^ # notice the "^".
# Now you're in a detached head in the parent commit of the stash.
# It can be applied cleanly:
git stash apply stash@{n}
# Now save only the diffs you're interested in:
git stash -p
# remove the rest of the old stash
git checkout -- . # be careful or you could remove unrelated changes
# go back to the branch where you want to apply the smaller stash
git checkout <my previous branch>
# apply the smaller stash
git stash pop
person
LeoRochael
schedule
28.04.2017