TL; DR: вы столкнулись с ошибкой, исправленной в commit 833622a945a6, "stash push: избежать ошибок печати" , которая впервые появилась в Git 2.18.0.Если ваш Git по крайней мере 2.16.2, вы в порядке, в противном случае вы можете столкнуться с более серьезной ошибкой, исправленной в commit bba067d2faf0, "stash: не удаляйте неотслеживаемые файлы, которые соответствуют pathspec" но никогда не вызывается в примечаниях к выпуску.
Подкоманда push
, которая принимает pathspecs, впервые появилась в Git 2.13.0.Он был довольно сломан, если запускался из подкаталога, пока не был исправлен в 2.13.2 / 2.14.0.И до 2.16.2 он вел себя плохо: он мог запускать git clean
слишком много файлов.Так как git clean
удаляет неотслеживаемые файлы (необязательно включая их игнорируемое подмножество), а неотслеживаемые файлы не фиксируются (за исключением специального -u
/ -a
коммита), они могут быть просто ушел на данный момент.
Если вы в порядке - если ваш Git по крайней мере 2.16.2, что я думаю, - просто проигнорируйте жалобу;git stash pop
stash и повторите команду с исправленными аргументами, чтобы получить stash, названный так, как вы просили.Если нет, то файлы, ошибочно очищенные с помощью git clean
, вообще не могут быть восстановлены через Git (но я думаю, учитывая то, что я думаю, что вы запустили плюс сообщение об ошибке, что вы в порядке).
(я рекомендую избегатьхитрое использование git stash
в большинстве случаев - обычно лучше просто сделать временную фиксацию. Вы также избежите опрокидывания таких ошибок.)
Long
Во-первых, быстрая сторонапримечание: что git stash
делает, это делает (или использует) коммиты, в частности, два (обычный тайник) или три (stash -u
или stash -a
), которые находятся в no ветви.Эти два или три коммита содержат:
- состояние индекса;
- состояние рабочего дерева;
- любые неотслеживаемые файлы, если используются
-u
или -a
.
git stash push
и некоторые из его ошибок
git stash push -u -- File/Path/To/FolderOfFilesIWantCommited/* -m "My Message"
[которые затем не удалось выполнить]
Saved working directory and index state <msg>
fatal: pathspec '-m' did not match any files
error: unrecognized input
Это имеет смысл, потому что --
указывает на конец опций, после чего все строки берутся как path-names или pathspecs (обобщение имен путей, в которых такие вещи, как *
значит "все файлы").В этом случае вы дали Git следующие три пути:
File/Path/To/FolderOfFilesIWantCommited/*
-m
My Message
Этиконкретные файлы, которые Git должен сохранять в коммитах, которые он делает.Здесь есть несколько странных складок из-за того, что в общем случае любой коммит сохраняет каждый (отслеживаемый) файл.В основном мы можем игнорировать этот факт - хотя git stash save
сохраняет все отслеживаемые файлы в двух основных коммитах, спецификация пути указывает git stash
, какую версию сохранить в коммите рабочего дерева:следует ли сохранить версию work-tree или index версию?Если путь совпадает с отслеживаемым файлом, версия рабочего дерева - это сохраненная версия;в противном случае индексная версия - это сохраненная версия.(При фиксации индекса все содержимое индекса сохраняется таким же, каким оно было в момент запуска git stash
, используя, как обычно, git write-tree
.)
Это третий коммит, сделанный -u
или -a
где спецификация пути наиболее важна для вас здесь: она ограничивает коммит, содержащий только соответствующих неотслеживаемых файлов, а не все неотслеживаемые (и, возможно, игнорируемые, с -a
) файлами.Здесь также возникает неприятная ошибка: сохраняя содержимое файлов в коммитах, git stash
запускает, по сути, git reset --hard
и git clean
, чтобы вернуть индекс и состояния рабочего дерева обратно в исходное состояние.и удалите файлы, сохраненные в дополнительном коммите.
Я полагаю, что исправление, добавленное в 2.16.2, вызывает жалобу, исправленную в 2.18.0.Если это так, это означает, что ваш git stash push
не удалил слишком много файлов;вместо этого он очистил нужные файлы - те, которые были сохранены в третьем коммите - и затем пожаловался, потому что ваш путь доступа соответствовал только неотслеживаемым файлам и / или из-за дополнительных аргументов, которые соответствовали no файлам.
ВВ крайнем случае, если вы просто хотите получить файлы в третьем коммите "u" без использования git stash
, попробуйте запустить git show stash^^3 | git apply
(примечание: это git show stash
, сначала слово show
, а не git stash show
!).Третий коммит, который сделал git stash
, является третьим родителем refs/stash
, следовательно, stash^3
.В PowerShell я считаю, что это должно быть написано с удвоенной ^
.Вы можете запустить git show stash^^3
(с тем же удвоением), чтобы просмотреть его перед его применением.