Кажется, что сложная часть этого вопроса вращается вокруг того, как вы хотите, чтобы тайник выглядел, когда вы закончите. Поскольку git stash {pop|apply}
влияет только на рабочее дерево (а иногда и на индекс), достаточно просто выборочно брать изменения из тайника (достаточно, чтобы я сначала подумал, что вы слишком много думаете о проблеме):
git stash pop
# maybe a 'git reset head' if the index was changed
git checkout -- file.with.unwanted.changes.in.stash
Но эти команды полностью удаляют тайник; и, напротив, если бы я сказал git stash apply
вместо pop
, тайник останется без изменений. Похоже, вы хотите, чтобы тайник оставался с выбранными вами изменениями (на случай, если вам понадобится применить их снова).
(Я полагаю, что могут быть случаи, когда вы захотите прямо противоположного — оставить в тайнике те изменения, которые вы не применили, чтобы их можно было применить позже.)
Итак, делаем шаг назад: что связано с модификацией тайника?
На самом деле тайник состоит из двух или трех временных коммитов. Специальная ссылка stash
указывает на эти коммиты, а "стек" из нескольких тайников поддерживается с помощью reflog (что может быть чем-то вроде хака, но в целом эффективно).
Таким образом, чтобы изменить тайник, нужно создать новые коммиты (поскольку коммиты неизменяемы) и соответствующим образом изменить порядок stash
ref и reflog.
Вот почему обозначения, которые упоминает LeGEC, будут работать и могут дать вам дополнительную гибкость при чтении тайника. Но поскольку использование reflog не такое же, как для ссылок без тайника, использование этого факта для изобретения способа записи в тайник может привести к неожиданным результатам. Я не говорю, что результаты будут ужасными или их невозможно предсказать/контролировать; но я думаю, что в конце концов вы создадите больше сложности, чем избежите.
Итак, если мы ограничимся фактическими задокументированными git-stash
подкомандами, то тайник будет более или менее атомарным. Когда вы создаете тайник, есть режим patch
, который позволяет вам выбирать рабочие изменения для помещения в стек, но мне не известно о соответствующей функциональности для всплывающего/применения. Тем не менее, это что-то:
Если у вас есть чистое рабочее дерево и тайник, который вы хотите разделить, вы можете попробовать такие вещи, как:
Применить некоторые изменения и сохранить те же самые изменения в тайнике
git stash pop
git stash -p
# select the "good" changes
git checkout -- .
git stash apply
Применить некоторые изменения, а остальные оставить в тайнике
git stash pop
git stash -p
# select the "unwanted" changes
Разделите тайник на две части, решите, что с ними делать позже
git stash pop
git stash -p
# select the "good" changes
git stash
# now the "good" changes are stash@{1} and the "unwanted" are stash@{0}
person
Mark Adelsberger
schedule
03.05.2017