Дозвольте мені прямо і чітко відповісти на ваші моменти:
Наша проблема стосується довгострокових бічних гілок - типу, коли у вас є декілька людей, які працюють на бічній гілці, яка розпадається від майстра, ми розробляємо протягом декількох місяців, і коли ми досягнемо важливої віхи, ми синхронізуємо їх.
Зазвичай ти не хочеш відпускати свої гілки безсистемними місяцями.
Ваша галузева функція розгалужується чимось залежно від вашого робочого процесу; давайте просто назвемо це 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
роблять винахідники , ваші колеги та інший світ щодня?
Чи є у нас тут якийсь варіант, окрім постійно злиття бічних гілок у головний з об'єднаннями? Або є причина, що постійно використовувати об'єднання-комміти не так вже й погано, як я боюся?
Немає інших варіантів; не так погано.