Поиск по сайту:

Как вернуть отдельные файлы и папки к старым версиям в Git


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

Возврат против сброса

Обычно, когда вы «откатываете» коммит, Git применяет новый коммит, применяя противоположные изменения, фактически отменяя его. Это полезно, если вы допустили ошибку и вам нужно «удалить» этот коммит, хотя он все еще записан в истории.

Сброс репозитория немного отличается. Вы можете отменить только одну фиксацию за раз, но если вы выполните git reset, Git полностью изменит состояние репозитория на момент, когда эта фиксация была сделана. Это делается по многим причинам, обычно для удаления коммитов или исправления истории веток.

Обе эти операции работают со всем репозиторием, но вы также можете использовать аналогичные команды для выполнения одних и тех же действий с отдельными файлами или папками. Например, использование git reset для одного файла вернет этот файл к тому состоянию, в котором он был на момент фиксации. Это полезно, если вы просто хотите выбрать старую версию файла из своей истории Git.

Просмотр старых версий в Git

Низкотехнологичное решение вернуть файлу его прежний вид довольно просто — Github и большинство других серверов Git отслеживают историю ваших файлов, и вы можете просто щелкнуть коммит и нажать «Обзор файлов», чтобы просмотреть файл. снимок вашего репозитория из прошлого. Затем вы можете скачать файл или скопировать текст.

Это особенно полезно, если вы работаете с большими файлами кода и хотите просмотреть старые версии написанных вами функций. В этом случае вы, вероятно, не захотите возвращать все обратно, а только одну функцию. Вы можете скопировать код этой функции, не касаясь Git CLI.

Сброс файла до старой версии в Git

В этом тестовом репозитории мы сделали коммит, который отредактировал README и добавил новый файл. Мы хотим отменить изменения, внесенные в README, но не хотим сбрасывать весь репозиторий обратно к первоначальному коммиту.

Решение состоит в том, чтобы сбросить только README, проверив старую версию этого файла. Команда Git checkout делает множество вещей, например переключает ветки, но в основном она используется для загрузки файлов с идентификатором фиксации или ветки.

Чтобы сбросить файл обратно к старой версии, вам нужно найти идентификатор коммита, с которого вы хотите выполнить сброс. Для этого вы можете использовать git log , ограниченный одним файлом, чтобы просмотреть только изменения, внесенные в этот файл:

git log README.md

Скопируйте идентификатор коммита, а затем запустите git checkout с идентификатором и путем к файлу:

git checkout 22710694b25d7ce5297559851beb7d3e4de811bb README.md

Это изменит файл обратно, но пока не зафиксирует изменения. Вы можете отредактировать его и зафиксировать, когда будете готовы.

В этом примере git checkout подготовил изменения для следующего коммита. Если вы не хотите их фиксировать, вы можете отказаться от изменений. Это может быть полезно для временной загрузки старых версий файлов без использования Github.

Возврат изменений к отдельным файлам

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

Используйте флаг --no-commit , чтобы разрешить редактирование «отменить фиксацию», которую Git создает автоматически.

git revert de8564b131ca6a15a7e7c73f5ef156b119cc0b93

Это позволит вам изменить файлы перед завершением возврата. Если есть нежелательные изменения, вы можете удалить их через свой клиент или с помощью пустой git checkout.

git checkout -- file