Git вернуть удаленный файл
Если вы хотите получше узнать те части Git, про которые раньше боялись спросить, то этот список для вас. Тут собраны наиболее типичные ситуации и способы их решения как из личного опыта автора, так и собранные по всему Интернету.
Ошибка в комментарии к коммиту
git commit --amend
Как отменить последний коммит?
Можно использовать git reset , вот так:
git reset --hard HEAD
1 означает один коммит до HEAD, т.е. до текущего положения. Стоит заметить, что это «ядерный» способ, который отменит все изменения. Если вам нужно сохранить всё, что вы сделали, но еще не успели закоммитить, используйте:
git reset --soft HEAD
Удалить ветку на сервере
git push origin --delete имя_ветки
В чём разница между «git pull» и «git fetch»?
git pull — это, по сути, git fetch , после которого сразу же следует git merge . git fetch получает изменения с сервера и сохраняет их в refs/remotes/ . Это никак не влияет на локальные ветки и текущие изменения. А git pull вливает все эти изменения в локальную копию.
Как отменить «git add» до коммита?
Вы выполнили git add имя_файла случайно и хотите отменить добавление файла. Если коммит ещё не был сделан, то поможет:
git reset имя_файла
Как разрешать конфликты слияния?
Используйте программу git mergetool , которая предоставляет удобный интерфейс для разрешения конфликтов.
Удалить все локальные файлы и директории, которые не отслеживает Git, из вашей текущей копии
Осторожно! Лучше сделайте перед этим бэкап.
Клонировать все ветки с сервера
Скорее всего, вы это уже сделали, а ветки просто скрыты. Вот команда, чтобы показать их:
Можно использовать git checkout origin/имя_ветки , чтобы посмотреть на нужную ветку. Или git checkout -b имя_ветки origin/имя_ветки , чтобы создать локальную ветку, соответствующую удалённой.
Переименовать локальную ветку
git branch -m oldname newname
Вернуться к любому коммиту
Можно использовать git reset , как показано ранее. Это будет означать, что вы хотите навсегда вернуться к тому состоянию, в котором вы были, а не просто посмотреть на него (для этого надо сделать checkout). Идентификатор коммита должен быть такой, какой прописан в выводе команды git log .
git reset --hard идентификатор_коммита
Ещё раз повторим: команда отменит все текущие изменения, так что убедитесь, что вам это действительно нужно. Или используйте --soft вместо --hard.
Удалить подмодуль (submodule)
Создание подмодулей используется довольно редко, но иногда они всё-таки встречаются. Вот, что вам нужно:
git submodule deinit submodulename
git rm submodulename
git rm --cached submodulename
rm -rf .git/modules/submodulename
Перезаписать локальные файлы во время git pull
Вам снова поможет git reset :
git fetch --all
git reset --hard origin/master
Как добавить пустую директорию в репозиторий?
Никак! Такая возможность просто не поддерживается, т.к. считается, что вам это не нужно. Но есть один трюк. Можно создать файл .gitignore в нужной директории со следующим содержимым:
Экспортирование исходников аналогично «svn export»
Используйте git archive , например, так:
git archive --format zip --output /путь/к/файлу/файл.zip master
Изредка вам потребуется делать «уборку» — сделать репозиторий более компактным, очистить импортированный репозиторий от лишних файлов или восстановить потерянные данные. Данный раздел охватывает некоторые из этих сценариев.
Обслуживание репозитория
Время от времени Git выполняет автоматическую сборку мусора. Чаще всего эта команда ничего не делает. Однако, если у вас накопилось слишком много «рыхлых» объектов (не в pack-файлах), или, наоборот, отдельных pack-файлов, Git запускает полноценный сборщик — git gc (здесь «gc» это сокращение от «garbage collect», что означает «сборка мусора»). Эта команда выполняет несколько действий: собирает все «рыхлые» объекты и упаковывает их в pack-файлы; объединяет несколько упакованных файлов в один большой; удаляет недостижимые объекты, хранящиеся дольше нескольких месяцев.
Сборку мусора можно запустить вручную следующим образом:
Опять же, как правило, эта команда ничего не делает. Нужно иметь примерно 7000 несжатых объектов или более 50 pack-файлов, чтобы запустился настоящий gc . Эти значения можно изменить с помощью параметров gc.auto и gc.autopacklimit соответственно.
Ещё одно действие, выполняемое gc — упаковка ссылок в единый файл. Предположим, репозиторий содержит следующие ветки и теги:
Если выполнить git gc , эти файлы будут удалены из каталога refs . Git перенесёт их в файл .git/packed-refs в угоду эффективности:
При обновлении ссылки Git не будет редактировать этот файл, а добавит новый файл в refs/heads . Для получения хеша, соответствующего нужной ссылке, Git сначала проверит наличие файла ссылки в каталоге refs , а к файлу packed-refs обратится только в случае отсутствия оного. Так что, если вы не можете найти ссылку в каталоге refs , скорее всего она упакована в файле packed-refs .
Обратите внимание, последняя строка файла начинается с ^ . Это означает, что предыдущая строка является аннотированным тегом, а текущая строка — это коммит, на который указывает аннотированный тег.
Восстановление данных
В какой-то момент при работе с Git вы можете нечаянно потерять коммит. Как правило, такое случается, когда вы удаляете ветку, в которой находились некоторые наработки, а потом оказывается, что они всё-таки были нужными; либо вы выполнили git reset --hard , тем самым отказавшись от коммитов, которые затем понадобились. Как же в таком случае вернуть свои коммиты обратно?
Ниже приведён пример, в котором мы сбрасываем ветку master с потерей данных до более раннего состояния, а затем восстанавливаем потерянные коммиты. Для начала, давайте посмотрим, как сейчас выглядит история изменений:
Теперь сбросим ветку master на третий коммит:
Итак, теперь два последних коммита по-настоящему потеряны — они не достижимы ни из одной ветки. Необходимо найти SHA-1 хеш последнего коммита и создать ветку, указывающую на него. Сложность в том, чтобы узнать этот самый SHA-1, ведь вряд ли вы его запомнили, да?
Зачастую самый быстрый способ — использование команды git reflog . Дело в том, что во время вашей работы Git записывает все изменения HEAD. Каждый раз при переключении веток и коммитов изменений, добавляется запись в reflog. reflog также обновляется командой git update-ref — это, кстати, хорошая причина использовать именно эту команду, а не вручную записывать SHA-1 в ref-файлы, как было показано в Ссылки в Git. Вы можете посмотреть где находился указатель HEAD в любой момент времени, запустив git reflog :
Здесь мы видим два коммита, на которые когда-то указывал HEAD, однако информации не так уж и много. Для получения информации в более удобном виде, можно воспользоваться командой git log -g , которая выведет лог записей из reflog в привычном формате:
Похоже, что последний коммит — это и есть тот, который мы потеряли; его можно восстановить, создав новую ветку, указывающую на него. Например, создадим новую ветку с именем recover-branch , указывающую на этот коммит ( ab1afef ):
Отлично — теперь у нас есть ветка recover-branch , указывающая туда, куда ранее указывала ветка master , тем самым делая потерянные коммиты вновь доступными. Теперь предположим, что потерянные изменения отсутствуют в reflog — для симуляции такого состояния удалим восстановленную ветку и очистим reflog.
В этом случае два первых коммита недоступны ниоткуда. Так как данные reflog хранятся в каталоге .git/logs/ , которую мы только что удалили, то теперь у нас нет reflog. Как теперь восстановить коммиты? Один из вариантов — использование утилиты git fsck , проверяющую внутреннюю базу данных на целостность. Если выполнить её с ключом --full , будут показаны все объекты, недостижимые из других объектов:
В нашем случае потерянный коммит указан после слов «dangling commit» («висячий коммит»). Его можно восстановить аналогичным образом, создав новую ветку, указывающую на этот SHA-1.
Удаление объектов
Git — замечательный инструмент с кучей классных возможностей, но некоторые из них способны стать источником проблем; например, команда git clone загружает проект вместе со всей историей, включая все версии всех файлов. Это нормально, если в репозитории хранится только исходный код, так как Git хорошо оптимизирован под такой тип данных и может эффективно сжимать их. Однако, если когда-либо в проект был добавлен большой файл, каждый, кто потом захочет клонировать проект, будет вынужден скачивать этот файл, даже если он был удалён в следующем коммите. Он будет в базе всегда, просто потому, что он доступен в истории.
Это может стать большой проблемой при конвертации Subversion или Perforce репозиториев в Git. В этих системах вам не нужно загружать всю историю, поэтому добавление больших файлов не имеет там особых последствий. Если при импорте из другой системы или при каких-либо других обстоятельствах стало ясно, что ваш репозиторий намного больше, чем он должен быть, то как раз сейчас мы расскажем, как можно найти и удалить большие объекты.
Предупреждаем: дальнейшие действия переписывают историю изменений. Каждый коммит, начиная с самого раннего, из которого нужно удалить большой файл, будет переписан. Если сделать это непосредственно после импорта, пока никто ещё не работал с репозиторием, то всё окей, иначе придётся сообщить всем участникам о необходимости перебазирования их правок относительно ваших новых коммитов.
Для примера добавим большой файл в тестовый репозиторий, удалим его в следующем коммите, а потом найдём и удалим его полностью из базы. Сначала добавим большой файл в нашу историю:
Скажем, я в Git-хранилище. Я удаляю файл и фиксирую это изменение. Я продолжаю работать и делаю еще коммиты. Затем я обнаружил, что мне нужно восстановить этот файл.
Я знаю, что могу извлечь файл, используя git checkout HEAD^ foo.bar , но я не знаю, когда этот файл был удален.
- Какой самый быстрый способ найти коммит, который удалил данное имя файла?
- Какой самый простой способ вернуть этот файл в мою рабочую копию?
Я надеюсь, что мне не придется вручную просматривать мои журналы, извлекать весь проект для данного SHA, а затем вручную копировать этот файл в исходную проверку моего проекта.
обратите внимание, что предыдущий комментарий отвечает на вопрос в заголовке, а не в теле - это включает в себя выяснение, когда файл был удален. Чтобы найти коммит, файл был удален в: git log --diff-filter=D -- path/to/file @hhh git checkout deletedFile будет восстанавливать, deletedFile если он был удален, но это удаление еще не было поставлено или зафиксировано . Это не то, о чем здесь спрашивается; этот вопрос о том, как восстановить файл, удаление которого было совершено много коммитов назад.Найдите последний коммит, который затронул данный путь. Поскольку файл не находится в коммите HEAD, этот коммит, должно быть, удалил его.
Затем извлеките версию перед фиксацией, используя ^ символ caret ( ):
Или в одной команде, если $file речь идет о файле.
Если вы используете zsh и у вас включена опция EXTENDED_GLOB, символ каретки не будет работать. Вы можете использовать
Сложнее всего проверить коммит ДО, используя суффикс ^. Спасибо. По некоторым причинам, это не будет работать в Zsh. ± git checkout $(git rev-list -n 1 HEAD "spec/Sporkfile_example.rb")^ -- "spec/Sporkfile_example.rb" zsh: no matches found: b71c152d8f38dcd23ad7600a93f261a7252c59e9^ Я переключился на bash, и все работало нормально. Из командной строки Windows я получил ошибку. error: pathspec <filename> did not match any file(s) known to git. , Решение было использовать git bash. Я думаю, что @zoras zsh имеет свое собственное расширение для '^', но вы можете использовать альтернативный синтаксис '1': git checkout <deleting-commit>
X позволяет вам указать X коммитов перед указанным коммитом, поэтому
1 - это коммит до,
2 два коммита до и т. д.
В командной строке Windows, ^ символ является escape-символом! Поэтому в cmd вы должны набрать, ^^ чтобы сообщить cmd, что вы хотите использовать один литерал ^ и что после него вы не избежите чего-то еще. Что происходит со многими людьми, так это то, что за ^ ними следует пробел. Таким образом, cmd думает, что вы выходите из пробела - что дает просто пробел. Таким образом, к тому времени, когда git получает аргументы cli, он видит SHA1 и не видит SHA1^ . Это действительно раздражает.это не спасательный персонаж, поэтому это все еще работает. (PS. Если вы думаете, что гуглерам понадобится эта информация, пожалуйста, проголосуйте за этот комментарий)
- Используйте git log --diff-filter=D --summary для получения всех коммитов, которые удалили файлы и файлы удалены;
- Используйте git checkout $commit
Где $commit значение коммита, которое вы нашли на шаге 1, например e4cf499627
это, безусловно, самый простой и интуитивно понятный подход. git log -- *PartOfMyFileName* , Спасибо за $commit1 filename синтаксис работает идеально подходят для отдельных файлов, а также работает для целых каталогов. т.е. , чтобы восстановить все удаленные изображения в ./images из ша 12345: git checkout 12345
1 images . спасибо за этот ответ!
1 означает, что вы должны добавить имя коммита. Что-то вроде 1d0c9ef6eb4e39488490543570c31c2ff594426c где $commit есть.
Чтобы восстановить все эти удаленные файлы в папке, введите следующую команду.
Это, наверное, самый простой способ. Его извращение, как трудно git , сделал даже самую простую задачу. git checkout - [файл] вернет изменения в [файл]. Канал заменит [файл] именем удаленных файлов. 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 чтобы отменить изменения,
или вы можете вернуться на один коммит и вручную осмотреть повреждения:
Вы также можете использовать хорошее и плохое вручную, если это не может быть проверено автоматически. Смотрите справочную страницу. @avdgaag git bisect run говорит Git автоматизировать биективности, выполнив команду следующего слова «запустить» , где команда должна вернуться 0 к good версии (см git help bisect для более подробной информации). Это '[ -e foo.bar ]' стандартное выражение для проверки foo.bar , существует ли файл (реализация обычно находится в файле, на /usr/bin/[ который обычно /usr/bin/test делается жесткая ссылка), и одинарные кавычки используются для обозначения всего этого как одного аргумента командной строки. Отличная идея. Я попробовал этот подход, и он идентифицировал фиксацию перед удалением, но не фиксацию, которая фактически удаляла файл. И в другом тесте было выявлено 2 коммита до удаления. Безумный? Может быть. Но bisect - отличный способ помочь найти причину ошибки, поэтому в любом случае это ценный навык. Так что, хотя, может быть, это не «правильный» или «самый правильный» путь, это все же хорошая идея и стоит +1, безусловно!Мой новый любимый псевдоним, основанный на bonyiii «ы ответ (upvoted), и мой собственный ответ на вопрос о„ Передайте аргумент команды Git псевдоним “:
Я потерял файл, удаленный по ошибке несколько коммитов назад?
Быстро:
Предупреждение, с Git 2.23 (Q3 2019) поставляется экспериментальная команда с именем git restore (!).
Поэтому переименуйте этот псевдоним (как показано ниже).
Роберт Дейли предлагает в комментариях следующий псевдоним:
Это восстанавливает весь коммит, а не только запрошенный файл. Вот мой псевдоним, работает чудесно: restore-file = !git checkout $(git rev-list -n 1 HEAD -- "$1")^ -- "$1" @RobertDailey Это выглядит великолепно! Я включил ваш псевдоним в ответ для большей наглядности. Для установки псевдонима из командной строки я использовал эту команду: 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.0 -1; это не верно. Эти команды отменят удаление, которое еще не было зафиксировано (первая снимает этап с удаления, если он был подготовлен, а вторая отменяет внесенные без изменений в файл), но вы утверждаете, что они восстановят зафиксированный удаление файла, которое просто не соответствует действительности и завершится с ошибкой, подобной той, что была в комментарии @ wisbucky выше. @MarkAmery Действительно, я думаю, что эта команда хорошо работала для тех разработчиков, которые не делали явной подготовки для фиксации удаленных файлов git add -A , но восстановленный файл все еще находился в стадии фиксации.Если вы только внесли изменения и удалили файл, но не зафиксировали его, и теперь вы расстались со своими изменениями
но ваши удаленные файлы не вернулись, вы просто выполните следующую команду:
И до того, ваш файл вернулся.
Получить идентификатор коммита, в котором был удален файл, одним из следующих способов.
Вы должны получить что-то вроде:
commit bfe68bd117e1091c96d2976c99b3bcc8310bebe7 Автор: Александр Орлов Дата: чт 12 мая 23:44:27 2011 +0200
commit 3ea4e3af253ac6fd1691ff6bb89c964f54802302 Автор: Александр Орлов Дата: Чт 12 мая 22:10:22 2011 +0200
3 . Теперь, используя идентификатор фиксации bfe68bd117e1091c96d2976c99b3bcc8310bebe7, сделайте:
Поскольку идентификатор коммита ссылается на коммит, где файл уже был удален, вам нужно ссылаться на коммит непосредственно перед bfe68b, что можно сделать, добавив ^1 . Это значит: дай мне коммит как раз перед bfe68b.
Это тот же подход, что и принятый ответ, но есть еще несколько способов найти коммит удаления. Мне все еще нравится подход, принятый в принятом ответе, но это хорошие альтернативы. Спасибо! Я предполагаю, что сначала проверка удаленного файла, а затем (без изменения) его фиксация не создает копию файла. Правильно? (Мне нужно сделать это с изображениями, а копии сделают хранилище больше) Этот для моей ситуации (удален непреднамеренно) был самым простым решением.Поместите это в свой .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. Я удаляю файл и фиксирую это изменение. Я продолжаю работать и делаю еще несколько обязательств. Затем я обнаружил, что мне нужно восстановить этот файл.
Я знаю, что могу проверить файл с помощью git checkout HEAD^ foo.bar , но я действительно не знаю, когда этот файл был удален.
- каков был бы самый быстрый способ найти фиксацию, которая удалила данное имя файла?
- каков был бы самый простой способ вернуть этот файл в мою работу копия?
Я надеюсь, что мне не придется вручную просматривать мои журналы, проверять весь проект для данного SHA, а затем вручную копировать этот файл в мою исходную проверку проекта.
найти последнюю фиксацию, которая повлияла на данный путь. Поскольку файл не находится в фиксации HEAD, эта фиксация должна была удалить его.
затем проверьте версию на фиксации раньше, используя курсор ( ^ ) символов:
или в одной команде, если $file это файл, о котором идет речь.
если вы используете zsh и опция EXTENDED_GLOB включена, символ курсора не будет работать. Вы можете использовать
- использовать git log --diff-filter=D --summary чтобы получить все коммиты, которые удалили файлы и файлы удалены;
- использовать git checkout $commit
здесь $commit значение фиксации вы нашли на шаге 1, например, e4cf499627
чтобы восстановить все удаленные файлы в папку, введите следующую команду.
Я пришел к этому вопросу, чтобы восстановить файл, который я только что удалил, но я еще не совершил изменения. На всякий случай, если вы окажетесь в такой ситуации, все, что вам нужно сделать, это следующее:
git checkout HEAD -- path/to/file.ext
если вы сумасшедший, используйте git-bisect . Вот что нужно сделать:
теперь пришло время запустить автоматический тест. Команда оболочки '[ -e foo.bar ]' вернет 0, если , и 1 в противном случае. Команда "выполнить" команды git-bisect будет использовать двоичный поиск, чтобы автоматически найти первую фиксацию, где тест терпит неудачу. Он начинается на полпути через заданный диапазон (от хорошего до плохого) и разрезает его пополам на основе результата указанного теста.
теперь вы находитесь в фиксации, которая удалила его. Отсюда вы можете вернуться в будущее и использовать git-revert чтобы отменить изменение,
или вы можете вернуться на одну фиксацию и вручную проверить повреждение:
мой новый любимый псевдоним, основанный на bonyiii ' s ответ (upvoted), и мой собственный ответ о "передайте аргумент команде псевдонима Git":
Я потерял файл, удаленный по ошибке несколько коммитов назад?
Быстро:
Роберт Дэйли предлагает в комментариях следующие псевдонимы:
для установки псевдонима из командной строки я использовал следующую команду:
Если вы знаете имя файла, это простой способ с помощью основных команд:
перечислите все коммиты для этого файла.
последняя фиксация (самая верхняя) - это та, которая удалила файл. Таким образом, вам нужно восстановить Второй до последнего фиксации.
чтобы восстановить удаленный и введенный файл:
Он был протестирован на Git версии 1.7.5.4.
Если вы только внесли изменения и удалили файл, но не зафиксировали его, и теперь вы расстались с вашими изменениями
но удаленные файлы не возвращаются, вы просто выполняете следующую команду:
и presto, ваш файл вернулся.
получить идентификатор коммита, где файл был удален, используя один из способов ниже.
вы должны получить что-то вроде:
commit bfe68bd117e1091c96d2976c99b3bcc8310bebe7 Автор: Александр Орлов Дата: Чт 12 Мая 23: 44: 27 2011 +0200
совершить 3ea4e3af253ac6fd1691ff6bb89c964f54802302 Автор: Александр Орлов Дата: Чт 12 Мая 22:10: 22 2011 +0200
3. Теперь, используя идентификатор фиксации bfe68bd117e1091c96d2976c99b3bcc8310bebe7 do:
поскольку идентификатор фиксации ссылается на фиксацию, где файл уже был удален, вам нужно ссылаться фиксация перед bfe68b что можно сделать путем добавления ^1 . Это означает: дайте мне совершить перед bfe68b.
во многих случаях может быть полезно использовать coreutils (grep, sed, etc.) совместно с Git. Я уже знаю эти инструменты довольно хорошо,но Git меньше. Если бы я хотел выполнить поиск удаленного файла, я бы сделал следующее:
когда я нахожу ревизию/фиксацию:
Как уже сказали до меня.
теперь файл будет восстановлен до состояния, в котором он был до удаления. Не забудьте повторно посвятить его работе дерево, если хочешь, чтобы оно было рядом.
положите это в свой .bash_profile (или другой соответствующий файл, который загружается при открытии командной оболочки):
этот псевдоним сначала проверяет, чтобы найти последнюю фиксацию, где этот файл существовал, а затем делает проверку git этого пути файла из этого последнего фиксации, где этот файл существовал. источник
поэтому мне пришлось восстановить кучу удаленных файлов из определенной фиксации, и я справился с ней двумя командами:
(обратите внимание на пробел в конце каждой команды.)
файлы были добавлены .файл gitignore, а затем очищен с помощью git rm, мне нужно было восстановить файлы, но затем распаковать их. У меня были сотни файлов для восстановления, ввод вручную для каждого файла, как и в других примерах, будет слишком медленным.
восстановить удаленный файл:
у меня был тот же вопрос. Сам того не зная, я создал болтается commit.
список свесив совершает
git fsck --lost-found
проверить каждый болтающийся фиксации
git reset --hard <commit id>
мои файлы снова появились, когда я перешел к болтающейся фиксации.
git status по причине:
“HEAD detached from <commit id where it detached>”
в нашем случае мы случайно удалили файлы в фиксации, а некоторые фиксации позже мы поняли нашу ошибку и хотели вернуть все файлы, которые были удалены, но не те, которые были изменены.
основываясь на превосходном ответе Чарльза Бейли, вот мой один лайнер:
Если вы знаете фиксацию, которая удалила файл(ы), выполните эту команду, где <SHA1_deletion> - это фиксация, которая удалила файл:
в части перед каналом перечислены все файлы, которые были удалены в фиксации; все они извлекаются из предыдущей фиксации для их восстановления.
Читайте также: