Git восстановить удаленный файл

Обновлено: 21.11.2024

Git ведет журнал всех изменений, внесенных в файлы в репозитории. Вы можете восстановить файл, удаленный после предыдущей фиксации, с помощью команды git checkout. Эта команда позволяет вам перейти к предыдущей точке в истории вашего репозитория.

В этом руководстве рассказывается, как восстановить удаленный файл в репозитории Git с помощью команды git checkout. Мы также обсудим, как использовать команду git rev-list для определения времени последнего изменения файла в репозитории.

Git: восстановить удаленный файл

Мы работаем над репозиторием под названием ck-git. В нашем репозитории когда-то хранился файл с именем config.py, который мы теперь хотим получить. Этот файл содержал некоторые стандартные настройки конфигурации для нашего проекта.

Мы можем использовать команду ls, чтобы убедиться, что файл не существует:

Эта команда возвращает:

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

Поскольку мы знаем, в какой фиксации был наш файл, мы можем использовать команду git checkout для извлечения файла:

HEAD относится к текущей версии репозитория, который мы просматриваем. В данном случае мы просматриваем ветку master. Это потому, что мы не перешли ни к какой другой ветке. ~1 сообщает Git, что нужно отойти на одну фиксацию от нашего текущего HEAD.

81 % участников заявили, что стали более уверенными в своих перспективах работы в сфере технологий после посещения учебного курса. Примите участие в тренировочном лагере сегодня.

Найдите подходящий вариант для буткемпа

В среднем выпускник буткемпа тратит менее шести месяцев на смену карьеры, начиная с буткемпа и заканчивая поиском своей первой работы.

Начните сменить профессию сегодня

config.py — это имя файла, который мы хотим получить.

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

Если вы не укажете файл для извлечения, Git переведет ваш репозиторий в состояние «отсоединен HEAD». В этом состоянии вы можете перемещаться по хранилищу в указанный вами момент истории.

Давайте посмотрим на файлы в нашем проекте с помощью команды ls:

Команда git checkout успешно получила файл config.py. Теперь мы можем зафиксировать этот файл в нашем репозитории, чтобы не потерять его:

Сначала мы добавляем config.py в тестовую область. Это потому, что это новый файл в нашем репозитории. Затем мы добавляем файл в фиксацию и отправляем эту фиксацию в удаленную версию нашего репозитория.

Найти последнюю фиксацию в файле

Вы можете использовать команду git rev-list (список ревизий), чтобы найти контрольную сумму последней фиксации, затронувшей файл. Используя эту информацию и команду git checkout, вы можете получить файл из фиксации, не зная, когда файл был изменен в последний раз.

  • Care Karma подберет для вас лучшие учебные курсы по технологиям
  • Получайте эксклюзивные стипендии и подготовительные курсы

Мы хотим восстановить файл с именем route.py из нашего репозитория. Мы знаем, что он существовал в какой-то момент в истории нашего проекта, но мы не уверены, когда последний раз изменяли файл.

Чтобы найти фиксацию, в которой мы в последний раз изменяли файл route.py, используйте команду git rev-list:

Мы использовали команду rev-list с несколькими параметрами. Эта команда указывает Git перечислить все коммиты, доступные из нашего HEAD, которые изменили файл «routes.py». Параметр -n 1 указывает Git ограничить результат команды одной записью.

Давайте посмотрим, что произойдет, когда мы запустим эту команду:

Мы можем увидеть контрольную сумму для последней фиксации, в которой был изменен наш файл route.py. Мы можем использовать эту информацию с командой checkout для извлечения нашего удаленного файла:

Эта команда извлекает route.py из коммита перед его удалением. Мы добавили ^ в конец команды, чтобы получить фиксацию перед той, которую мы указываем. Это связано с тем, что последняя фиксация, изменяющая файл, — это та, в которой файл был удален.

Когда мы запускаем эту команду, сообщения об ошибках не возвращаются. Это означает, что наш файл был успешно получен. Давайте запустим команду ls, чтобы убедиться, что наш файл был добавлен в наш репозиторий:

Наш файл route.py находится в нашем локальном рабочем каталоге.

Заключение

Вы можете восстановить удаленный файл из репозитория Git с помощью команды git checkout. Если вы не знаете, когда файл был удален в последний раз, вы можете использовать git rev-list, чтобы найти контрольную сумму коммита, в котором этот файл был удален. Затем вы можете проверить этот коммит.

