Что вы делаете, когда объединяете разработку с мастером и есть коммит, который вы не хотите объединять с разработкой?

Как я уже сказал, что вы делаете, когда объединяете разработку с основной и есть коммит, который вы не хотите объединять с разработкой?

Есть вещи, которые мне нужны только в ветке разработки. и в конечном итоге наступит время, когда мне придется объединить разработку с мастером для развертывания. Можно ли вообще опустить те вещи, которые я хочу только в ветке разработки при слиянии?

Я думал, что это не должно быть слишком сложно решить, но теперь я думаю, что нужно больше информации.

Допустим, есть мастер, развиваем ветку. master предназначен для развертывания, и я не хочу объединять какие-либо неутвержденные коды. В ветке разработки я совершил 10 коммитов. скажем, f(функция) 1~10. функции 2,4,7 еще не протестированы, но другие коммиты необходимо объединить. И есть функция 1, которая добавляется только для разработки.

На один раз я могу выбрать f3,f5,f8,f9,f10. Но ветка разработки будет использоваться вечно, и в следующий раз, если я сольюсь, f1,2,4,7 будут объединены (хотя никто не может быть уверен, когда объединять 2,4,7, и никогда не захочет объединять 1).

Я просто хочу знать, какое общее решение для этого. Это не должно быть чем-то новым для разработчиков.

  • Как сказал Мэтт, для функции 1 я могу выбрать или объединить коммиты и отменить функцию 1. -> если функция 1 была объединена, можно ли что-нибудь сделать?

Вы можете просто выполнить слияние, а затем отменить этот коммит. Но потом вы не сможете объединить его позже.

matt 04.04.2024 03:46

Или вместо объединения разработки создайте ветку, состоящую только из нужных вам коммитов (путем их тщательного выбора), и объедините ее.

matt 04.04.2024 03:48

Имеет ли этот коммит отношение к конфигурации только для разработки?

Schwern 04.04.2024 04:35

@matt 1. что, если бы я объединил кучу коммитов и сквош? 2. слияние разработки было бы неизбежным. Мы не можем выбирать каждый коммит после коммита, который мне нужен только в разработке.

Hoon 04.04.2024 07:27

@ Schwern Речь идет, скажем, о функции, которая мне нужна только в ветке разработки.

Hoon 04.04.2024 07:27

@Hoon Вероятно, эту проблему лучше решить, улучшив управление конфигурацией. Либо поместив все это в среду, либо имея файлы конфигурации dev vs prod. Какая "фича" предназначена только для разработки? Функции предназначены для выпуска.

Schwern 04.04.2024 07:38

Исключение коммитов из слияния не должно происходить как обычное явление. Другими словами, не делайте слияние, при котором вы вручную удаляете некоторые изменения. Сделайте то, что было предложено: объедините все и затем вернитесь к master. Но если эта необходимость возникает регулярно, значит, что-то не так с вашим рабочим процессом. Рабочий процесс, в котором некоторые вещи исключены в master по сравнению с develop, в лучшем случае вызовет путаницу, а в худшем приведет к «ложным слияниям» (слияниям, которые на самом деле не включают в себя все).

Guildenstern 04.04.2024 11:10

«В ветке разработки я совершил 10 коммитов. Скажем, f(функция) 1~10. Функции 2,4,7 еще не протестированы», «Ну, вот в чем ваша проблема. Рассмотрим Рабочий процесс ветки функций.

Schwern 04.04.2024 19:42
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
8
86
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Допустим, ваш репозиторий выглядит так, и вы не хотите совершать коммит 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, которая добавляется только для разработки.

Это проблема. Хотя вы можете перетасовать коммиты, это быстро усложняется и приводит к ошибкам.

Не следует делиться ничем, что не было полностью протестировано. Никто не должен напрямую использовать общую ветку; они рискуют поделиться сломанным кодом (что усложнит работу каждого) или заблокировать выпуск.

Если вам это действительно не нужно, отдельной ветки разработки нет, есть только основная. Основная версия всегда поддерживается в высоком качестве и готова к выпуску.

Вся работа должна вестись в филиалах. Единицы работы должны быть небольшими, чтобы их ветви были короткими и объединялись как можно быстрее. Никакую работу нельзя объединять до тех пор, пока она не будет протестирована и не будет готова к выпуску. Это рабочий процесс ветки функций. Это очень просто, хорошо работает и представляет собой базовую технику, ведущую к более продвинутым.

См. Непрерывная интеграция, доставка или развертывание, чтобы узнать больше о том, как поддерживать высокое качество вашего кода и всегда быть готовым к выпуску.

Спасибо за решение. Если быть более конкретным, упомянутая мной функция — это симулятор устройства, который периодически генерирует фиктивные данные телеметрии и помещает данные в базу данных. Мне нужно, чтобы это работало в ветке разработки, и в мастере нет необходимости в симуляторе. Фиксация и отмена связанной фиксации — это то, что обычно делают ИТ-разработчики в компаниях?

Hoon 04.04.2024 07:54

У меня 30-летний опыт программирования, и я никогда не видел такого подхода к исключению чего-либо — весь используемый код должен находиться в основной ветке. В зависимости от вашего языка программирования вы можете исключить определенные части кода, например, имея отдельные конфигурации сборки отладки и выпуска. Или у вас есть файл настроек или .env, который включает и выключает это.

Peter Pointer 04.04.2024 09:43

@Hoon Вы фактически включаете и исключаете тестовые данные из своей системы контроля версий. Это неправильный подход, ИМХО. Вы обрабатываете тестовые данные самым сложным из возможных способов (насколько я знаю).

Guildenstern 04.04.2024 11:12

@Peter Pointer Спасибо за комментарии. Это была своего рода информация, которую я искал. Мне было интересно, как опытные разработчики справляются с такого рода ситуациями. Это очень помогло.

Hoon 04.04.2024 12:12

@Hoon Спасибо, что рассказали нам всю проблему. Я добавил гораздо лучшее решение к своему ответу.

Schwern 04.04.2024 20:05

Другие вопросы по теме