Git Слияние и закрепление смешанных пространств и вкладок с двумя ветвями

Я прошел через некоторое подобное SOQ и не видел адекватного решения для этого случая.

Я заметил, что во многих файлах существует грязное сочетание вкладок и пробелов, используемых для отступов. В приведенном ниже стандарте кодирования используется 4 пробела для вкладки.

Хотя это должно было быть рассмотрено, когда это произошло, мне нужно рассмотреть его сейчас и хотелось бы исправить файлы, с которыми я сталкиваюсь. Проблема в том, что есть две команды, использующие разные ветки кода, и нам в конечном итоге придется объединить эти ветки. Что произойдет, если мы изменим все файлы нашей ветки на правильное форматирование и попытаемся объединить ее? Неужели это будет трудно сделать? Это покажет мне массу конфликтов? Идеально id like git merge, чтобы игнорировать пробелы, но я не знаю, как он будет знать, какую версию выбрать.

Есть ли лучшие решения из реактивной точки зрения?

Это прежде всего технологическое лидерство, проблема с кодом, проблема с обзором кода, но пока я не в этой позиции или случае. Могу ли я исправить это легко? (Имея правонарушителей справиться с слиянием, к сожалению, не может быть!)

Ответ 1

По умолчанию git будет видеть каждую разницу в отступе строки как изменение, так что да, вы, вероятно, столкнетесь с массовыми конфликтами, делающими слияние запасов.

Однако вы можете выбрать стратегию слияния для использования с опцией -s:

git merge -s recursive -Xignore-space-change

Эта команда использует рекурсивную стратегию и использует ее ignore-space-change. git -merge docs объясняют, как это повлияет на ваше слияние:

  • Если в их версии вводятся только пробелы в строке, используется наша версия;
  • Если наша версия вносит изменения в пробелы, но их версия содержит существенное изменение, используется их версия;
  • В противном случае слияние происходит обычным способом.

Было бы также разумно смотреть на то, что думает git, прежде чем делать слияние с помощью diff с некоторыми дополнительными параметрами. Просматривая diff docs, похоже, что эти параметры помогут вам максимально:

-b
--ignore-пространственно-изменить Игнорировать изменения в количестве пробелов. Это игнорирует пробелы в конце строки и рассматривает все остальные последовательности одного или нескольких символов пробелов как эквивалентные.

-w
--ignore-все-пространство Игнорировать пробелы при сравнении строк. Это игнорирует различия, даже если одна строка имеет пробелы, где другая строка не имеет.

Ответ 2

Почему бы не запустить обе базы кода через indent с тем же стилем на обеих ветвях? Это не займет много времени.

Тогда у вас не будет пробелов или других проблем (например, разных стилей блоков). В противном случае, да, будет сложно объединить эти ветки.

Предположим, что вы код на C, очевидно.

Ответ 3

Предполагая, что у вас есть как минимум три ветки (например, "мастер", "команда1", "команда2" ), затем обновляйте ветвь "мастер" со всеми правильными интервалами/отступом, и каждая команда тянет изменения от "master" ". Каждая команда должна обеспечить, чтобы все их новые коды/файлы соответствовали вашей стандартной практике кодирования.

Ответ 4

Обратите внимание, что, как упоминалось в "Git: объединение без конфликтов пробелов, использование git merge -Xignore-space-change будет

  • игнорировать все пробельные изменения в файле, а не просто пробелы, где есть конфликты,
  • однако полученный объединенный файл возвращает пробелы,
  • используя pre-commit hook, кроме того, эта стратегия слияния может полностью удалить те отстающие пробелы.