SkillGridИзучай computer science на практике

Git: отмена, история и ветки

Система контроля версий — это точка сохранения, которая никогда не забывает, зачем она была сделана. Она позволяет отменить изменение спустя недели и отвечает на вопрос, с которого начинается любая охота за багом: какое изменение это сломало?

13 мин · 42 XP

Ты изменил одну строку. Одну. И теперь весь сайт сломан: цены неверные, кнопки ничего не делают, а ты не помнишь, как эта строка выглядела раньше. Это самый обычный момент в программировании, и у него есть правильный ответ. Это не хорошая память и не Ctrl+Z. Это система контроля версий.

Простая версия отмены — это Ctrl+Z. Она работает примерно минуту, а потом заканчивается: ты закрываешь редактор, или перезаписываешь файл, или просто идёшь дальше, и история отмен исчезает. Ещё ты наверняка делал копии. Будем честны, как они выглядят: site-final.zip, site-final-2.zip, site-final-real.zip. Копии ничего не объясняют. Система контроля версий записывает каждое изменение вместе с тем, кто его сделал, когда и что он пытался сделать. Спустя недели ты всё ещё можешь точно узнать, что было в той строке и почему её изменили.

Коммит — это снимок всего проекта, сохранённый вместе с коротким сообщением. Это не разница между версиями и не копия одного файла: это состояние всего проекта в тот момент. Каждый коммит указывает на предыдущий, поэтому коммиты образуют цепочку — именно её и называют историей проекта.

9f1c2ab
   |
a17d3e0
   |
64b8f21
   |
  (start)

$ git diff 64b8f21 a17d3e0
--- a/cart.js
+++ b/cart.js
-  return net;
+  return net * (1 + VAT);
mainexperimentgit switch -c experimenttry the new idea, committhe site goes on working heregit switch maintwo lines of history, one project folder

Ветка — это отдельная линия истории, которая начинается от той, где ты находишься. Смысл в том, что она дешёвая: создать её — дело одного мгновения, и стоит она почти ничего, поэтому можно попробовать идею, не ставя на кон рабочий сайт. Если идея удалась, ты вливаешь ветку обратно в основную линию. Если нет — выбрасываешь ветку, и ничего из того, что работало, не изменилось. В команде это способ нескольким людям работать одновременно и не мешать друг другу: у каждого своя линия, а основная линия остаётся в состоянии, которое можно выпускать.

Конфликт слияния возникает, когда две ветки изменили одни и те же строки. Git отказывается угадывать и кладёт в файл обе версии, разделив их маркерами:

<<<<<<< HEAD
price = 19.00
=======
price = 21.00
>>>>>>> experiment

Практика

  1. Расставь по порядку честный путь от «оно сломано» обратно к «оно починено».

    Подсказки
    • Нельзя отменить то, что не было записано, поэтому всё начинается с сохранения.
    • Пользователи сначала получают работающий сайт; написать нормальное исправление и рассказать о нём остальным — после.

    15 XP

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

    Подсказки
    • Ветка помогает только если основная линия продолжает работать, пока ты экспериментируешь, — ради этого две линии и заводят.
    • Конфликт — это информация: он говорит, что два человека тронули одну строку, и решить, какая версия верна, может только человек.

    13 XP

  3. Ты собираешься сохранить изменение. Какое сообщение коммита действительно поможет тому, кто будет читать историю через три месяца?

    Подсказки
    • Спроси, что нужно следующему человеку, чтобы понять это изменение, не открывая код.
    • Полезное сообщение говорит, что изменилось и зачем; как это сделано, видно из самого кода.

    14 XP