Я спрятал свои изменения. Теперь я хочу распаковать только некоторые файлы из тайника. Как я могу это сделать?
Я спрятал свои изменения. Теперь я хочу распаковать только некоторые файлы из тайника. Как я могу это сделать?
Ответы:
Как упоминалось ниже и подробно описано в разделе « Как извлечь отдельный файл (или изменения в файл) из git stash? », Вы можете применить команду use git checkout
или git show
для восстановления определенного файла.
git checkout stash@{0} -- <filename>
Это перезаписывает filename
: убедитесь, что у вас не было локальных изменений, или вы можете вместо этого объединить сохраненный файл .
(Как заметил по Jaime М. , для определенной оболочки , как Tcsh , где вам нужно , чтобы избежать специальных символов, синтаксис будет: git checkout 'stash@{0}' -- <filename>
)
или сохранить его под другим именем файла:
git show stash@{0}:<full filename> > <newfile>
(обратите внимание, что здесь
<full filename>
указан полный путь к файлу относительно верхнего каталога проекта (думаю: относительноstash@{0}
)).
Юсер предлагает в комментариях :
Если вы хотите выбрать вручную, какие изменения вы хотите применить из этого файла:
git difftool stash@{0}..HEAD -- <filename>
Вивек добавляет в комментариях :
Похоже, что "
git checkout stash@{0} -- <filename>
" восстанавливает версию файла на момент выполнения тайника - он НЕ применяет (только) сохраненные изменения для этого файла.
Чтобы сделать последнее:
git diff stash@{0}^1 stash@{0} -- <filename> | git apply
(как заметил по peterflynn , что вам может понадобиться | git apply -p1
в некоторых случаях, удаление одного ( p1
) , ведущий слэш от традиционных путей дифф)
Как прокомментировал: "unstash" ( git stash pop
), то:
git add
)git stash --keep-index
Последний пункт - это то, что позволяет вам сохранять некоторые файлы, в то же время сохраняя другие.
Это показано в разделе « Как сохранить только один файл из нескольких файлов, которые были изменены ».
git stash pop
из-за конфликтов файлов. В этом случае ответ Баламуругана А помог мне.
unstash
означает pop
, как мне кажется, в большинстве случаев, вероятно, это лишь частично отвечает на вопрос. Как вы тогда удаляете выборочно примененные части из тайника, чтобы избежать последующих конфликтов и / или путаницы при появлении оставшихся изменений?
git checkout stash@{N} <File(s)/Folder(s) path>
Например. Чтобы восстановить только файл ./test.c и папку ./include из последнего спрятанного файла,
git checkout stash@{0} ./test.c ./include
-a
флаг при создании тайника.
Я думаю, что ответ VonC, вероятно, то, что вы хотите, но вот способ сделать выборочное «git apply»:
git show stash@{0}:MyFile.txt > MyFile.txt
checkout
ни о чем.
git show stash@`{0`}:Path/To/MyFile.txt |sc Path/To/MyFile.txt
- галочки необходимы для PS, чтобы не интерпретировать фигурные скобки специально, и sc
это необходимо, потому что >
оператор PS по умолчанию использует UTF-16 (фактически UCS-2), что, вероятно, не то, что вам нужно. Ответ @Balamurugan A не страдает от этих проблем.
Первый список всех тайников
git stash list
↓
stash@{0}: WIP on Produktkonfigurator: 132c06a5 Cursor bei glyphicon plus und close zu zeigende Hand ändern
stash@{1}: WIP on Produktkonfigurator: 132c06a5 Cursor bei glyphicon plus und close zu zeigende Hand ändern
stash@{2}: WIP on master: 7e450c81 Merge branch 'Offlineseite'
Затем покажите, какие файлы находятся в тайнике (давайте выберем тайник 1):
git stash show 1 --name-only
//Hint: you can also write
//git stash show stash@{1} --name-only
↓
ajax/product.php
ajax/productPrice.php
errors/Company/js/offlineMain.phtml
errors/Company/mage.php
errors/Company/page.phtml
js/konfigurator/konfigurator.js
Затем примените файл, который вам нравится:
git checkout stash@{1} -- <filename>
или вся папка:
git checkout stash@{1} /errors
Это также работает без, --
но рекомендуется использовать их. Смотрите этот пост.
Также принято распознавать двойной дефис как сигнал, чтобы прекратить интерпретацию опций и рассматривать все последующие аргументы буквально.
git stash pop
вызвала ошибку для неотслеживаемых файлов. благодарю вас.
Если вы git stash pop
(без конфликтов) он удалит тайник после его применения. Но если вы git stash apply
это примените патч, не удаляя его из списка тайников. Тогда вы можете отменить нежелательные изменения с помощьюgit checkout -- files...
git stash pop
и есть конфликты, вам придется их исправить вручную, и тайник НЕ будет удален.
Еще один способ:
git diff stash@{N}^! -- path/to/file1 path/to/file2 | git apply -R
checkout
или show
будет слепо перезаписывать ваш файл, а не просто вносить изменения. «Еще один путь» - это преуменьшение.
path/to/file2
как вы хотите, чтобы сравнить с тем же файлом в вашей рабочей области. Выход из второго пути работает нормально для меня. - И я получаю сообщение об ошибке, используя -R
опцию («применить патч в обратном порядке», пытаясь исправить патч-версию ?!). Так выглядит моя рабочая версия git diff stash@{N}^! -- path/to/file | git apply -
.
...| git apply -3 -
Для пользователей Windows: фигурные скобки имеют особое значение в PowerShell. Вы можете окружить одинарными кавычками или убежать с помощью backtick. Например:
git checkout 'stash@{0}' YourFile
Без этого вы можете получить сообщение об ошибке:
Unknown switch 'e'