Дозвольте мені прямо і чітко відповісти на ваші моменти:
Наша проблема стосується довгострокових бічних гілок - типу, коли у вас є декілька людей, які працюють на бічній гілці, яка розпадається від майстра, ми розробляємо протягом декількох місяців, і коли ми досягнемо важливої віхи, ми синхронізуємо їх.
Зазвичай ти не хочеш відпускати свої гілки безсистемними місяцями.
Ваша галузева функція розгалужується чимось залежно від вашого робочого процесу; давайте просто назвемо це masterзаради простоти. Тепер, коли ви берете на себе зобов’язання, ви можете і повинні git checkout long_running_feature ; git rebase master. Це означає, що ваші гілки за задумом завжди синхронізовані.
git rebaseтут також правильно робити. Це не хак чи щось дивне чи небезпечне, але абсолютно природне. Ви втрачаєте один шматочок інформації, який є "днем народження" гілки функцій, але це все. Якщо хтось вважає, що це важливо, це можна отримати, зберігаючи його десь в іншому місці (у вашій системі квитків, або, якщо потреба велика, у git tag...).
Тепер, ІМХО, природний спосіб впоратися з цим полягає в тому, щоб розрізати бічну гілку в єдину комісію.
Ні, ви абсолютно не хочете цього, ви хочете зробити об'єднання. Здійснення об'єднання також є "єдиним зобов'язанням". Це, як-небудь, не вставляє всі окремі гілки, які здійснює "в" майстер. Це єдиний вчинок з двома батьками - masterголовою та керівником відділення на момент злиття.
Обов’язково вкажіть --no-ffваріант, звичайно; злиття без --no-ff, у вашому сценарії, категорично заборонено. На жаль, --no-ffце не за замовчуванням; але я вважаю, що ви можете встановити варіант, який робить це так. Дивіться, git help mergeщо --no-ffробить (коротше: це активізує поведінку, яку я описав у попередньому пункті), це дуже важливо.
ми не заднім числом скидаємо місяці паралельного розвитку в історію майстра.
Абсолютно ні - ви ніколи не кидаєте щось "в історію" якоїсь галузі, особливо не з об'єднанням.
І якщо комусь потрібна краща роздільна здатність для історії бічної гілки, ну, звичайно, це все ще є - це просто не в майстрі, це в бічній галузі.
З об'єднанням злиття воно все ще є. Не в господарях, а в бічній гілці, добре видно як один з батьків злиття, і зберігається на вічність, як належить.
Подивіться, що я зробив? Все, що ви описуєте для вашого сквош-комітету, є саме там, де відбувається злиття --no-ff.
Ось проблема: я працюю виключно з командним рядком, але решта моєї команди використовує GUIS.
(Побічне зауваження: я майже виключно працюю і з командним рядком (ну, це брехня, я зазвичай використовую emacs magit, але це вже інша історія - якщо я не в зручному місці зі своїми індивідуальними налаштуваннями emacs, я віддаю перевагу команді лінії, а). Але, будь ласка , ласку і спробувати хоча б git guiодин раз. це так набагато більш ефективним для вибору ліній, скибки і т.д. для додавання / розстібати додає.)
І я виявив, що в GUIS немає розумного варіанту відображення історії з інших галузей.
Це тому, що те, що ви намагаєтесь зробити, повністю суперечить духу git. gitбудується з ядра на "спрямованому ациклічному графіку", що означає, що багато інформації є у взаємозв'язку між батьком і дитиною комітів. А для злиття це означає, що справжнє злиття вчиняється з двома батьками та однією дитиною. GUI ваших колег буде добре, як тільки ви скористаєтеся no-ffоб'єднаннями.
Тож, якщо ви досягнете сквош-комітету, кажучи, що "цей розвиток вийшов з гілки XYZ", дуже сильно боліти подивитися, що там у XYZ.
Так, але це не проблема GUI, а компрес-сквош. Використання сквошу означає, що ви залишаєте функцію голову гілки звисати і створюєте абсолютно нову фіксацію master. Це розбиває структуру на два рівні, створюючи великий безлад.
Тому вони хочуть, щоб ці великі, довгі бічні напрямки розвитку об'єднувались завжди з об'єднанням.
І вони абсолютно праві. Але вони не «об'єднані в ", вони просто об'єднуються. Злиття - це дійсно врівноважена річ, вона не має переважної сторони, яка об'єднується "в" іншу ( git checkout A ; git merge Bточно така ж, як git checkout B ; git merge Aза винятком незначних візуальних відмінностей, як, наприклад, гілки обмінюються навколо git logтощо).
Вони не хочуть, щоб історія, яка не була одразу доступна з головного відділення.
Що цілком правильно. У той час, коли немає безперебійних функцій, у вас була б одна гілка masterз багатою історією, яка містила б у собі всі рядки фіксування функцій, які коли-небудь були, повертаючись до git initкомітету з початку часу (зауважте, що я спеціально уникав використовувати термін " гілки "в останній частині цього абзацу, оскільки історія в той час вже не є" гілками ", хоча графік фіксування був би досить галузевим).
Я ненавиджу цю ідею;
Тоді вас чекає біль, оскільки ви працюєте проти інструменту, який ви використовуєте. gitПідхід дуже елегантний і потужний, особливо в розгалуженнях / зливається області; якщо ви робите це правильно (як уже згадувалося вище, особливо --no-ffце стосується ), це скачує і перевершує інші підходи (наприклад, підривний безлад, який має паралельні структури каталогів для гілок).
це означає нескінченний, немислимий клубок історії паралельного розвитку.
Нескінченні, паралельні - так.
Немислимий, клубок - ні.
Але я не бачу, яка у нас альтернатива.
Чому б не працювати так, як це gitроблять винахідники , ваші колеги та інший світ щодня?
Чи є у нас тут якийсь варіант, окрім постійно злиття бічних гілок у головний з об'єднаннями? Або є причина, що постійно використовувати об'єднання-комміти не так вже й погано, як я боюся?
Немає інших варіантів; не так погано.