Устранение простых ошибок
Иногда возникают проблемы. Вы могли забыть добавить файл или, наоборот, добавить лишний файл по ошибке. В последней фиксации могла быть допущена орфографическая ошибка, или же вы непреднамеренно зафиксировали что-то, что не планировали. Вы также могли случайно удалить файл.
Git позволяет вносить изменения без опасений, так как вы всегда можете откатить их. Вы даже можете изменять журнал фиксаций Git при условии, что к фиксациям еще не был предоставлен общий доступ.
Исправление фиксации: флаг --amend
В предыдущем упражнении вы обновили файл index.html, чтобы изменить путь к таблице стилей. Вы должны были добавить следующую инструкцию:
<link rel="stylesheet" href="CSS/site.css">
Предположим, вы обнаружили, что допустили ошибку при вводе инструкции. Вместо указания пути к папке CSS
вы ввели CS
:
<link rel="stylesheet" href="CS/site.css">
При обновлении содержимого страницы в браузере вы замечаете, что таблица стилей CSS не применяется. После изучения проблемы вы понимаете, что значения пути введены неправильно.
Итак, вы изменяете путь к таблице стилей в файле index.html на правильный. На этом этапе можно было бы просто зафиксировать исправленную версию файла index.html, но вместо этого вы хотите включить ее в ту же фиксацию, что и исходную версию. Параметр --amend
команды git commit
позволяет изменить журнал:
git commit --amend --no-edit
Параметр --no-edit
предписывает Git внести изменение, не изменяя сообщение о фиксации. С помощью параметра --amend
можно также изменить сообщение о фиксации, добавить файлы, которые случайно не были включены в фиксацию, или удалить файлы, добавленные по ошибке.
Примечание.
Возможность изменять журнал — одна из самых эффективных в Git. Но, как и любые другие эффективные возможности, ее следует использовать аккуратно. В частности, не рекомендуется изменять фиксации, доступ к которым был предоставлен другому разработчику или которые были опубликованы в общем репозитории, таком как GitHub.
Восстановление удаленного файла: git checkout
Представьте, что вы внесли изменение в файл исходного кода, которое нарушило работу всего проекта, поэтому необходимо вернуться к предыдущей версии этого файла. Или, возможно, вы случайно удалили весь файл. Git позволяет легко извлечь более раннюю версию, даже если текущая версия больше не существует. Лучший помощник в такой ситуации — команда git checkout.
Команда git checkout
имеет несколько назначений, но в следующем упражнении мы используем ее для восстановления удаленного файла. Команда git checkout
обновляет файлы в рабочем дереве в соответствии с версией в индексе или указанном дереве.
Если вы случайно удалили файл, его можно восстановить, вернув версию из индекса в рабочее дерево с помощью этой команды:
git checkout -- <file_name>
Вы также можете извлечь файл из более ранней фиксации (обычно это головная фиксация другой ветви), но по умолчанию извлекается файл из индекса. Символы --
в списке аргументов служат для отделения фиксации от списка путей к файлам. В этом случае они не обязательны, но если бы у вас была ветвь с именем <имя_файла> (например, это может быть имя файла, над которым вы работаете в этой ветви), символы --
позволили бы избежать путаницы.
Далее вы узнаете, что команда checkout
также служит для переключения ветвей.
Восстановление файлов: git reset
Кроме того, файл можно удалить с помощью команды git rm
. При этом, помимо удаления файла с диска, Git также записывает удаление файла в индексе.
Поэтому если вы выполнили следующую команду:
git rm index.html
git checkout -- index.html
Git не удастся восстановить файл index.html. Вместо этого возникнет следующая ошибка:
error: pathspec 'index.html' did not match any file(s) known to git.
Чтобы восстановить файл index.html, придется использовать другой прием: git reset
. С помощью команды git reset
можно отменять подготовку изменений.
Файл index.html можно восстановить с помощью следующих двух команд:
git reset HEAD index.html
git checkout -- index.html
Команда git reset
отменяет подготовку удаления файла в Git. В результате файл возвращается в индекс, но на диске его по-прежнему нет. Затем его можно восстановить на диске из индекса с помощью команды git checkout
.
Это еще одна непривычная особенность для новых пользователей Git. Многие системы управления версиями делают файлы доступными только для чтения, чтобы вносить изменения одновременно мог только один пользователь. Для получения доступной для записи версии используется не связанная команда checkout
. В них также применяется команда checkin
для достижения результата, который в Git достигается с помощью сочетания команд add
, commit
и push
. Это иногда приводит к путанице, когда пользователи только начинают осваивать Git.
Отмена фиксации: git revert
Последняя важная команда для исправления ошибок в Git — git revert
. Команда git checkout
применима только в тех случаях, когда отменяемые изменения существуют в индексе. После фиксации изменений для их отмены требуется другой подход. В данном случае мы можем использовать команду git revert
, чтобы отменить предыдущую фиксацию. Для этого выполняется другая фиксация, отменяющая предыдущую.
С помощью команды git revert HEAD
можно выполнить фиксацию, которая является полной противоположностью последней фиксации. В результате предыдущая фиксация отменяется с сохранением журнала в неизменном виде. Часть HEAD
в команде просто сообщает Git, что нужно отменить только последнюю фиксацию.
Помимо этого, последнюю фиксацию можно также удалить с помощью команды git reset
:
git reset --hard HEAD^
Git предлагает несколько типов сброса. По умолчанию используется метод --mixed
, который сбрасывает индекс, но не рабочее дерево. Он также перемещает головную фиксацию, если указана другая фиксация. Если указан параметр --soft
, перемещается только HEAD
, а индекс и рабочее дерево остаются без изменений. В результате все изменения остаются подлежащими фиксации, о чем сообщает команда git status
. При сбросе с параметром --hard
индекс и рабочее дерево изменяются в соответствии с указанной фиксацией; все изменения, внесенные в отслеживаемые файлы, отменяются.