#git #merge #squash
#git #слияние #squash
Вопрос:
Я хочу, чтобы для моего проекта был следующий рабочий процесс :
-
2 ветки: dev и master (я упрощаю этот вопрос, но на самом деле я также использую функции и выпускаю ветки)
-
Я фиксирую технические изменения в ветке разработчиков.
-
Когда я хочу выпустить новую большую версию, я объединяю dev в master, но без сохранения истории разработки. Я не хочу, чтобы в главной ветке было какое-либо техническое сообщение типа «Исправлена ошибка в blablabla». Я просто хочу, чтобы моя главная ветка показывала мне важные версии выпуска, подобные этой :
Initial commit ----- [PROD V1] ------ [PROD V2] ------
Для такого поведения я использую
git merge dev --squash -X theirs
в ветке master, чтобы получить все изменения, которые были внесены в ветку dev в рабочем каталоге master, затем создайте один единственный коммит с [PROD]
сообщением и нажмите.
Проблема в том, что после того, как я попробовал merge dev --squash -X theirs
ветку on master, я заметил, что некоторые файлы автоматически автоматически объединяются (некоторые целые блоки кода добавляются дважды ..) что в конечном итоге приводит к многочисленным ошибкам в моих PHP-скриптах.
Как я понял, -X их принимает «их» (dev) версию, но только тогда, когда автоматическое слияние невозможно. Проблема возникает из-за автоматического слияния (я видел, что все файлы с этой проблемой были автоматически объединены).
Как я могу просто отключить автоматическое слияние, чтобы все файлы в главной ветке были заменены содержимым dev?
Ответ №1:
Я думаю, что нашел ответ. git merge предназначен для включения изменений из версии файла в другую версию. Это просто не инструмент замены.
-X theirs
просто автоматически разрешает конфликт, выбирая их версию, но в определенных очень специфических строках (не весь файл), где git не знает, что делать. Это определенно не означает замену всего содержимого файла «их» версией, как я думал.
Чтобы заменить содержимое файла на «их» (dev) версию, я сделал :
git merge dev --squash
Git говорит, что конфликты не разрешены. Теперь, чтобы заменить их версией для всех файлов, я сделал :
git checkout --theirs *
И, наконец, пометьте все конфликты как разрешенные :
git add -u
Зафиксируйте и нажмите, и все будет хорошо 🙂
Комментарии:
1. Это правильно, хотя, если вы хотите
--theirs
, чтобы применить только к конфликтующим файлам, вы не захотите*
здесь, и если вы хотите--theirs
применить ко всем файлам, и вы используете оболочку в стиле Unix, вам нужно либо указать*
, либо использовать.
на верхнем уровне репозитория. Последнее обычно лучше, потому*
что не соответствует точечным файлам (ну, вы можете настроить, соответствует ли это, например, если вы используете bash, но по умолчанию «нет»).2. Не знал, что * не означает скрытые файлы. Я снова проверю свой рабочий сервер, спасибо за это замечание!
3. В Git,
*
как правило, соответствует точечным файлам, но в оболочках, как правило, нет. Если вы используете функции сопоставления имен файлов библиотеки, они часто принимают флаг (FNM_PERIOD
например), сообщающий им*
, соответствует ли, например,.bashrc
. В самом bash вы можете установить этуdotglob
опцию.