Спрятал какой-то код, но не знаю, в какой кошелек он находится - как это выяснить?
Я написал значительный код для функции и спрятал изменения в 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.