Как я уже сказал, что вы делаете, когда объединяете разработку с основной и есть коммит, который вы не хотите объединять с разработкой?
Есть вещи, которые мне нужны только в ветке разработки. и в конечном итоге наступит время, когда мне придется объединить разработку с мастером для развертывания. Можно ли вообще опустить те вещи, которые я хочу только в ветке разработки при слиянии?
Я думал, что это не должно быть слишком сложно решить, но теперь я думаю, что нужно больше информации.
Допустим, есть мастер, развиваем ветку. master предназначен для развертывания, и я не хочу объединять какие-либо неутвержденные коды. В ветке разработки я совершил 10 коммитов. скажем, f(функция) 1~10. функции 2,4,7 еще не протестированы, но другие коммиты необходимо объединить. И есть функция 1, которая добавляется только для разработки.
На один раз я могу выбрать f3,f5,f8,f9,f10. Но ветка разработки будет использоваться вечно, и в следующий раз, если я сольюсь, f1,2,4,7 будут объединены (хотя никто не может быть уверен, когда объединять 2,4,7, и никогда не захочет объединять 1).
Я просто хочу знать, какое общее решение для этого. Это не должно быть чем-то новым для разработчиков.
Или вместо объединения разработки создайте ветку, состоящую только из нужных вам коммитов (путем их тщательного выбора), и объедините ее.
Имеет ли этот коммит отношение к конфигурации только для разработки?
@matt 1. что, если бы я объединил кучу коммитов и сквош? 2. слияние разработки было бы неизбежным. Мы не можем выбирать каждый коммит после коммита, который мне нужен только в разработке.
@ Schwern Речь идет, скажем, о функции, которая мне нужна только в ветке разработки.
@Hoon Вероятно, эту проблему лучше решить, улучшив управление конфигурацией. Либо поместив все это в среду, либо имея файлы конфигурации dev vs prod. Какая "фича" предназначена только для разработки? Функции предназначены для выпуска.
Исключение коммитов из слияния не должно происходить как обычное явление. Другими словами, не делайте слияние, при котором вы вручную удаляете некоторые изменения. Сделайте то, что было предложено: объедините все и затем вернитесь к master
. Но если эта необходимость возникает регулярно, значит, что-то не так с вашим рабочим процессом. Рабочий процесс, в котором некоторые вещи исключены в master
по сравнению с develop
, в лучшем случае вызовет путаницу, а в худшем приведет к «ложным слияниям» (слияниям, которые на самом деле не включают в себя все).
«В ветке разработки я совершил 10 коммитов. Скажем, f(функция) 1~10. Функции 2,4,7 еще не протестированы», «Ну, вот в чем ваша проблема. Рассмотрим Рабочий процесс ветки функций.
Допустим, ваш репозиторий выглядит так, и вы не хотите совершать коммит 3.
A - 1 - 2 - 3 - 4 - 5 [develop]
\
B - C [master]
Создайте новую ветку из разработки, удалите коммит, затем объедините.
Один из способов добиться этого — интерактивная перебазировка.
$ git switch develop
$ git branch tmp-develop
$ git switch tmp-develop
Удалите нежелательный коммит.
# The ~ means the first parent of commit 3
$ git rebase -i <commit 3>~
3 - 4 - 5 [develop]
/
A - 1 - 2 - 4 - 5 [tmp-develop]
\
B - C [master]
Затем объедините и удалите tmp-develop.
$ git switch master
$ git merge tmp-develop
$ git branch -d tmp-develop
3 - 4 - 5 [develop]
/
A - 1 - 2 - 4 - 5
\ \
B - C --------- M [master]
Однако если вам нужно делать это регулярно, это указывает на проблему в вашем процессе разработки.
ОБНОВЛЕНИЕ ...и есть.
Если быть более конкретным, упомянутая мной функция — это симулятор устройства, который периодически генерирует фиктивные данные телеметрии и помещает данные в базу данных. Мне нужно, чтобы это работало в ветке разработки, и в мастере нет необходимости в симуляторе.
Симулятор может и не нужен, но и удалять его тоже не нужно.
Обычно вся ваша тестовая инфраструктура хранится в master (теперь называемом «main»). Это позволяет любому разрабатывать и тестировать ваш код и упрощает весь процесс разработки. Код выпускается в отдельном процессе упаковки кода. Там вы можете удалить тестовый код, если это двоичный пакет. Если это проект с открытым исходным кодом, часто в нем упаковано все дерево исходного кода, тесты и все такое.
Альтернативно можно сделать симулятор устройства тестовой зависимостью. Либо ваш менеджер зависимостей устанавливает его, либо его необходимо установить вручную, как и любую другую стороннюю зависимость, например базу данных. Вас могут соблазнить подмодули, но они не заменяют управление зависимостями и часто доставляют больше хлопот, чем пользы.
Часто проекты предоставляют несколько файлов конфигурации для нескольких сред: разработки, тестирования и производства. Все они проверены. Они не содержат никаких секретов и настроек для каждого разработчика, таких как имена пользователей.
Секреты (ключи API или пароли) и подробная конфигурация (имена пользователей, имена хостов) помещаются в переменные среды , поэтому они никогда не сохраняются на диск и не могут быть случайно зафиксированы. В большинстве систем конвейеров развертывания есть способы безопасного хранения этих секретов, или вы можете использовать что-то вроде Vault.
Допустим, есть мастер, развиваем ветку. master предназначен для развертывания, и я не хочу объединять какие-либо неутвержденные коды. В ветке разработки я совершил 10 коммитов. скажем, f(функция) 1~10. функции 2,4,7 еще не протестированы, но другие коммиты необходимо объединить. И есть функция 1, которая добавляется только для разработки.
Это проблема. Хотя вы можете перетасовать коммиты, это быстро усложняется и приводит к ошибкам.
Не следует делиться ничем, что не было полностью протестировано. Никто не должен напрямую использовать общую ветку; они рискуют поделиться сломанным кодом (что усложнит работу каждого) или заблокировать выпуск.
Если вам это действительно не нужно, отдельной ветки разработки нет, есть только основная. Основная версия всегда поддерживается в высоком качестве и готова к выпуску.
Вся работа должна вестись в филиалах. Единицы работы должны быть небольшими, чтобы их ветви были короткими и объединялись как можно быстрее. Никакую работу нельзя объединять до тех пор, пока она не будет протестирована и не будет готова к выпуску. Это рабочий процесс ветки функций. Это очень просто, хорошо работает и представляет собой базовую технику, ведущую к более продвинутым.
См. Непрерывная интеграция, доставка или развертывание, чтобы узнать больше о том, как поддерживать высокое качество вашего кода и всегда быть готовым к выпуску.
Спасибо за решение. Если быть более конкретным, упомянутая мной функция — это симулятор устройства, который периодически генерирует фиктивные данные телеметрии и помещает данные в базу данных. Мне нужно, чтобы это работало в ветке разработки, и в мастере нет необходимости в симуляторе. Фиксация и отмена связанной фиксации — это то, что обычно делают ИТ-разработчики в компаниях?
У меня 30-летний опыт программирования, и я никогда не видел такого подхода к исключению чего-либо — весь используемый код должен находиться в основной ветке. В зависимости от вашего языка программирования вы можете исключить определенные части кода, например, имея отдельные конфигурации сборки отладки и выпуска. Или у вас есть файл настроек или .env, который включает и выключает это.
@Hoon Вы фактически включаете и исключаете тестовые данные из своей системы контроля версий. Это неправильный подход, ИМХО. Вы обрабатываете тестовые данные самым сложным из возможных способов (насколько я знаю).
@Peter Pointer Спасибо за комментарии. Это была своего рода информация, которую я искал. Мне было интересно, как опытные разработчики справляются с такого рода ситуациями. Это очень помогло.
@Hoon Спасибо, что рассказали нам всю проблему. Я добавил гораздо лучшее решение к своему ответу.
Вы можете просто выполнить слияние, а затем отменить этот коммит. Но потом вы не сможете объединить его позже.