Как получить git, чтобы правильно объединить перемещенный контент (а не только файлы)

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

Вот сценарий:

У меня есть два файла hello.cc и bye.cc. Я начинаю ветку topic и перемещаю код от hello.cc до bye.cc. Если я теперь сделаю git blame -C bye.cc, я вижу, что этот код изначально появился из hello.cc, который приятно знать. Однако теперь я переключаюсь на исходную ветвь без перемещенного содержимого и меняю код в разделе hello.cc, который был перемещен в другой фиксации. Если я теперь делаю git merge topic, я получаю конфликт для hello.cc. Однако, если я не использую стиль diff3 (который я обычно делаю, хотя), я могу видеть, что этот метод был удален из hello.cc в другой ветке, но не был изменен впоследствии. Было бы неплохо было бы также получить конфликт на bye.cc, потому что было бы необходимо проверить, будут ли эти изменения из другой ветки повторно применяться к коду. Это возможно?

Я знаю, что могу вручную выяснить, что код был перемещен, выполнив git blame --reverse -C topic.... Однако для этого мне потребовалось некоторое время, чтобы выяснить эту возможность, и большинство других, вероятно, не узнают об этом. Во-вторых, я ленив и, вероятно, просто забуду, что код мог быть перемещен. Также я не уверен, что это работает, когда код был перемещен в несколько файлов.

Каким будет ваш способ максимально безопасно сохранить эту ситуацию?

Edit

Я только узнал, что git blame --reverse -C hello.cc $(git merge-base HEAD topic)..topic также работает, чтобы узнать, куда перемещается контент. И если я правильно понимаю git, это, вероятно, быстрее, потому что он не будет выполнять полный поиск содержимого в полном репозитории.

Edit

Я загрузил репозиторий, который я использую для воспроизведения github, чтобы вы могли попробовать слияние для себя. Конец, в котором я переместил функцию, находится в ветке темы. Конец, когда одна и та же функция изменяется в главном в HEAD ветки merge_here. В мастере есть еще одна фиксация, в которой я играл с другими методами слияния, которые вы должны игнорировать для этого вопроса.

Ответ 1

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

Здесь уже были некоторые дискуссии по этой теме, такие как как git обрабатывает слияние кода, который был перенесен в другой файл? и git merge: применить изменения к коду, перемещенному в другой файл.

Ответ 2

К сожалению, попал в ту же ловушку с моим кодом, после перемещения файла в git, он не распознает изменения во время слияния веток. Кажется, золотое правило, с которым нужно руководствоваться, состоит в следующем:

сохранить движение кода отдельно от изменений

GIT не может отслеживать такие случаи, как сейчас. И, похоже, нет быстрого/автоматизированного решения для выяснения потенциальных проблем после перемещения файла, а затем слияния.

Даже если вы узнаете обо всех коммитах, где возникла проблема, и попытайтесь применить исправление или вернуть изменения, потерянные после перемещения + слияния, вы все равно получите отказ от git:

'git apply' failed with code 1:'error: patch failed: filename.js:81'

Ответ 3

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