Як найкращі практики Git врятували мене години переробки

Нещодавно я працював над завданням модернізувати сертифікат для програми NodeJS. Це було востаннє торкнулося два роки тому для покращення функції. Будь-яка реальна проблема, піднята до цього додатка, потребує негайної уваги, хоча ця програма використовується лише внутрішньо.

Додаток старий. Модулі Core-NodeJS-Infra не оновлювалися більше двох років. Служби внизу потоку застаріли. Змінюється спосіб, яким ми викликаємо сервіси нижче. Щільний термін - вишня на торті. Я знав, що це буде їзда на американських гірках.

Я витратив три дні на запуск програми.

Оновлено інфраструктурні модулі? Перевірка.

Нижчі служби працюють нормально? Перевірка.

Потоки інтерфейсу працюють нормально? Перевірка.

Один з членів нашої команди торкнувся програми для оновлення понад рік тому. Він зазначив, що репо, звідки я роздвоювався, - це само роздвоєне репо. Якась інша команда працювала над цим репо, а потім наша команда працювала над оригінальним репо з цього моменту - але мій член команди не знає з якого моменту далі. Так це було трохи безладу!

У нас є інструмент "Власність", який показує правильну репо-репортаж і він мені "брехав". Тож ситуація була така:

Форкцепція

Так, це був Forkception! WTF і FML були першими двома думками, що вийшли з моїх уст. Я мав би працювати над репо в прямому ефірі, але натомість я працював на вилці, яка була черствою. Як мені дурно!

Перша думка - мої три дні роботи були витрачені даремно, і мені потрібно почати по-новому.

Друга думка? Дозвольте запитати свого старого друга Гіта. Він мені дуже давно допомагає.

Я - "Гей, Гіт? У мене виникають великі проблеми, і мені потрібна ваша допомога, щоб вирішити це питання ".

Гіт - "Гей! Гаразд, тому ми повинні почати з того, що є в прямому ефірі. Створіть нову гілку, яка називається оновленням, та вкажіть її на код живого коду. Ви можете використовувати для цього жорсткий скидання git. "

Я - «Добре, буду».

На даний момент ситуація виглядає приблизно так.

Використання функцій Git

Git - «Ми повинні знати, що змінилося між розробкою та оновленням. Чи можете ви перерахувати файли, які відрізняються між вашим оновленням та розробкою? Перевірте ці файли окремо і з’ясуйте, які зміни відбулися ».

Я - «Класно. Я бачу три види змін. Є служба S1, яку мені потрібно зателефонувати по-іншому. Є служба S2, яку мені потрібно зателефонувати, використовуючи іншу кінцеву точку. Є служба S3, яку мені потрібно зателефонувати, використовуючи різні параметри. Я також бачу, що у файлі package.json у гілці оновлення є частина оновлених пакетів. Тож потрібно змінити лише кілька пакетів ».

Git - "Дивовижно, що ви розділили зміни. Тепер покажіть мені журнал Git вашої галузі розвитку. Сподіваємось, ви дотримувались деяких основних методів Git, наприклад, завжди маючи вбудований код у кожній комісії. Повідомлення про вчинення повинно зображати те, що ви змінили. "

Git журнал на розробці галузі

Я - «Так, у мене в цілому чотири комісії в галузі розвитку. Одним із зобов’язань було зробити проект можливим. Для кожного з трьох службових дзвінків є один. "

Git - «Ідеально! Схоже, ви належним чином дотримувались найкращих практик. Почнемо зі стабілізації побудови проекту, вдосконалюючи package.json. Оформити замовлення до гілки оновлення та скласти копію пакета package.json - package-copy.json. Тепер, використовуючи заміну Git, оновіть / package.json з develo / package.json та запустіть diff між package.json та package-copy.json. Оскільки в реальному коді деякі пакети вже змінені та мають різні версії, вам потрібно буде оновити, переглянувши розл. "

Зробити проект готовим до розробки

Я - «Дозвольте спробувати. Гаразд, він працює і працює ».

Гіт - "Дивовижно! Тепер давайте попрацюємо над службовими дзвінками. Я бачу, що у вас є одна комісія на кожну зміну виклику послуги у галузі розвитку. Час до вишні. Виберіть найменш складний дзвінок служби до найскладнішого виклику служби. Виберіть, об’єднайте та вирішіть конфлікти. Переконайтеся, що проект перебуває в стані забудови після кожного вишню та перед кожним вчиненням. "

Я - "S1 зроблено. S2 зроблено. S3 зроблено. Спасибі, Гіт »

Git - "Вас вітають. Але саме ви допомогли собі, дотримуючись практики вчинення Git, а не трактуючи Git як просто зберігання коду ».

Що я тут зробив?

Внести пов'язані зміни

На хвилину зробіть паузу і подумайте, чи повинна ця зміна входити в цю комісію. Послідовність, яка говорить про те, що "зміни: кінцеві точки сервісу-s1" і зміни в службі-s2, просто створить плутанину.

Не займайтеся напівзробленою роботою

Ми часто чули мантру «вчиняти рано, вчиняти часто». У наведеному вище прикладі ви можете мати один комітет для різних кінцевих точок однієї служби. Це називається виготовлення ковбас.

Однак я особисто пригнічую свої невеликі зобов'язання, використовуючи інтерактивний режим git rebase. Це допомагає мені здійснити одну логічну зміну, яка може бути сертифікована, і це допомагає довіреному комітету переглянути і ваш код. Це набагато краще для масштабних проектів.

Перевірте свій код, перш ніж взяти на себе зобов’язання

Ми повинні думати про Git як про державну машину, і будь-яка машина повинна бути у складному стані в будь-якому штаті.

Напишіть гарні повідомлення про фіксацію

Це найважливіша частина. Я завжди на мить замовчуюсь і замислююся, чи зможу я зрозуміти - через три місяці - виду зміни цього зобов’язання, просто переглянувши повідомлення про виконання.

Висновок

Мені вдалося швидко розв’язати безлад. Я міг вийти з цього моменту WTF та FML лише тому, що дотримувався деяких добрих практик. Вони існують чомусь і є як сіль у їжі - ви розумієте їх цінність лише тоді, коли їх не вживають.

Помилки відбудуться рано чи пізно, несвідомо. Але переконайтесь, що ви свідомо слідуєте деяким практикам навколо Git.

Я прихильник Git-семантичних повідомлень, які допомагають орієнтуватися в історії Git. Тому що, будьмо чесними, ви не можете сподіватися, що всі будуть використовувати однакові слова для кожного повідомлення про вчинення. Однак, типу повідомлення можна очікувати.

Це допомагає переконатися, що після кожного вчинення ваш проект може бути побудований - що справді корисно.

VSCode має підтримку для Git. Побачити конфлікти та вирішити їх стає дуже просто, іноді лише одним клацанням миші. Дивіться приклад нижче

Список літератури

  • Найкращі практики Git
  • Супер чудова інтеграція управління версіями в VSCode
  • Повідомлення Git Semantic Comm
  • Підказка it: Як "об'єднати" конкретні файли з іншої гілки
  • Порада Git : Git - Документація git-cherry-pick
  • Порада Git : Git - Документація про скидання git

Особлива подяка моїм друзям Саурабху Раджані та Анішу Дхаргалкару, які допомогли мені в удосконаленні вмісту.