Я спрятал свои изменения. Теперь я хочу распаковать только некоторые файлы из тайника. Как я могу это сделать?
Как распаковать только определенные файлы?
Ответы (8)
Как упомянуто ниже и подробно описано в Как мне извлечь один файл (или изменения в файл) из git stash?, вы можете применить команду use _ 1_ или git show
, чтобы восстановить определенный файл.
git checkout stash@{0} -- <filename>
В Git 2.23+ (август 2019 г.) используйте git restore
, который заменяет confusing git checkout
command:
git restore -s stash@{0} -- <filename>
Это перезаписывает filename
: убедитесь, что у вас нет локальных изменений, или вы можете объединить спрятанный файл вместо.
(Как прокомментировано Jaime M., для определенной оболочки, такой как tcsh, где вам нужно экранировать специальные символы, синтаксис будет: git checkout 'stash@{0}' -- <filename>
)
или сохранить под другим именем:
git show stash@{0}:<full filename> > <newfile>
(обратите внимание, что здесь
<full filename>
- это полный путь к файлу относительно верхнего каталога проекта (подумайте: относительноstash@{0}
)).
yucer предлагает в комментариях:
Если вы хотите выбрать вручную, какие изменения вы хотите применить из этого файла:
git difftool stash@{0}..HEAD -- <filename>
Vivek добавляет в комментариях:
Похоже,
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
из-за конфликтов файлов. Ответ Баламуругана А помог мне в этом случае.
- person Andrey; 22.12.2014
| git apply
(объединить спрятанную копию с локальной копией) завершился неудачно с исправлением ошибки, неприменим. Но при использовании | patch -p1
слияние сработало отлично!
- person peterflynn; 04.01.2017
git checkout 'stash@{0}' -- <file-name>
- person Jaime M.; 04.09.2017
unstash
означает pop
, что, как мне кажется, вероятно, будет в большинстве случаев, это лишь частично отвечает на вопрос. Как вы затем удалите выборочно примененные части из тайника, чтобы избежать последующих конфликтов и / или путаницы при извлечении оставшихся изменений?
- person DylanYoung; 17.10.2017
stash pop --interactive
, хотя технически сложны для реализации, они гораздо менее привередливы для пользователя.
- person DylanYoung; 17.10.2017
stash -u
просто создает некоторую поддержку для работы. Просто любопытно, есть ли поддерживаемое решение (или если оно находится на временной шкале) и указывает на то, что данные решения не являются суперчистыми и требуют много накладных расходов со стороны пользователя, чтобы убедиться, что соответствующие изменения остаются там, где они ' должен и не перепутайся ..
- person DylanYoung; 17.10.2017
$ git checkout stash@{0} --filename ./myFile.java error: unknown option
filename ''
- person Janac Meena; 15.01.2019
--
" и именем файла должен быть пробел (как в ответе выше). См. stackoverflow.com/a/1192194/6309 для получения дополнительной информации об обозначении «--
».
- person VonC; 15.01.2019
git show stash@{0}:<full filename> > <newfile>
должна иметь возможность создать этот файл в рабочем дереве, даже если он существовал только в тайнике.
- person VonC; 15.01.2019
git checkout stash@{0} -- <filename>
.
- person VonC; 11.04.2019
git checkout stash@{N} <File(s)/Folder(s) path>
Например. Чтобы восстановить только файл ./test.c и папку ./include из последних сохраненных,
git checkout stash@{0} ./test.c ./include
-a
при создании тайника.
- person Rajeev Ranjan; 17.10.2017
Я думаю, что ответ VonC - это, вероятно, то, что вы хотите, но вот способ сделать выборочное «git apply»:
git show stash@{0}:MyFile.txt > MyFile.txt
checkout
.
- person Tom Russell; 26.10.2016
git show stash@`{0`}:Path/To/MyFile.txt |sc Path/To/MyFile.txt
- обратные кавычки необходимы для PS, чтобы не интерпретировать фигурные скобки специально, а sc
необходимо , поскольку оператор PS >
по умолчанию UTF-16 (на самом деле UCS-2), который, вероятно, не то, что вам нужно. Ответ @Balamurugan A не страдает от этих проблем.
- person Ian Kemp; 09.06.2017
Сначала перечислите все тайники
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
вызывало ошибку для неотслеживаемых файлов. Спасибо.
- person Ramin Firooz; 23.12.2018
Еще один способ:
git diff stash@{N}^! -- path/to/file1 path/to/file2 | git apply -R
checkout
или show
приведет к слепой перезаписи файла вместо простого применения изменений. Еще один способ - это мягко сказано.
- person cambunctious; 08.12.2019
path/to/file2
, поскольку вы хотите сравнить тот же файл в вашем рабочем пространстве. У меня нет второго пути. - И я получаю сообщение об ошибке, используя параметр -R
(применить патч в обратном порядке, пытаясь исправить спрятанную версию ?!). Так что моя рабочая версия выглядит как git diff stash@{N}^! -- path/to/file | git apply -
.
- person ThomasH; 15.01.2020
...| git apply -3 -
- person John Mee; 24.01.2020
diff stash@{N}^!
уже производит прямую разницу, поэтому не указывайте -R
- person kxr; 20.08.2020
git diff stash@{N} -- path/to/file | git apply -R
- person Alwyn Schoeman; 16.04.2021
Если вы git stash pop
(без конфликтов), он удалит тайник после его применения. Но если вы git stash apply
, он применит патч, не удаляя его из списка тайников. Затем вы можете отменить нежелательные изменения с помощью git checkout -- files...
git stash pop
и есть конфликты, вам придется исправить их вручную, и тайник НЕ будет удален.
- person theflowersoftime; 22.09.2016
Для пользователей Windows: фигурные скобки имеют особое значение в PowerShell. Вы можете заключить в одинарные кавычки или экранировать обратную кавычку. Например:
git checkout 'stash@{0}' YourFile
Без него вы можете получить ошибку:
Unknown switch 'e'
Например
git stash show --name-only
результат
ofbiz_src/.project
ofbiz_src/applications/baseaccounting/entitydef/entitymodel_view.xml
ofbiz_src/applications/baselogistics/webapp/baselogistics/delivery/purchaseDeliveryDetail.ftl
ofbiz_src/applications/baselogistics/webapp/baselogistics/transfer/listTransfers.ftl
ofbiz_src/applications/component-load.xml
ofbiz_src/applications/search/config/elasticSearch.properties
ofbiz_src/framework/entity/lib/jdbc/mysql-connector-java-5.1.46.jar
ofbiz_src/framework/entity/lib/jdbc/postgresql-9.3-1101.jdbc4.jar
Затем вставьте тайник в конкретный файл
git checkout stash@{0} -- ofbiz_src/applications/baselogistics/webapp/baselogistics/delivery/purchaseDeliveryDetail.ftl
другие связанные команды
git stash list --stat
get stash show
git show stash@{0} -- <filename> | git apply --check
, но он продолжает говоритьfatal: unrecognized input
- person joeytwiddle   schedule 23.05.2016git checkout stash@{0} -- <filename>
- person roottraveller   schedule 25.06.2020