10 речей, які я ненавиджу в Git

Конфіденційність та файли cookie

Цей сайт використовує файли cookie. Продовжуючи, ви погоджуєтесь на їх використання. Дізнайтеся більше, зокрема, як керувати файлами cookie.

блоги

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

1. Складна інформаційна модель

Інформаційна модель складна - і ви повинні знати її всю. Як орієнтир розглянемо Subversion: у вас є файли, робочий каталог, сховище, версії, гілки та теги. Це майже все, що вам потрібно знати. Насправді гілки - це теги та файли, про які ви вже знаєте, тому вам дійсно потрібно вивчити три нові речі. Версії лінійні, з непарним злиттям. Тепер Git: у вас є файли, робоче дерево, індекс, локальне сховище, віддалене сховище, пульти (вказівники на віддалені сховища), коміти, дерева (вказівники на коміти), гілки, схованка ... і вам потрібно знати все цього.

2. Божевільний синтаксис командного рядка

Синтаксис командного рядка абсолютно довільний і непослідовний. Деякі "ярлики" прикрашаються командами верхнього рівня: "git pull" точно еквівалентно "git fetch", за яким слідує "git merge". Але ярлик для “git branch” у поєднанні з “git checkout”? “Git checkout -b”. Вказівка ​​імен файлів повністю змінює семантику деяких команд (“git commit” ігнорує локальні, нестадійні зміни у foo.txt; “git commit foo.txt” - ні). Різні варіанти “git reset” роблять абсолютно різні речі.

Найбільш вражаючим прикладом цього є команда "git am", яка, наскільки я можу зрозуміти, - це те, що Лінус зламав і змусив до основної кодової бази вирішити проблему, яку він мав однієї ночі. Він поєднує читання електронної пошти із застосуванням виправлення, і, отже, використовує інший синтаксис виправлення (зокрема, такий із заголовками електронної пошти вгорі).

3. Скандальна документація

Сторінки з людьми - це одне всемогутнє "нахуй". Вони описують команди з точки зору інформатика, а не користувача. Приклад:

git-push - Оновлення віддалених посилань разом із пов’язаними об’єктами

Ось опис для людей: git-push - завантажте зміни з локального сховища у віддалене сховище

Оновлення, інший приклад: (спасибі cgd)

git-rebase - локальний коміт переадресації порту до оновленої верхівки вище

Переклад: git-rebase - послідовно регенерувати серію комітів, щоб їх можна було застосувати безпосередньо до головного вузла

4. Розповсюдження інформаційної моделі

Пам'ятаєте складну інформаційну модель на кроці 1? Він продовжує зростати, як рак. Продовжуйте використовувати Git, і більше концепцій час від часу випадатимуть з неба: посилання, теги, перезапис, комміти вперед, відключений стан голови (!), Віддалені гілки, відстеження, простори імен

5. Дірява абстракція

  1. Знайдіть основу злиття між вашою гілкою та майстром: ‘git merge-base master yourbranch’
  2. Припускаючи, що ви вже внесли свої зміни, перебазуєте своє комітування на базу злиття, а потім створіть нову гілку:
  3. git rebase - to HEAD

