Позвольте мне ответить на ваши вопросы прямо и четко:
Наша проблема связана с долгосрочными боковыми ветвями - в тех случаях, когда несколько человек работают на боковой ветке, которая отделяется от мастера, мы развиваемся в течение нескольких месяцев, и когда мы достигаем вехи, мы синхронизируем их.
Вы обычно не хотите оставлять свои филиалы несинхронизированными в течение нескольких месяцев.
В вашей ветви функций что-то ответвляется в зависимости от вашего рабочего процесса; давайте просто назовем это masterради простоты. Теперь, когда вы берете на себя обязательство, вы можете и должны git checkout long_running_feature ; git rebase master. Это означает, что ваши ветви, по замыслу, всегда синхронизированы.
git rebaseздесь тоже правильно делать. Это не хак или что-то странное или опасное, но совершенно естественное. Вы теряете один бит информации, который является «днем рождения» ветки функций, но это все. Если кто-то считает, что это важно, это можно сделать, сохранив его где-то еще (в вашей системе тикетов, или, если необходимость велика, в git tag...).
Теперь, ИМХО, естественный способ справиться с этим - раздавить боковую ветвь в один коммит.
Нет, вы абсолютно не хотите этого, вы хотите коммит слияния. Коммит слияния также является «единым коммитом». Каким-то образом он не вставляет все отдельные ветвления в "master". Это один коммит с двумя родителями - masterглавой и главой филиала во время слияния.
Обязательно укажите --no-ffопцию, конечно; --no-ffв вашем случае строго запрещается слияние без . К сожалению, --no-ffне по умолчанию; но я верю, что есть вариант, который вы можете установить. Посмотрите, git help mergeчто --no-ffделает (вкратце: это активирует поведение, которое я описал в предыдущем абзаце), это очень важно.
мы не собираемся задним числом сбрасывать месяцы параллельного развития в историю мастера.
Абсолютно нет - вы никогда не вносите что-то «в историю» какой-либо ветки, особенно если вы не делаете коммит слияния.
И если кому-то нужно лучшее разрешение для истории боковой ветки, ну, конечно, это все еще там - это просто не в мастерской, это в боковой ветке.
С коммитом слияния, он все еще там. Не в мастере, а в боковой ветке, отчетливо видимой как один из родителей коммитта слияния, и хранящейся в вечности, как и должно быть.
Видишь, что я наделал? Все, что вы описываете для своего коммита сквоша, тут же с --no-ffкоммитом слияния .
Вот проблема: я работаю исключительно с командной строкой, но остальная часть моей команды использует GUIS.
(Примечание: я почти исключительно работаю и с командной строкой (ну, это ложь, я обычно использую emacs magit, но это другая история - если я не в удобном месте с моей индивидуальной настройкой emacs, я предпочитаю команду линии, а). Но, пожалуйста , одолжение и попробовать хотя бы git guiодин раз. это так гораздо более эффективным для выбора линий, ломти и т.д. для добавления / расстегивать добавляет.)
И я обнаружил, что GUIS не имеет разумной опции для отображения истории из других веток.
Это потому, что то, что вы пытаетесь сделать, полностью противоречит духу git. gitстроится из ядра на «ориентированном ациклическом графе», что означает, что много информации находится в родительских-дочерних отношениях коммитов. А для слияний это означает, что истинное слияние совершается с двумя родителями и одним ребенком. Графический интерфейс ваших коллег будет в порядке, как только вы используете 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, ваши коллеги и остальной мир, каждый день?
Есть ли у нас здесь какой-либо вариант, кроме постоянного слияния боковых веток в master с помощью merge-commits? Или есть причина, по которой постоянное использование merge-commits не так плохо, как я боюсь?
Других вариантов нет; не так плохо