Это, вероятно, закончится нормально, и Git не создаст повторяющийся код.
Когда вы выполняете слияние, Git смотрит на две головы (ветви, которые вы объединяете) , плюс база слияния, которая обычно является самым последним распространенным коммитом. Если обе головы имеют одинаковое содержимое файла, то слияние тривиально, и Git выбирает этот результат. Если они этого не делают, он пытается включить изменения с каждой стороны.
Когда он это делает, если изменения относятся к двум отдельным областям кода, слияние успешно, потому что Git будет включать изменение с каждой стороны. Если изменения относятся к одной и той же области, но являются идентичными изменениями, то Git просто берет этот идентичный кусок (один раз) и использует его в результате. Если у вас есть разные изменения в одной и той же области, то Git будет конфликтовать, и вам придется решать проблемы вручную.
Если слияние прошло успешно без конфликтов, то Git, вероятно, поступил правильно и вы получите нормальный результат, хотя иногда слияние действительно приводит к странному поведению, потому что Git работает только на строках и по сути не знает о структуре вашего кода. Обычно это можно обнаружить, собрав и протестировав свой код, и на практике неожиданное поведение случается очень редко. Git не дублирует код, если обе стороны имеют одинаковые изменения; в худшем случае он конфликтует и позволяет вам решить, что делать.
Если при слиянии есть конфликты, вам придется разрешить их вручную. Если вы выполняете слияние через GitHub с помощью запроса на перенос, он сообщит вам, есть ли конфликты в запросе на перенос. Если вы выполняете их в командной строке, вам просто нужно попробовать и посмотреть, как это работает.