После фильтрации мастера, как мне получить спрятанные изменения на старом мастере? - PullRequest
2 голосов
/ 30 января 2011

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

Мой первый вызов git filter-branchСбой команды:

Невозможно переписать ветвь (и) с грязным рабочим каталогом.

, потому что у меня были локальные изменения.Итак, я спрятал эти изменения с помощью git stash и повторно запустил команду filter-branch.

Затем я выполнил эти команды в соответствии с инструкциями GitHub:

rm -rf .git/refs/original
git reflog expire --expire=now --all
git gc --prune=now
git gc --aggressive --prune=now

Удалениедвоичные файлы, кажется, работали безупречно.Однако, когда я сейчас набираю git stash list, добавленная мной запись о старом мастере не отображается.

Все, что у меня есть, это вывод из git stash до того, как я выполнил команду filter-branch theвторой раз:

Saved working directory and index state WIP on master: a19db18 LOG_MESSAGE
HEAD is now at a19db18 LOG_MESSAGE

Кроме того, a19db18332b19ea41be888eccfc07e6680d8d6dd был одним из переписанных коммитов.

Есть ли способ получить спрятанные изменения?

1 Ответ

1 голос
/ 30 января 2011

Если вы не помните хэш SHA1 объектов фиксации тайника (да, тайники создают объекты фиксации), тайник может быть потерян. Один из вариантов - использовать git fsck --lost-found и искать оборванные коммиты. Затем вам придется проходить один за другим, пока не найдете тот, который является вашим тайником. Вы можете использовать gitk, чтобы просмотреть все эти коммиты (см. Страницу справки git fsck для примера того, как это сделать) и, надеюсь, найти коммиты проще. Как только вы нашли коммиты, вы можете использовать git cherry-pick для каждого, убрать любые конфликты и затем сделать git reset HEAD~2 (так как есть два коммита с каждым тайником). Тогда тебе надо идти.

Я никогда не делал тайник, а потом что-то столь же опасное, как ответвление фильтра. В будущем я бы порекомендовал сделать реальный коммит с вашей незавершенной работой - возможно, поместив его в новую ветку. Затем запустите опасную операцию. После этого вы можете откатить коммит со смешанным сбросом, как указано выше.

...