Теперь у вас есть знания, необходимые для профессионального восстановления удаленного файла в Git!

Пока вы зафиксировали свою работу в Git, фактическая потеря файла должна быть довольно редкой. За исключением удаления всего каталога репозитория (и отсутствия удаленного доступа), несколько операций приведут к состоянию, в котором вы не сможете вернуть файл.

Давайте рассмотрим несколько способов восстановления удаленного файла в зависимости от того, насколько вы были уверены в том, что действительно хотите удалить файл!

Я удалил файл, но не зафиксировал

Значит, вы удалили файл и сразу поняли, что это ошибка? Это легко, просто сделайте:

Это будет работать независимо от того, было ли удаление поэтапным или нет.

Я удалил файл и зафиксировал удаление

Вы сделали фиксацию, удалив файл, но потом поняли, что хотите сохранить этот файл? Выполните сброс, чтобы вернуться к состоянию перед фиксацией (будьте осторожны: опция «--hard» означает, что команда отменит изменения в отслеживаемых файлах после указанной фиксации — вы также можете не указывать эту опцию, и в этом случае удаление файла будет отображаться как неустановленное изменение вместе с любыми другими изменениями, внесенными вами в ваше рабочее дерево. Затем файл можно будет восстановить, как и в предыдущем сценарии):

(Примечание: это предполагает, что вы еще не отправили свою фиксацию на удаленный компьютер — если вы это сделали, см. «Я удалил файл, зафиксировал и отправил» ниже.)

Я зафиксировал удаление, а затем сделал еще несколько коммитов

Если вы удалили файл, совершили коммит, затем продолжили работу и сделали больше коммитов только для того, чтобы обнаружить, что удаление файла было ошибкой, Git все равно поможет вам! Чтобы найти правильный коммит, сначала проверьте историю удаленного файла:

Вы можете работать либо с последней фиксацией, в которой все еще был файл, либо с фиксацией, которая удалила файл. В первом случае просто извлеките файл из этой фиксации:

Во втором случае извлеките файл из одной фиксации до этого:

Я удалил файл, зафиксировал и отправил

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

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

Восстановление удаленных файлов в Tower

Если вы используете клиент Tower Git, вы обнаружите, что описанные выше операции удобно доступны в графическом интерфейсе. Более того, в таких случаях, как удаление файла, а затем желание отменить его, потрясающая функция отмены Tower позволяет вам вернуть файл, просто нажав CMD-Z!

Подробнее

  • Познакомьтесь с главой «Отмена действий» в нашей бесплатной онлайн-книге.
  • Часто задаваемые вопросы о Git и управлении версиями
  • Подробнее об устранении ошибок с помощью CMD+Z в Tower 4 читайте в нашем блоге.

Получите нашу популярную памятку по Git бесплатно!

Самые важные команды вы найдете на лицевой стороне, а полезные советы — на обратной. Более 100 000 разработчиков скачали его, чтобы сделать Git немного проще.

О нас

Как создатели Tower, лучшего клиента Git для Mac и Windows, мы помогаем более чем 100 000 пользователей в таких компаниях, как Apple, Google, Amazon, Twitter и Ebay, получить максимальную отдачу от Git.

Как и в случае с Tower, наша миссия с этой платформой – помочь людям стать лучшими профессионалами.

Вот почему мы бесплатно предоставляем наши руководства, видеоролики и памятки (об управлении версиями в Git и многих других темах).

© Tower, 2010-2022. Упомянутые названия продуктов и логотипы являются собственностью соответствующих владельцев.

Как бы долго вы ни отправляли свою работу в Git, на самом деле потеря документа должна быть очень редкой. Застенчиво стирая весь каталог хранилища (и не имея пульта), едва ли какие-либо действия приведут к состоянию, когда вы не сможете вернуть документ. Git восстановить удаленный файл не так сложно, но можно сказать, что это немного сложно. Мы должны взглянуть на несколько способов восстановления удаленных файлов Git, в зависимости от того, насколько вы были убеждены в то время, что вам действительно нужно стереть документ! Мы увидим, как Tenorshare 4DDiG поможет Git очень плавно добавлять удаленные файлы. Программное обеспечение является продвинутым и хорошо совместимо с Git для извлечения удаленных файлов. Функции этого инструмента восстановления созданы с учетом конфиденциальности данных. Давайте сразу перейдем к теме и объясним, как легко с помощью Git восстановить удаленные файлы.

