Как заставить 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, чтобы вы могли попробовать слияние самостоятельно. Коммит, в котором я переместил функцию, находится в ветке темы. Коммит, в котором та же функция изменяется в master, находится в HEAD ветки merge_here. В master есть один дополнительный коммит, в котором я играл с некоторыми другими техниками слияния, которые вы должны игнорировать для этого вопроса.

11
задан LiKao 15 January 2012 в 23:18
поделиться