Скажем, я в Git-хранилище. Я удаляю файл и фиксирую это изменение. Я продолжаю работать и делаю еще коммиты. Затем я обнаружил, что мне нужно восстановить этот файл.
Я знаю, что могу извлечь файл, используя git checkout HEAD^ foo.bar
, но я не знаю, когда этот файл был удален.
- Какой самый быстрый способ найти коммит, который удалил данное имя файла?
- Какой самый простой способ вернуть этот файл в мою рабочую копию?
Я надеюсь, что мне не придется вручную просматривать мои журналы, извлекать весь проект для данного SHA, а затем вручную копировать этот файл в исходную проверку моего проекта.
git
file-io
git-checkout
avdgaag
источник
источник
git log --diff-filter=D -- path/to/file
git checkout deletedFile
будет восстанавливать,deletedFile
если он был удален, но это удаление еще не было поставлено или зафиксировано . Это не то, о чем здесь спрашивается; этот вопрос о том, как восстановить файл, удаление которого было совершено много коммитов назад.Ответы:
Найдите последний коммит, который затронул данный путь. Поскольку файл не находится в коммите HEAD, этот коммит, должно быть, удалил его.
Затем извлеките версию перед фиксацией, используя
^
символ caret ( ):Или в одной команде, если
$file
речь идет о файле.Если вы используете zsh и у вас включена опция EXTENDED_GLOB, символ каретки не будет работать. Вы можете использовать
~1
вместо этого.источник
± git checkout $(git rev-list -n 1 HEAD "spec/Sporkfile_example.rb")^ -- "spec/Sporkfile_example.rb" zsh: no matches found: b71c152d8f38dcd23ad7600a93f261a7252c59e9^
Я переключился на bash, и все работало нормально.error: pathspec <filename> did not match any file(s) known to git.
, Решение было использовать git bash.git checkout <deleting-commit>~1 -- <file-path>
~ X позволяет вам указать X коммитов перед указанным коммитом, поэтому ~ 1 - это коммит до, ~ 2 два коммита до и т. д.^
символ является escape-символом! Поэтому в cmd вы должны набрать,^^
чтобы сообщить cmd, что вы хотите использовать один литерал ^ и что после него вы не избежите чего-то еще. Что происходит со многими людьми, так это то, что за^
ними следует пробел. Таким образом, cmd думает, что вы выходите из пробела - что дает просто пробел. Таким образом, к тому времени, когда git получает аргументы cli, он видитSHA1
и не видитSHA1^
. Это действительно раздражает.~
это не спасательный персонаж, поэтому это все еще работает. (PS. Если вы думаете, что гуглерам понадобится эта информация, пожалуйста, проголосуйте за этот комментарий)git log --diff-filter=D --summary
для получения всех коммитов, которые удалили файлы и файлы удалены;git checkout $commit~1 path/to/file.ext
для восстановления удаленного файла.Где
$commit
значение коммита, которое вы нашли на шаге 1, напримерe4cf499627
источник
git log -- *PartOfMyFileName*
, Спасибо за$commit~1
git checkout $commit~1 filename
синтаксис работает идеально подходят для отдельных файлов, а также работает для целых каталогов. т.е. , чтобы восстановить все удаленные изображения в ./images из ша 12345:git checkout 12345~1 images
. спасибо за этот ответ!$commit~1
означает, что вы должны добавить имя коммита. Что-то вроде1d0c9ef6eb4e39488490543570c31c2ff594426c
где$commit
есть.Чтобы восстановить все эти удаленные файлы в папке, введите следующую команду.
источник
git
, сделал даже самую простую задачу.ls-files
Суб-команда под рукой, но , кажется, не работает для файлов , которые были удалены сgit rm
т в постановке, не говоря уже совершил, что и спросил ОП.M myChangedFile
послеgit checkout
?Я пришел к этому вопросу, пытаясь восстановить файл, который только что удалил, но еще не внес изменения. На случай, если вы окажетесь в такой ситуации, все, что вам нужно сделать, это следующее:
git checkout HEAD -- path/to/file.ext
источник
Если вы ненормальный, используйте
git-bisect
. Вот что нужно сделать:Теперь пришло время запустить автоматический тест. Команда оболочки
'[ -e foo.bar ]'
вернет 0, еслиfoo.bar
существует, и 1 в противном случае. Команда «run»git-bisect
будет использовать бинарный поиск, чтобы автоматически найти первый коммит, где тест не пройден. Он начинается на полпути через заданный диапазон (от хорошего до плохого) и разрезает его пополам в зависимости от результата указанного теста.Теперь вы в коммите, который удалил его. Отсюда вы можете вернуться в будущее и использовать,
git-revert
чтобы отменить изменения,или вы можете вернуться на один коммит и вручную осмотреть повреждения:
источник
git bisect run '[ -e foo.bar ]'
?git bisect run
говорит Git автоматизировать биективности, выполнив команду следующего слова «запустить» , где команда должна вернуться0
кgood
версии (смgit help bisect
для более подробной информации). Это'[ -e foo.bar ]'
стандартное выражение для проверкиfoo.bar
, существует ли файл (реализация обычно находится в файле, на/usr/bin/[
который обычно/usr/bin/test
делается жесткая ссылка), и одинарные кавычки используются для обозначения всего этого как одного аргумента командной строки.Мой новый любимый псевдоним, основанный на bonyiii «ы ответ (upvoted), и мой собственный ответ на вопрос о„ Передайте аргумент команды Git псевдоним “:
Я потерял файл, удаленный по ошибке несколько коммитов назад?
Быстро:
Кризис предотвращен.
Предупреждение, с Git 2.23 (Q3 2019) поставляется экспериментальная команда с именем
git restore
(!).Поэтому переименуйте этот псевдоним (как показано ниже).
Роберт Дейли предлагает в комментариях следующий псевдоним:
И Джеган добавляет в комментариях :
источник
restore-file = !git checkout $(git rev-list -n 1 HEAD -- "$1")^ -- "$1"
git config --global alias.restore "\!git checkout \$(git rev-list -n 1 HEAD -- \"\$1\")^ -- \"\$1\""
Expansion of alias 'restore' failed; '!git' is not a git command
Если вы знаете имя файла, это простой способ с основными командами:
Перечислите все коммиты для этого файла.
Последний коммит (самый верхний) - тот, который удалил файл. Так что вам нужно восстановить второй до последнего коммита.
источник
Чтобы восстановить удаленный и зафиксированный файл:
Он был протестирован на Git версии 1.7.5.4.
источник
error: pathspec 'foo' did not match any file(s) known to git.
убедился, что имя файла указано правильно. Git версия 2.7.0git add -A
, но восстановленный файл все еще находился в стадии фиксации.Если вы только внесли изменения и удалили файл, но не зафиксировали его, и теперь вы расстались со своими изменениями
но ваши удаленные файлы не вернулись, вы просто выполните следующую команду:
И до того, ваш файл вернулся.
источник
У меня есть это решение .
Получить идентификатор коммита, в котором был удален файл, одним из следующих способов.
git log --grep=*word*
git log -Sword
git log | grep --context=5 *word*
git log --stat | grep --context=5 *word*
# рекомендуется, если вы ничего не помнитеВы должны получить что-то вроде:
3 . Теперь, используя идентификатор фиксации bfe68bd117e1091c96d2976c99b3bcc8310bebe7, сделайте:
Поскольку идентификатор коммита ссылается на коммит, где файл уже был удален, вам нужно ссылаться на коммит непосредственно перед bfe68b, что можно сделать, добавив
^1
. Это значит: дай мне коммит как раз перед bfe68b.источник
источник
git undelete path/to/file.ext
Поместите это в свой
.bash_profile
(или другой соответствующий файл, который загружается при открытии командной оболочки):Тогда используйте:
Этот псевдоним сначала проверяет, чтобы найти последний коммит, где существовал этот файл, а затем выполняет Git извлечение пути этого файла из того последнего коммита, где этот файл существовал. Источник .
источник
Во многих случаях может быть полезно использовать coreutils (grep, sed и т. Д.) В сочетании с Git. Я уже хорошо знаю эти инструменты, но Git меньше. Если бы я хотел выполнить поиск удаленного файла, я бы сделал следующее:
Когда я нахожу ревизию / коммит:
Также как другие заявляли до меня.
Теперь файл будет восстановлен до состояния, в котором он находился до удаления. Не забудьте повторно зафиксировать его в рабочем дереве, если хотите сохранить его.
источник
Мне пришлось восстанавливать кучу удаленных файлов из определенного коммита, и мне это удалось с помощью двух команд:
(Обратите внимание на завершающий пробел в конце каждой команды.)
Файлы были добавлены в файл .gitignore и затем очищены с помощью
git rm
. Мне нужно было восстановить файлы, но затем удалить их. Мне нужно было восстановить сотни файлов, и вводить данные вручную для каждого файла, как в других примерах, было слишком медленно.источник
На самом деле, этот вопрос напрямую касается Git, но кто-то вроде меня работает с такими инструментами с графическим интерфейсом, как WebStorm VCS, кроме знания команд Git CLI.
Я щелкаю правой кнопкой мыши по пути, который содержит удаленный файл, затем захожу в Git и затем нажимаю на Показать историю .
Инструменты VCS показывают все изменения, и я вижу все изменения и изменения каждого из них.
Затем я выбираю коммиты, которые мой друг удаляет
PostAd.js
файл. теперь смотрите ниже:И теперь я вижу свое желание удалить файл. Я просто дважды щелкаю по имени файла, и оно восстанавливается.
Я знаю, что мой ответ - не команды Git, но он быстрый, надежный и простой для начинающих и профессиональных разработчиков. Инструменты WebStorm VCS великолепны и идеально подходят для работы с Git, и для них не нужны никакие другие плагины или инструменты.
источник
У меня такой же вопрос. Не зная этого, я создал висячий коммит .
Список свисающих коммитов
git fsck --lost-found
Осмотрите каждый висячий коммит
git reset --hard <commit id>
Мои файлы снова появились, когда я перешел на висячий коммит.
git status
по причине:“HEAD detached from <commit id where it detached>”
источник
Восстановите удаленный файл:
источник
Если вы знаете коммит, который удалил файл (ы), выполните эту команду, где
<SHA1_deletion>
находится коммит, который удалил файл:Часть перед конвейером перечисляет все файлы, которые были удалены в коммите; они все извлечены из предыдущего коммита, чтобы восстановить их.
источник
Найдите коммит, который удалил ваш файл:
Пример вывода:
Начиная с Git 2.23 фактически есть
restore
команда. Это все еще эксперимент, но чтобы восстановить что-то, что вы удалили в коммите (в данном случае 4711174), вы можете набрать:Обратите внимание на ^ после идентификатора коммита, так как мы хотим восстановить что-то из коммита до того, который удалил файл.
--source
Аргумент указываетrestore
команду , где искать файл (ы) для восстановления и может быть любой фиксации и даже индекс.Смотрите: git-restore doc для git 2.23.0
источник
В нашем случае мы случайно удалили файлы в коммите, а некоторые коммиты позже осознали нашу ошибку и хотели вернуть все файлы, которые были удалены, но не те, которые были изменены.
Основываясь на превосходном ответе Чарльза Бейли, вот моя строчка:
источник
Простой и точный
Прежде всего, получите последний стабильный коммит, в котором у вас есть этот файл:
Допустим, вы нашли $ commitid 1234567 ..., затем
Это восстановит версию файла, которая была в этом коммите.
источник
Для лучшего способа сделать это попробуйте.
Сначала найдите идентификатор коммита, который удалил ваш файл. Это даст вам сводку коммитов, которые удалили файлы.
Примечание:
84sdhfddbddd
вашcommit id
Благодаря этому вы можете легко восстановить все удаленные файлы.
источник
Вы всегда
git revert
можете сделать свой коммит, который удалил файл. ( Это предполагает, что удаление было единственным изменением в коммите. )И если вы продолжили работу и позже поняли, что не хотите фиксировать этот коммит удаления, вы можете отменить его, используя:
Сейчас
git log
показывает:И
readme.md
был восстановлен в хранилище.источник
У меня также есть эта проблема, используя приведенный ниже код для извлечения предыдущего файла в локальный каталог:
Пример ниже работает для меня:
git checkout resources/views/usaSchools.blade.php
источник
источник
Если удаление не было зафиксировано, приведенная ниже команда восстановит удаленный файл в рабочем дереве.
Вы можете получить список всех удаленных файлов в рабочем дереве, используя команду ниже.
Если удаление было зафиксировано, найдите коммит, где оно произошло, а затем восстановите файл из этого коммита.
Если вы ищете путь к файлу для восстановления, следующая команда отобразит сводку всех удаленных файлов.
источник
Чтобы восстановить все удаленные файлы с помощью Git, вы также можете сделать:
Где
git ls-files --deleted
перечисляет все удаленные файлы иgit checkout $(git command)
восстанавливает список файлов в параметре.источник