Спрятал какой-то код, но не знаю, в какой кошелек он находится - как это выяснить?

Я написал значительный код для функции и спрятал изменения в git.

После этого я ввел несколько изменений в репозиторий и сделал git stash и применил несколько раз (более 100 раз).

Спустя почти 2 месяца я хочу получить изменения из git stash - но я не могу найти их ни на что.

Пробовал несколько git stash apply, git stash list, git stash list -p. Ничего не работает. Я не могу найти те старые спрятанные изменения.

Желаю, чтобы я сделал резервную копию вместо того, чтобы доверять git, чтобы скрыть их... sigh...

Может ли кто-нибудь помочь?

Ответ 1

Попробуйте следующее:

git stash list -p | grep 'diff --git' | grep <your file name>

Это найдет ваши файлы в списке. Это может занять некоторое время.

Одна вещь: git stash apply не отбрасывает тайник. После успешного применения вы должны git stash drop, чтобы он не загромождал ваш список. Лично я применяю stash, используя git stash pop.

Ответ 2

Если в git stash list имеется только несколько строчек, то вы можете проверить их по очереди, чтобы узнать, являются ли они правильными:

git show '[email protected]{0}'
git show '[email protected]{1}'

и др.

Если у вас есть код в строках много, и вы можете запомнить строку или ключевое слово, которое вы ввели в файл, который (почти) однозначно идентифицирует этот код (я использую DUNKIRK здесь), поиск он использует следующую команду bash.

for i in `git reflog --pretty=format:%H stash`; do git grep DUNKIRK $i; done

обратите внимание, что git grep выполняет поиск всего заказа, а не только изменения.

Сравните ответ от @siri, который ищет имена файлов, которые были изменены в stashes - это еще одна полезная стратегия.

Кроме того, для поиска только различий

 git reflog -p stash | less

а затем выполните поиск ваших строк или файлов или просто просмотрите его. Это может быть большим.

Ответ 3

Примечание: в случае скрепленного объединения commit, git stash list -p ничего не вернет.
Это изменится с помощью Git 2.2 (Q4 2014) и зафиксировать 288c67c Джефф Кинг (peff):

stash: список по умолчанию для рабочего дерева diff

Когда вы указываете stashes, вы можете предоставить произвольные опции git log для изменения отображения. Тем не менее, добавление просто "-p" ничего не делает, потому что каждый тайник на самом деле является фиксацией слияния.

Эта деталь реализации легко забыть, что приводит к запутанным пользователям, которые думают, что "-p" не работает. Мы можем сделать это проще, по умолчанию "--first-parent -m", что показать отличие от рабочего дерева.
Это полностью исключает индексную часть кошелька, но это просто и соответствует тому, что предоставляет <git stash show.

Люди, которые более чутко относятся к форме stash true, могут использовать "--cc", чтобы переопределить "-m", а "--first-parent" ничего не сделает.
Для diffs он влияет только на не комбинированные различия, поэтому "--cc" переопределяет его.
И для обхода мы все равно идем по линейному рефлогу, поэтому нам даже не все равно о родителях.

Ответ 4

Комбинация команд git из приведенных выше ответов помогла мне с тем, что мне нужно. Проводя мой ответ здесь, поскольку это может помочь другим, и потому, что я не могу принять какой-либо один ответ/комментарий

git stash list -p - showed me the list of stashes

git stash pop '[email protected]{12}' - popped out the 12th stash which contains my code.