Хард ресет одного файла

В настоящее время у меня есть три измененных файла в моем рабочем каталоге. Однако я хочу, чтобы один из них был сброшен в состояние 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:

  1. Просмотр журнала вашего файла

    git log myFile.js

    commit 1023057173029091u23f01w276931f7f42595f84f Автор: kmiklas Дата: вторник, 7 августа 09:29:34 2018 -0400

    JIRA-12345 - Рефакторинг с новой архитектурой.

  2. Примечание хеш файла:

    1023057173029091u23f01w276931f7f42595f84f

  3. Показать файл, используя хэш. Убедитесь, что это то, что вы хотите:

    git show 1023057173029091u23f01w276931f7f42595f84f:./ myFile.js

  4. Перенаправить файл в локальную копию

    git show 1023057173029091u23f01w276931f7f42595f84f:./myFile.js > myFile.07aug2018.js

  5. Сделайте резервную копию вашего текущего файла.

    cp myFile.js myFile.bak.js

  6. Откройте оба файла в вашем любимом текстовом редакторе.

    vim myFile.js
    vim myFile.07aug2018.js

  7. Скопируйте и вставьте код из myFile.07aug2018.js в myFile.js и сохраните.

  8. Зафиксируйте и нажмите myFile.js

  9. Снова просмотрите журнал и убедитесь, что ваш файл правильно на месте.

  10. Скажите своим клиентам, чтобы они брали последнюю версию, с удовольствием наблюдаем, как она работает со старой версией на месте.

Не самое сексуальное или самое мерзкое решение, и определенно "ручной" сброс / возврат, но это работает. Это требует минимального знания git и не нарушает историю коммитов.

Другие вопросы по тегам