Git: проверка файла с предыдущей фиксации и внесение изменений в HEAD

Недавно я передал файл HEAD моей ветки, в которой есть ошибки. Мне нужно сделать следующее:

  • Получить этот файл с одного фиксатора до HEAD
  • Верните этот файл в HEAD

Какой лучший способ сделать это?

Ответ 1

Вы сами это сказали:

Сначала верните файл с одной фиксации до:

$> git checkout HEAD~1 path/to/file.ext

Затем зафиксируйте его:

$> git commit -a -m 'Retrieved file from older revision'

Если только изменения в этом файле присутствуют в последнем коммите, вы можете даже использовать git-revert:

$> git revert HEAD

Я думаю, было бы лучше сделать это отдельным фиксатором, потому что он говорит вам, что именно вы вернули, и почему. Тем не менее, вы можете скворовать это в предыдущую фиксацию, используя переключатель --amend на git-commit.

Ответ 2

В этом случае будьте осторожны:

Commit hash - File modified
aaaaaaa       index.php
bbbbbbb       test.php
ccccccc       index.php

Git checkout HEAD ~ 1 (или HEAD ^) index.php попытайтесь проверить файл index.php на предыдущий хеш HEAD (bbbbbbb), но это не настоящий предыдущий хэш файл фиксации, это ccccccc. В предыдущем хеше HEAD index.php по-прежнему остается неизменным, поскольку последнее изменение было выполнено в hash ccccccc.

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

git log -n 2 --pretty=format:%h path/to/file.ext

Игнорируйте первый хеш и возьмите второй хэш, затем:

git checkout <second_hash> path/to/file.ext
git commit -m 'Revert this file to real previous commit'