Как вернуть удаленный файл в GIT

Кто сможет помочь объяснить механику работы с GIT?

  1. Допустим у нас есть ветка master c двумя файлами, c нее сделали копию ветку dev.
  2. удалим один файл с ветки master, делаем commit
  3. сделаем merge с ветки dev в master и разницы в ветках нет, merge не получается, несмотря на удаленный файл.

Вопрос: Как правильно вернуть удаленный файл не откатывая commit в котором удалили файл на этапе 2? Что делать, если файлов несколько, а в ветках есть и другие изменения, который нельзя откатить полностью?
Сэмулировал ситуацию в репозитории


Ответы (3 шт):

Автор решения: Олександр Слуцький

Лично я подобные правки делаю руками:

  1. git checkout коммит-когда-файлы-ещё-были
  2. Руками копирую файлы в какую-нибудь папку снаружи репозитория
  3. git checkout master
  4. Руками копирую файлы в репозиторий
  5. git add . ; git commit -m '...'
→ Ссылка
Автор решения: Qwertiy

Чтобы приделать к текущей ветки файлы из другой, можно находясь в ветке master выполнить

git checkout dev -- путь/к/файлу/или/папке

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

Если есть необходимость перезаписать некие изменения, можно в команде выше использовать флаг --force.

→ Ссылка
Автор решения: aleksandr barakin

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

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

для описанной в вопросе ситуации команда будет выглядеть примерно так:

$ git checkout коммит-когда-файлы-ещё-были -- имя-файла1 имя-файла2 ...
→ Ссылка