Часть 1. Что такое Git?

Git — это всего лишь хранилище для записей кода, присутствующее в каждой среде веб-разработчика. Он работает как средство отслеживания содержимого для кода с «структурой управления воспроизведением». Эта система контроля версий позволяет разработчикам вносить изменения в код и отмечать эти изменения в процессе проектирования.

В настоящее время критической частью Git является то, что поблизости есть хранилище, а вдали — склад. Репозиторий соседства находится в каждой среде дизайнера (как указано выше). Удаленный репозиторий поддерживается на основном сервере, который позволяет создавать дубликаты документов ПК каждого разработчика. Невероятно, правда?

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

Различные ситуации можно рассматривать как восстановление файла Git. У нас есть пункт за пунктом 4 из этих случаев и 4 ответа на восстановление утерянных документов из вашего соседнего хранилища на Git.

Часть 2: 4 случая восстановления удаленных файлов с помощью Git

Вы только что удалили свой код или ошибочный файл в Git? Не проблема, если вы уже читаете эту статью. Вы наверняка сможете восстановить свои файлы с помощью этого полезного руководства. Помимо изучения кода в течение длительного времени и изучения оценок в течение длительного времени, одна вещь, которую инженеры презирают, — это потеря исходного кода. Как разработчик, вы, скорее всего, стерли свой код по ошибке в тот или иной момент. Можно восстановить удаленные файлы Git. В очень простых и легко описанных шагах мы узнаем, как невозможно пропустить ошибки записи и как их исправить в Git. Пока мы заняты, вы поймете, что такое Git, что делает его необычным и почему он нужен вам как разработчику. Мы должны идти, хорошо?

Случай 1: я удалил файл, но не зафиксировал его

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

Случай 2: я удалил файл и зафиксировал удаление

Когда вы удалили данные или файл, вы также зафиксировали удаление. Позже вы узнали, что вам нужен файл. Чтобы получить файл отмены удаления Git, вам нужно выполнить сброс. Действие сброса восстановит данные до состояния, предшествующего фиксации. Однако у этого действия есть недостаток. Он может удалить другие изменения, внесенные в файл после фиксации. После запуска команды отменить эту операцию невозможно.

Случай 3. Я зафиксировал удаление, а затем сделал еще несколько коммитов

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

Когда приходят результаты, у вас есть 2 варианта восстановить свою запись.

<р>1. Вы можете решить работать с отправкой, в которой действительно есть документ. Вам нужно посмотреть документ из этой фиксации, как показано ниже.

<р>2. Вы также можете работать с отправкой, которая стерла документ. Вам нужно просмотреть документ из одного коммита до этого, как показано ниже.

Случай 4: я удалил файл, зафиксировал и отправил его

На случай, если вы эффективно протолкнули свою фиксацию или сосредоточились на удаленном.Сброс и повторное нажатие вызовут проблемы, так как исторический фон ближайшего магазина в основном был пересмотрен. В этой ситуации, скорее всего, лучше записать новую отправку, в которой будут исправления, созданные тем, кто стирает документ. Для этого запустите:

Часть 3. Восстановление удаленных файлов в репозитории Git с помощью 4DDiG

Как эффективно и легко восстановить ранее удаленный файл из репозитория Git? Можно ли восстановить удаленные файлы с компьютера? Комплексное, быстрое и бесплатное администрирование для этого — Tenorshare 4DDiG Data Recovery. С помощью этого инструмента восстановления вы восстановите удаленные файлы Git потерянные и удаленные файлы всего за 3 шага.

Почему не работает git checkout . сбросить рабочее пространство на HEAD ?

24 ответа 24

Вывод говорит вам, что вам нужно сделать. git reset HEAD cc.properties и т. д.

Это удалит операцию rm. После этого повторный запуск git status сообщит вам, что вам нужно выполнить git checkout -- cc.properties, чтобы вернуть файл.

Обновление: у меня есть это в моем файле конфигурации

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

Как это сделать для нескольких удаленных файлов? Запуск git reset HEAD > несколько раз был бы громоздким, есть ли эффективный способ сделать это?

