Хард ресет одного файла
В настоящее время у меня есть три измененных файла в моем рабочем каталоге. Однако я хочу, чтобы один из них был сброшен в состояние HEAD.
В SVN я бы использовал svn revert <filename>
(с последующим svn update <filename>
если нужно) но в git я должен использовать git reset --hard
, Однако эта команда не может работать с одним файлом.
Есть ли способ в git отменить изменения одного файла и перезаписать его свежей копией HEAD?
6 ответов
Вы можете использовать следующую команду:
git checkout HEAD -- my-file.txt
... который обновит как рабочую копию my-file.txt
и его состояние в индексе с этим из HEAD.
--
в основном означает: обрабатывать каждый аргумент после этой точки как имя файла. Подробнее в этом ответе. Спасибо VonC за указание на это.
Начиная с Git 2.23 (август 2019 г.) вы можете использовать restore
( подробнее):
git restore pathTo/MyFile
Вышеуказанное восстановит MyFile
на HEAD
(последняя фиксация) в текущей ветке.
Если вы хотите получить изменения из другой фиксации, вы можете вернуться к истории фиксации назад. Следующая команда получитMyFile
два коммитов предшествуют последнему. Вам нужно сейчас-s
(--source
) вариант, так как теперь вы используете master~2
и нет master
(по умолчанию) при восстановлении источника:
git restore -s master~2 pathTo/MyFile
Вы также можете получить файл из другой ветки!
git restore -s my-feature-branch pathTo/MyFile
Сброс к голове:
Для полной перезагрузки одного файла в HEAD:
git checkout @ -- myfile.ext
Обратите внимание, что @
коротка для HEAD
, Старая версия git может не поддерживать краткую форму.
Сбросить на индекс:
Чтобы принудительно сбросить отдельный файл к индексу, предполагая, что индекс не пустой, в противном случае к HEAD:
git checkout -- myfile.ext
Дело в том, что, чтобы быть в безопасности, вы не хотите уходить @
или же HEAD
из команды, если только вы не хотите сбросить только индекс.
Чтобы вернуться в upstream/master, сделайте:
git checkout upstream/master -- myfile.txt
Ссылка на HEAD не обязательна.
git checkout -- file.js
достаточно
Вы можете использовать следующую команду:
git checkout filename
Если у вас есть ветка с тем же именем файла, вы должны использовать эту команду:
git checkout -- filename
Вы можете использовать приведенную ниже команду для сброса одного файла
git checkout HEAD -- path_to_file/file_name
Список всех измененных файлов, чтобы получить path_to_file/filename
с командой ниже
git status
Вы можете использовать следующую команду:
git reset -- my-file.txt
который обновит как рабочую копию my-file.txt
когда добавлено.
Простой, легкий, практичный способ вытащить вас из горячей воды, особенно если вам не очень удобен git:
Просмотр журнала вашего файла
git log myFile.js
commit 1023057173029091u23f01w276931f7f42595f84f Автор: kmiklas Дата: вторник, 7 августа 09:29:34 2018 -0400
JIRA-12345 - Рефакторинг с новой архитектурой.
Примечание хеш файла:
1023057173029091u23f01w276931f7f42595f84f
Показать файл, используя хэш. Убедитесь, что это то, что вы хотите:
git show 1023057173029091u23f01w276931f7f42595f84f:./ myFile.js
Перенаправить файл в локальную копию
git show 1023057173029091u23f01w276931f7f42595f84f:./myFile.js > myFile.07aug2018.js
Сделайте резервную копию вашего текущего файла.
cp myFile.js myFile.bak.js
Откройте оба файла в вашем любимом текстовом редакторе.
vim myFile.js
vim myFile.07aug2018.jsСкопируйте и вставьте код из myFile.07aug2018.js в myFile.js и сохраните.
Зафиксируйте и нажмите myFile.js
Снова просмотрите журнал и убедитесь, что ваш файл правильно на месте.
Скажите своим клиентам, чтобы они брали последнюю версию, с удовольствием наблюдаем, как она работает со старой версией на месте.
Не самое сексуальное или самое мерзкое решение, и определенно "ручной" сброс / возврат, но это работает. Это требует минимального знания git и не нарушает историю коммитов.