Я спрятал свои изменения. Теперь я хочу распаковать только некоторые файлы из тайника. Как я могу это сделать?
Я спрятал свои изменения. Теперь я хочу распаковать только некоторые файлы из тайника. Как я могу это сделать?
Ответы:
Как упоминалось ниже и подробно описано в разделе « Как извлечь отдельный файл (или изменения в файл) из 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'