@zyy -- указывает на файлы. например Если у вас есть ветка с именем foo . git co foo выполнит проверку в ветке. Однако git co -- foo извлечет файл с именем foo .

Вы инсценировали удаление, поэтому вам нужно сделать следующее:

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

Просто введите git checkout path/to/file-I-want-to-ring-back.txt

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

Чтобы восстановить все неустановленные удаления сразу, автоматически, без указания каждого отдельного пути:

Чтобы восстановить все поэтапные удаления одновременно, автоматически, без указания каждого отдельного пути:

Я случайно удалил более 500 файлов, и это сработало, потому что я также сохранил все мои действительные изменения (первая строка — это то, что я использовал). Спасибо.

Случайно удалил все содержимое репозитория сразу после успешной сборки. Первая команда спасла меня.

Прежде чем это сработало для меня, мне пришлось запустить git status --long | grep 'удалено:' | awk '' | xargs git reset HEAD -- .

Очень полезно, хотел сохранить неотслеживаемые файлы, но избавиться от удаленных и измененных, просто изменил -d на -m для обработки измененных.

Обратите внимание, что это не работает, если в именах файлов/путях есть пробелы. Я думаю, что git ls-files -d | sed -e "s/\(.*\)/'\1'/" | xargs git checkout -- будет работать.

Поскольку вы выполняете проверку git . , похоже, вы пытаетесь восстановить ветку до последнего состояния фиксации.

Этого можно добиться с помощью git reset HEAD --hard

Это может привести к удалению всех ваших последних изменений и снятию их с этапа, например, вы можете потерять работу. Это может быть тем, что вы хотите, но проверьте документацию, чтобы убедиться.

Вау!! Осторожнее с этим. Возможно, вы правы, но кто-то может запутаться и взорвать весь свой код. Было бы здорово, если бы вы добавили более крупное предупреждение.

Это именно то, что мне было нужно. Не разрушает весь ваш код — просто возвращает вас к последнему коммиту.

В какой-то момент я обнаружил сотни отсутствующих файлов. Это единственный практический способ решить проблему. Спасибо!

чтобы удалить файл, затем

не работает, так что в таком случае

Мне нравится этот ответ. Нет никаких сомнений в том, что вы затрагиваете только конкретный файл, который вы удалили. 1) git checkout путь/к/имя файла 2) git checkout -- путь/к/имя файла

Если вы не зафиксировали файл, может быть достаточно git checkout HEAD path/to/filename. Так что оформляйте заказ с последнего, а не с предыдущего коммита.

Вот команда, которая помогла мне на моем Mac. Я попробовал несколько других решений, но они мне не подошли.

Git-версия для OSX Mavericks

Команда

Вот несколько случаев, которые помогут другим:

Если удаление не было зафиксировано, приведенная ниже команда восстановит удаленный файл в рабочем дереве.

Вы можете получить список всех удаленных файлов в рабочем дереве с помощью приведенной ниже команды.

Если удаление было зафиксировано, найдите фиксацию, в которой это произошло, а затем восстановите файл из этой фиксации.

Это должно дать вам что-то вроде c46e81aa403ecb8a0f7a323a358068345 , теперь используйте этот хэш фиксации с родительским оператором ( ^ ) следующим образом:

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

Если вы хотите просто отобразить список файлов:

Если вы хотите восстановить все файлы сразу

Не забудьте использовать точку, потому что она указывает git захватить все файлы.

Эта команда сбросит заголовок и удалит все изменения:

Затем запустите это, чтобы восстановить все файлы:

Затем выполнив статус git, вы получите:

Это самое простое решение, которое работает для большого количества файлов (допустим, вы удалили несколько файлов/папок). молодец, чувак+

Используйте git ls-files для извлечения удаленных (-d) или измененных (-m) файлов.

Вы можете это увидеть?

это относится к случаям, когда вы использовали

прежде чем что-то совершить.

Вы также можете избавиться от созданных файлов, которые еще не были созданы. И вы их не хотите. С:

Вы не предоставили полностью скопированный ответ. На самом деле git checkout -- . не помогает восстанавливать удаленные файлы и эквивалентно тому, что пробовал аскер: git checkout. . Часть, которая может работать, это та часть, которую вы не копировали: git checkout .

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