1 ГОЛОВА

  • git checkout -b моя-нова-гілка
  • Оформіть свою гілку ruggedisation і видаліть щойно перебазований коміт: ‘git reset –hard HEAD

    1 ’

  • Об’єднайте свою нову гілку назад у міцність: „git merge my-new-branch”
  • Checkout master (‘git checkout master’), об’єднайте нову гілку в (‘git merge my-new-branch’) і перевірте, чи працює вона при об’єднанні, а потім видаліть об’єднання (‘git reset –hard HEAD

    1 ’).

  • Натисніть нову гілку («git push origin my-new-branch») і зареєструйте запит на витяг.
  • 6. Потужність для супровідника, за рахунок внеска

    Більша частина потужності Git спрямована прямо на тих, хто підтримує кодові бази: людей, яким доводиться об’єднувати внески з великої кількості різних джерел, або яким доводиться забезпечувати ряд зусиль паралельного розвитку в результаті єдиного, послідовного, стабільного випуску. Це добре. Але більшість користувачів Git не в такій ситуації: вони просто пишуть код, часто на одній гілці протягом місяців. Git - це кавоварка для еспресо з двома котелками з 4 ручками - коли все, що їм потрібно, моментально.

    Цікаво, що я не думаю, що цей компроміс притаманний дизайну Git. Це просто результат ігнорування потреб звичайних користувачів і плутанини архітектури з інтерфейсом. "Git is good" вірно, якщо говорити про архітектуру, але помилково щодо інтерфейсу користувача. Хтось цілком міг би написати вдосконалений інтерфейс (easygit - це початок), який приховує непотрібну складність, таку як індекс та локальне сховище.

    7. Небезпечний контроль версій

    Фундаментальна обіцянка будь-якої системи контролю версій полягає в наступному: «Як тільки ви помістите сюди свій дорогоцінний вихідний код, це безпечно. Ви можете вносити будь-які вподобані зміни, і завжди можете повернути їх назад ”. Git порушує цю обіцянку. Кілька способів, за допомогою яких комітер може безповоротно знищити вміст сховища:

    1. git add./.../git push -f master master
    2. git push origin + master
    3. git rebase -i/git push

    8. Навантаження на підтримку VCS покладено на учасників

    У традиційному проекті з відкритим кодом лише одна людина повинна була мати справу зі складністю гілок та злиттів: супровідник. Всім іншим залишалося лише оновлювати, фіксувати, оновлювати, фіксувати, оновлювати, фіксувати ... Git покладає тягар розуміння складного контролю версій на всіх - одночасно полегшуючи роботу супровідника. Чому ви робите це для нових учасників - тих, у кого нічого не вкладено в проект, і кожен стимул підняти руки і піти?

    9. Історія Git - це купа брехні

    Первинним результатом роботи з розробки повинен бути вихідний код. Чи справді добре ведена історія є настільки важливим побічним продуктом? Більшість аргументів для перебазування, зокрема, спираються на естетичні судження про "брудні злиття" в історії або "нечитабельні журнали". Тож rebase закликає брехати, щоб надати іншим розробникам «чисту», «захаращену» історію. Безумовно, правильним рішенням є кращий вихід журналу, який може відфільтрувати ці небажані злиття.

    10. Для простих завдань потрібно стільки команд

    Якщо ваші зміни передбачають створення нових файлів, є хитрий додатковий крок:

    1. Внесіть деякі зміни
    2. svn додати
    3. svn коміт

    Для проекту, розміщеного на Github, наступним є в основному мінімальний мінімум:

    1. Внесіть деякі зміни
    2. git add [не плутати зі svn add]
    3. git коміт
    4. git push
    5. Ваші зміни ще лише на півдорозі. Тепер увійдіть до Github, знайдіть свій коміт і видайте “запит на витягування”, щоб хтось нижче за течією зміг його об’єднати.

    Насправді, супровідник проекту, розміщеного на Github, напевно, віддасть перевагу вашим змінам у гілках функцій. Вони попросять вас працювати так:

    1. git checkout master [щоб переконатися, що кожна нова функція починається з базової лінії]
    2. git checkout -b newfeature
    3. Внесіть деякі зміни
    4. git add [не плутати зі svn add]
    5. git коміт
    6. git push
    7. Тепер увійдіть до Github, перейдіть до вашої нової гілки функції та видайте “запит на витягування”, щоб супровідник об’єднав його.

    Як додатковий бонус, ось схема, що ілюструє команди, які типовий розробник традиційного проекту Subversion повинен знати про те, щоб виконати свою роботу. Це хліб і масло VCS: перевірка сховища, внесення змін та отримання оновлень.

    Команди та поняття «Хліб та масло», необхідні для роботи з віддаленим сховищем Subversion.

    А тепер ось, з чим потрібно боротися для типового проекту, розміщеного в Github:

    Команди та поняття "хліб та масло", необхідні для роботи з проектом, розміщеним у Github.

    Якщо сила Git - це складне розгалуження та злиття, то його слабкою стороною є складність простих завдань.

    Оновлення (3 серпня 2012 р.)

    Ця публікація, очевидно, вразила нерви і отримує великий трафік. Думаю, я звернуся до найпоширеніших коментарів.

    Кілька невідповідностей команд бонусів:

    Скидання/оформлення замовлення

    Щоб скинути один файл у вашому робочому каталозі до стану його фіксації:

    Щоб скинути кожен файл у вашому робочому каталозі до його зафіксованого стану:

    Пульти та відділення

    Існує ще одна команда, де роздільником є ​​віддалене ім’я: ім’я гілки, але я зараз не згадую.

    Параметри команд, які є практично обов'язковими

    І нарешті, список команд, які я помітив, майже безглузді без додаткових опцій.