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