Как отменить "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
, К сожалению, они не будут в каком-либо определенном порядке или не будут иметь своего исходного имени файла, но любой потерянный блоб должен быть где-то там.