Это хорошее решение, потому что вы можете удалить его из тайника. Хак это или нет, дело вкуса. Вся идея тайника — умный хак.

Нашел этот пост, когда искал ответы о том, как отменить удаление файла, который был удален в моем рабочем каталоге после слияния с другой веткой. После слияния еще не было совершено никаких коммитов. Поскольку это было слияние, я не мог просто добавить его обратно, используя:

Мне пришлось сделать еще один шаг в дополнение к сбросу, чтобы вернуть файл:

если вы ищете удаленный каталог.

Более новый git (мой 2.27.0) более удобен, а фактические команды отображаются во время «состояния git». Например, если вы удалили файл tf.c, то

Вы бы использовали "git restore tf.c", чтобы вернуть его, так как он saz. Нет больше поиска!

Например, git checkout 5a6b3179e58edff9c90326b9a04284b02fd67bd0 "src-ui/views/includes/radar.pug"

(выполняется в ветке, в которую мы хотим, чтобы файл попал)

После выполнения этой команды восстановленный файл будет находиться в исходном местоположении (которое нужно будет закоммитить)

и/или просто главный путь git checkout/to/the/file.bin, чтобы вы просто восстановили этот файл, не теряя никаких других изменений, которые вы могли сделать. PS: это должен быть принятый ответ.

1. Найдите тот конкретный коммит, к которому вы хотите вернуться, используя:

2.Вернитесь к этому коммиту, используя :

Теперь в вашей локальной ветке будут все файлы в частности

Если вы установили ToroiseGIT, просто выберите пункт меню "Восстановить" для всплывающего меню родительской папки.

ВНИМАНИЕ: сначала зафиксируйте любую работу, которую хотите сохранить.

Вы можете сбросить настройки рабочего пространства (и восстановить удаленные файлы)

@JeanPaul, возможно, я неправильно понимаю, но мое рабочее пространство вернулось в исходное состояние (теперь присутствует удаленный файл).

@Marc Это может сработать, но только если в каталоге нет видимого файла, потому что в противном случае ./* будет расширен bash для соответствия этим файлам перед отправкой в ​​git.

Для меня это был самый простой способ:

Еще один способ, который также сработал для меня:

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

Проделал это для всех файлов, и они вернулись.

Вы также можете включить несколько файлов, разделенных пробелом.

Легкое исправление, кстати, это не изменит/удалит новые файлы.

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

У меня была та же проблема, и ни один из ответов здесь, которые я пробовал, не помог мне. Я использую Intellij, и я проверил новую ветку git checkout -b minimalExample, чтобы создать «минимальный пример» в новой ветке какой-то проблемы, удалив кучу файлов и изменив кучу других в проекте. К сожалению, несмотря на то, что я не зафиксировал никаких изменений в новой ветке «минимальный пример», когда я снова проверил свою «исходную» ветку, все изменения и удаления из ветки «минимальный пример» произошли в « original" тоже ветка (или так она появилась). Согласно статусу git, удаленные файлы только что исчезли из обеих веток.

К счастью, несмотря на то, что Intellij предупредил меня, что «удаление этих файлов может быть не полностью восстановлено», я смог восстановить их (на минимальной ветке примера, из которой они были фактически удалены), щелкнув проект правой кнопкой мыши и выбрав «Местная история»> «Показать историю» (а затем «Восстановить» для самого последнего элемента истории, который я хотел). После того, как Intellij восстановил файлы в ветке «минимальный пример», я переместил ветку в источник. Затем я переключился обратно на свою «исходную» локальную ветку и запустил git pull origin minimalExample, чтобы вернуть их и в «исходную» ветку.

Очень активный вопрос. Заработайте 10 репутации (не считая бонуса ассоциации), чтобы ответить на этот вопрос. Требование к репутации помогает защитить этот вопрос от спама и отсутствия ответа.

Не тот ответ, который вы ищете? Просмотрите другие вопросы с тегом git или задайте свой вопрос.

Связано

Связанные

Горячие вопросы о сети

Чтобы подписаться на этот RSS-канал, скопируйте и вставьте этот URL-адрес в программу для чтения RSS.

дизайн сайта / логотип © 2022 Stack Exchange Inc; вклады пользователей под лицензией cc by-sa. версия 2022.3.22.41738

Читайте также: