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

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

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

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

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

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

4 ответа

Решение

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

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

git merge -s recursive -Xignore-space-change

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

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

Также было бы разумно взглянуть на то, что думает git, прежде чем выполнять слияние с использованием diff с некоторыми дополнительными опциями. Просматривая документы diff, кажется, что эти опции помогут вам больше всего:

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

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

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

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

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

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

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

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