Blog logotype

Learn Git. How to Backtrack. Codecademy на русском

1. Backtracking Intro

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

Чтобы начать, давайте рассмотрим основную работу с Git.

Инструкция

  1. У вас есть Git-проект под названием hamlet-prince-of-denmark. В редакторе кода вы должны работать с scene-5.txt. Там Гамлет встречает призрака отца. Добавьте следующий текст: Ghost: My hour is almost come, When I to sulphurous and tormenting flames Must render up myself.
  2. Через терминал проиндексируйте файл scene-5.txt
  3. Закоммитьте изменения в репозиторий с хорошим коммит-сообщением.

2. Head Commit

В Git-е коммит, в котором вы находитесь в настоящее время, известен как HEAD-коммит. В большинстве случаев, HEAD-коммит является последним коммитом.

Чтобы узнать HEAD-коммит, наберите git show HEAD

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

Инструкция

  1. Наберите команду, показывающий HEAD-коммит. Обратите внимание на выходные данные - последние добавленные слова Призрака (Ghost) в файле отмечен зелённым цветом.

3. Git Checkout

А что если мы сделали изменения в файл (добавили линии) в рабочей директории, но потом решили отменить эти изменения?

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

Здесь filename это название файла, который мы хотим восстановить. Если файл назывался бы changes.txt, то команда выглядела бы так: git checkout HEAD changes.txt

Инструкция

  1. В этот раз заменим слова. Вот забавное предложение: Ghost: My hour is almost come, When I to sulphurous and tormenting balloons Must render up myself. [Забавность в следующем - Призрак говорил: Уж близок час мой, Когда в мучительный и серный пламень Вернуться должен я.
    Теперь же мы заменили слово пламень на воздушный шар (budums)]
  2. В терминале используя команду git diff посмотрите различия между рабочим каталогом и последним коммитом. Чтобы выйти из диалога diff нажмите q.
  3. Исползуя новоизученную Git-команду восстановите файл в рабочем каталоге так, как он выглядел в последнем коммите. Обратите внимание, что те изменения слов Призрака, которые вы сделали в сбросятся.

4. More Git Add

В проекте Гамлета мы работаем с пятью файлами. В Git-е можно изменять много файлов, индексировать их и добавлять в один коммит.

Например, скажем, вы захотели поменять героя "ЛАРРИ("LARRY") на "ЛАЭРТ"("LAERTES") в сценарии. Сейчас это имя используется в двух файлах. После того, как вы поменяли это имя в обоих файлах, вы сможете проиндексировать их с помощью команды: git add filename_1 filename_2. Заметьте, что слово filename ссылается на имя файла, который вы хотите проиндексировать.

Инструкция

  1. В редакторе откройте два файла: scene-3.txt и scene-7.txt. В scene-3.txt везде замените "LARRY" на "LAERTES".
  2. То же самое сделайте и в scene-7.txt.
  3. Проиндексируйте оба файла используя одну git-команду.

5. Git Reset II

Отлично! Файлы проиндексированы и принадлежат одному коммиту.

Что если до того как мы сделаем коммит, мы случайно удалим scene-2.txt?

Будет довольно глупо индексировать scene-2.txt, так как он не связан с заменой Larry/Laertes и его не хочется включать в наш коммит.

Мы можем отменить индексирование файла используя команду git reset HEAD filename

Данная команда сбрасывает файл из индекса, чтобы оставаться в HEAD-коммите. Это не значит что изменения файла сбрасываются, просто файл удаляется из индекса.

Инструкция

  1. Чтобы попробовать эту комманду, давайте сделаем ошибку нарочно!
    В редакторе кода откройте scene-2.txt. Удалите какую-нибудь строчку и нажмите Run.
  2. Через терминал проиндексируйте файл scene-2.txt.
  3. Проверьте статус Git-проекта. В результате мы увидим сообщение scene-2.txt “Changes to be committed”. Т.е. изменения в файле должны быть закоммитчены.
  4. Используя новую Git-комманду сбросьте из индекса файл scene-2.txt. Обратите внимание на выходные данные "Unstaged changes after reset" (не индексированные изменения после сброса):
    M scene-2.txt
    • M - это коротко "modification"(изменение).
  5. Теперь изменения в scene-2.txt снова не проиндексированы и теперь всё готово, чтобы сделать коммит. Через терминал сделайте коммит, чтобы сохранить замену Larry/Laertes в репозитории hamlet.

6. Git Reset I

Создание проекта - это как поход в тёмный лес. Иногда Вы неверно поворачиваете, затем снова неверно поворачиваете. Затем вы узнаёте, что окружены медведями.

Git позволяет нам "перемотать" до того места, где вы сделали неверный поворот и создать новый путь вашего проекта. Это можно сделать с помощью команды git reset SHA

Это команда работает с первыми семью символами SHA предыдущего коммита. Например, если SHA предыдущего коммита 5d692065cf51a2f50ea8e7b19b5a7ae512f633ba, то команда будет выглядить так: git reset 5d69206

Инструкция

  1. Через терминал узнайте историю коммитов. Примечание: если курсор мигает, то есть вы находитесь в git-log mode, нажмите q, чтобы выйти из него.
  2. Через терминал наберите команду reset к предыдущему коммиту, используя первые семь символов последнего коммита из логов.
    Теперь снова посмотрите логи коммитов.
    Заметили что-нибудь интересного? Коммиты, которые мы сбросили, пропали. Теперь HEAD-коммит переназначен. Вы просто изменили историю.

7. Git Reset Review

Чтобы лучше понять git reset commit_SHA, посмотрите на диараму справа. Каждый кружок означает коммит.

До сброса:

  • HEAD - это последний коммит.

После сброса:

  • HEAD переходит на предыдущий коммит вашего выбора
  • Серые коммиты больше не являются частью вашего проекта
  • С сущности вы перематываете историю вашего проекта

Итоги

Наши поздравления! Вы изучили три разных способа отката в Git-е. Вы можете использовать эти навыки, чтобы отменить изменения, внесённые в Git-проект.

Воспользуемся моментом, и рассмотрим изученные команды:

  • git checkout HEAD filename: отменяет изменения, сделанные в рабочем каталоге.
  • git reset HEAD filename: сбрасывает файл из индекса.
  • git reset SHA: сброс до предыдущего коммита в вашей коммит-истории.

Дополнительно, вы изучили как индексировать сразу несколько файлов с помощью команды: git add filename_1 filename_2