git: отключить автоматическое слияние для слияния git -squash -X их

#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 опцию.