Виновником является не команда git rm
. Его опция --cached
действительно работает, как вы говорите. Вы можете легко попробовать это в маленьком git-репо.
Хотя на странице руководства это не упоминается, git filter-branch
, похоже, не сохраняет вашу рабочую область. На самом деле команда отказывается запускаться, если ваша рабочая зона не чистая, что уже является показанием.
Но даже если файлы ушли из рабочей области, они не ушли из репо. Их больше нет в коммитах, доступных в вашей текущей ветке. Но хранилища веток фильтра - это ссылка на вашу ветку перед тем, как переписать ссылку на пространство имен refs / original /.
Используйте команду git show-ref
, чтобы увидеть ее.
Вы можете проверить старую версию для доступа к удаленным файлам. Вы можете использовать команду
git cat-file blob refs/original/refs/heads/master:foo
чтобы получить содержимое файла без извлечения (используйте ссылку, указанную в show-ref, foo - имя нужного файла). Есть много возможностей
Вы можете использовать gitk --all
для навигации как по вашей переписанной, так и по текущей ветке, и вы увидите, что на самом деле ничего не пропало.