Упражнение. Использование GIT для исправления ошибок

Завершено

Теперь давайте попрактикуемся в устранении ошибок.

Восстановление удаленного файла на практике

  1. Сначала попробуйте удалить файл index.html:

    rm index.html
    

    Это может показаться рискованным, но помните, что Git всегда подстрахует вас!

  2. Выполните команду ls, чтобы убедиться в том, что файл index.html удален:

    ls
    
  3. Вы должны увидеть следующие выходные данные. Заметьте, что файла index.html нет.

    CSS
    
  4. Давайте восстановим файл index.html. Используйте команду git checkout, чтобы вернуть файл index.html:

    git checkout -- index.html
    
  5. Еще раз выполните команду ls, чтобы проверить содержимое текущего каталога. Восстановился ли файл index.html?

    Да! Теперь в выходных данных должен быть указан файл index.html и каталог CSS:

    CSS  index.html
    

Восстановление удаленного файла: git rm

Когда требуется восстановить удаленные файлы, сделать это становится сложнее, если удалить их с помощью git rm вместо rm.

  1. Чтобы убедиться в этом, попробуйте выполнить такую команду:

    git rm index.html
    
  2. Снова найдите index.html, выполнив команду ls. Вы не должны видеть файл index.html.

  3. Попробуйте восстановить index.html так же, как и в прошлый раз:

    git checkout -- index.html
    
  4. На этот раз Git сообщает, что ничего не знает о файле index.html. Причина в том, что система Git не только удалила файл, но и записала его удаление в индекс:

    error: pathspec 'index.html' did not match any file(s) known to git.
    
  5. Отмените подготовку удаления index.html с помощью команды git reset:

    git reset HEAD index.html
    
  6. Просмотрите следующие выходные данные, подтверждающие это:

    Unstaged changes after reset:
    D       index.html
    
  7. Теперь можно восстановить файл из индекса с помощью ранее использовавшейся команды:

    git checkout -- index.html
    

    Команда git reset отменила подготовку изменения, но файл был по-прежнему удален, поэтому, чтобы вернуть его, потребовалась команда checkout.

  8. Перепроверьте, что это сработало, выполнив команду ls.

Отмена фиксации

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

Одно из решений этой проблемы — отмена предыдущей фиксации.

  1. Откройте файл index.html с помощью code:

    code index.html
    
  2. Замените содержимое файла index.html следующим кодом:

    <h1>That was a mistake!</h1>
    
  3. Сохранить и закрыть файл.

  4. Выполните следующие команды, чтобы зафиксировать изменения и вывести последнюю фиксацию:

    git commit -m "Purposely overwrite the contents of index.html" index.html
    git log -n1
    

    Флаг -n1 сообщает Git, что нам нужна только самая последняя фиксация.

  5. Используйте следующие команды, чтобы попытаться восстановить файл index.html:

    git checkout -- index.html
    
  6. Откройте index.html в редакторе:

    code index.html
    

    Какую версию файла index.html вы видите? Старую или новую?

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

  7. Закройте файл и отмените зафиксированные изменения с помощью команды git revert:

    git revert --no-edit HEAD
    

    Флаг --no-edit сообщает Git, что добавлять сообщение о фиксации для этого действия не нужно.

  8. Просмотрите выходные данные . Они должны выглядеть, как показано ниже:

    [main 6a27310] Revert "Purposely overwrite the contents of index.html"
    1 file changed, 13 insertions(+), 1 deletion(-)
    
  9. Далее выполните команду git log, чтобы вывести последнюю фиксацию:

    git log -n1
    
  10. Снова просмотрите выходные данные. Они должны выглядеть так, как показано в этом примере:

    Author: User Name <user-name@contoso.com>
    Date:   Tue Nov 19 23:42:26 2019 +0000
    
    Revert "Purposely overwrite the contents of index.html"
    
    This reverts commit 15d3bded388470c98881a632025bc15190fe9d17.
    
  11. Наконец, откройте файл index.html, чтобы убедиться в том, что это правильная версия содержимого.

Отмена — это не единственный способ устранения такой проблемы. Можно просто внести изменения в index.html и зафиксировать исправленный файл. Однако это не так легко, если зафиксированных изменений было много. В любом случае команда git revert лучше подходит для данной цели.