Как отменить "git add", сохранив предыдущую версию? (Индекс имеет историю?)

У меня есть вопрос, который похож на Как отменить 'git add' перед коммитом?, но с важным отличием:

фон:

Я запускаю некоторый код, который генерирует файлы, которые я добавлю в свой репозиторий после завершения. Код, который генерирует файлы, - это новый код, и он постоянно меняется, поэтому я иногда запускаю его несколько раз с изменениями.

Попутно я добавляю сгенерированные файлы в индекс, чтобы они были готовы к одному большому коммиту в конце. Это также позволяет мне проверить, вносят ли мои изменения в код изменения в вывод, и если да, то каковы эти изменения. Но... Я случайно запустил еще один git add для файла, который появился в Changes to be committed раздел (как new file) и Changes not staged for commit раздел (как modified). Я хотел запустить на нем git diff, но я поскользнулся и снова добавил его, так что теперь у меня нет способа его разнести (что я знаю), так что...

вопрос:

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

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

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

1 ответ

Решение

Прямого пути к последней стадии файла нет. Там нет версии файла индекса, это то, для чего вы должны использовать commit. В будущем вы можете чаще делать временные коммиты (например, с commit --amend) и тогда по крайней мере ваши предыдущие версии будут в вашем журнале (например, git log -g).

Однако все поэтапные версии всех файлов будут добавлены в базу данных объектов git. Вы должны быть в состоянии найти их с git fsck --lost-found, Это запишет все "висячие" капли в .git/lost-found/other, К сожалению, они не будут в каком-либо определенном порядке или не будут иметь своего исходного имени файла, но любой потерянный блоб должен быть где-то там.

Другие вопросы по тегам