Восстановить игнорируемый каталог из сброшенного тайника в Git - PullRequest
1 голос
/ 14 января 2012

Я потерял пропущенный (перечисленный в .gitignore) каталог, сохранив неотслеживаемые файлы и затем запустив pop.

У меня была куча изменений, объединенных в один коммит (большие участки кода перемещались в новые файлы, переупорядоченный код, однострочные изменения и т. Д.). Я хотел разделить их на несколько отдельных коммитов. Сначала я создал новую ветку и проверил ее, чтобы быть в безопасности. Я перешел на предыдущий коммит и использовал git add --patch, чтобы пройти через все изменения и выборочно проиндексировать те, которые я хотел включить в первый новый коммит. Я также хотел включить пару новых файлов, которые я создал, поэтому мне пришлось добавить их тоже. Как только мой индекс отразил изменения, которые я хотел получить для первого нового коммита, я использовал git stash save --keep-index --include-untracked, чтобы сохранить неиндексированные изменения и оставить только индексированные изменения в рабочем каталоге, чтобы я мог проверить их перед фиксацией. Как только я был доволен коммитом, я его фиксировал, выталкивал изменения из тайника и выборочно добавлял изменения для следующего нового коммита.

Теперь я несколько раз облажался. Во-первых, я забыл --include-untracked в тайнике, поэтому в моем рабочем каталоге все еще были новые файлы, которые я не хотел. Я сразу понял и попытался git stash pop, чтобы попытаться еще раз, но у меня возникли конфликты слияния. Я не был уверен, как правильно слить, что со всеми выборочно добавленными изменениями, поэтому я вернулся к мастеру, создал новую ветку и проверил ее, , надеясь, что все, что я облажался в первой новой ветке останется там (как я ошибался ...).

В следующий раз (после выборочного добавления снова, фу ...) я забыл добавить новые файлы, которые хотел включить в коммит, чтобы они были спрятаны. Я снова переключился обратно на мастер, сделал новую ветку и попробовал снова.

Я должен был сделать это по крайней мере 3 или 4 раза, прежде чем я "понял это правильно". Но когда я пошел тестировать свой код, он не смог найти один из входных файлов, которые я использовал. Файл находился в моем каталоге «ignore», который был указан в .gitignore. Когда я посмотрел, весь каталог отсутствовал . Я бросил туда множество вещей - файлы баз данных и т. Д. - я хотел сохранить их, но не отслеживать их изменения.

Итак, я посмотрел на свой git stash list. В нем перечислено около 5 тайников, 4 из которых я только что создал, как описано выше. Я понял, что они не остались в своих ветках. Затем я попытался найти свой каталог игнорирования в тайниках. Я пытался вытолкнуть каждый из них, но продолжал сталкиваться с конфликтами слияний, и я никогда не был уверен, как их разрешить - когда я думал, что у меня есть, тайник все еще существует в списке, но, кажется, частично применяется. В итоге я попытался выскочить, а затем сбросить каждый тайник в списке, всегда ожидая появления моего потерянного каталога. Это не так.

Я следовал инструкциям на Как восстановить удаленный тайник в Git? , чтобы посмотреть мою историю в gitk, но, похоже, не смог найти мой отсутствующий каталог; ни один из перечисленных коммитов не имеет его в древовидном или патч-представлении, что может иметь смысл, поскольку он - это , который должен игнорировать его. В частности, я посмотрел на те, которые помечены WIP, но не играли в кости.

Я также пытался проверить каждую сделанную мной ветку, но безрезультатно.

Как мне отследить это? Он нигде не находится (без тайника), потому что он никогда не отслеживался. Я предполагаю, что он был удален с помощью тайника, но, возможно, я ошибаюсь. Как найти сброшенные тайники и выбрать правильный - могу ли я искать по содержимому? Когда я нахожу его, как заставить его применить без конфликтов?

Попытка обновления

$ git reflog --all
25b96f2 refs/heads/recover0@{0}: commit: trash
fbf987b refs/heads/recover0@{1}: commit: trash
de24fd2 refs/heads/tmp2@{0}: branch: Created from de24fd
78f64c9 refs/heads/fix0dot1@{0}: commit: temp commit d
6aaa987 refs/heads/tmp0@{0}: branch: Created from 6aaa987
6cab748 refs/heads/exp6@{0}: commit: trash
7cab1c1 refs/heads/tmp4@{0}: branch: Created from 7cab1c
bc60313 refs/heads/tmpA0@{0}: branch: Created from bc6031
38389f3 refs/heads/a1a@{0}: branch: Created from master
f01ca25 refs/heads/tmp5@{0}: branch: Created from f01ca2
0d59a2d refs/heads/tmp6@{0}: branch: Created from 0d59a2
43a9dc8 refs/heads/tmp7@{0}: branch: Created from 43a9dc
e8dd137 refs/heads/exp5@{0}: branch: Created from master
207bfea refs/heads/exp3@{0}: commit (amend): temp commit c
996a20b refs/heads/exp3@{1}: commit (amend): temp commit c
a1713f8 refs/heads/exp@{0}: rebase -i (finish): refs/heads/exp onto 7d5e666
09d03de refs/heads/exp@{1}: branch: Created from master
7d5e666 refs/heads/exp4@{0}: reset: moving to HEAD^
149c949 refs/heads/exp4@{1}: commit (amend): temp commit a
b4d9cbc refs/heads/exp4@{2}: rebase -i (finish): refs/heads/exp4 onto 75f8808
e8dd137 refs/heads/exp4@{3}: branch: Created from master
ec8afef refs/heads/exp6@{1}: reset: moving to HEAD^
7d5e666 refs/heads/exp6@{2}: reset: moving to HEAD^
38389f3 refs/heads/exp6@{3}: branch: Created from master
7e66c30 refs/stash@{0}: WIP on master: 662f5b9 fix #6: Print time used
f2e045e refs/heads/tmp8@{0}: branch: Created from f2e045
b780d56 refs/heads/tmp3@{0}: branch: Created from b780d5

1 Ответ

2 голосов
/ 15 января 2012

git reflog --all должен включать сброшенные тайники.Вы можете увидеть его название (это что-то вроде stash@{N}), а затем использовать git show или reset или что-то еще, чтобы взглянуть.

Если вы не можете найти его из журнала, я не могуНе думаю, что вы можете восстановить его с помощью git.

Есть причина, по которой неотслеживаемые файлы называются так.Я бы порекомендовал вам удостовериться, что вы фиксируете любые файлы / каталоги, которые вас интересуютТаким образом, вы обычно можете восстановить их должным образом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...