Позвольте мне ответить на ваши вопросы прямо и четко:
Наша проблема связана с долгосрочными боковыми ветвями - в тех случаях, когда несколько человек работают на боковой ветке, которая отделяется от мастера, мы развиваемся в течение нескольких месяцев, и когда мы достигаем вехи, мы синхронизируем их.
Вы обычно не хотите оставлять свои филиалы несинхронизированными в течение нескольких месяцев.
В вашей ветви функций что-то ответвляется в зависимости от вашего рабочего процесса; давайте просто назовем это 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 не так плохо, как я боюсь?
Других вариантов нет; не так плохо