Git восстановление файла удалено в локальной ветке - PullRequest
1 голос
/ 07 марта 2020

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

Как мне восстановить файл?

Я получил ха sh коммита, где файлы были удалены, и попробовал:

git checkout 1f1d3f76bac0bf6e13ceee5bb3df69f8389fc73f -- /path/to/MyMissingFile

но git сказал pathspec did not match any files known to git. Я подтвердил, что имя файла и фиксация были правильными, используя git log --diff-filter=D --summary, чтобы напечатать фиксацию и имена файлов, где произошло удаление.

Ответы [ 4 ]

1 голос
/ 07 марта 2020

Проблема с

git checkout 1f1d3f76bac0bf6e13ceee5bb3df69f8389fc73f -- /path/to/MyMissingFile

, предположительно основана на том, что вы сказали, это га sh коммита, который удалил файл - поэтому файла там нет. Но файл находится в родительском коммите. Кстати, вы можете использовать сокращенное ha sh, а затем, прикрепив ^ или ~ к концу, вы получите родительский коммит. Так что

git checkout 1f1d3f76ba^ -- /path/to/MyMissingFile

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

Переключение на более новую команду restore также является опцией (и, вероятно, неплохой идеей), как кто-то упоминал; но на самом деле проблема не в этом.

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

1 голос
/ 07 марта 2020

Правильная команда с Git 2.23+ будет использовать git restore, который заменяет запутанную команду git checkout .

 git restore -s master -- /path/to/MyMissingFile

Это восстановит на рабочем дереве только тот файл, который присутствует в ветви "source" (-s) master.

Чтобы восстановить и рабочее дерево, и индекс:

git restore -s master -SW -- /path/to/MyMissingFile

(-SW: сокращение от --staged --worktree)

Если вы только восстановите рабочее дерево, то git diff, как показано здесь , будет разница между индексом (который все еще отражает удаляемый файл) и рабочим деревом.
Восстанавливая рабочее дерево и индекса, вы добавляете непосредственно восстановленный файл, чтобы затем зафиксировать его.

0 голосов
/ 07 марта 2020

Самый простой способ - использовать git revert.

  1. Найти коммит га sh, где вы допустили ошибку
  2. Выполнить git revert [commit-hash]

И ты вернешь свой файл

0 голосов
/ 07 марта 2020

Мне удалось решить эту проблему, просто извлекая файлы из основной ветки, а затем фиксируя их в моей функциональной ветви:

git checkout master -- /path/to/MyMissingFile
...