Как заставить git правильно объединять перемещенный контент (не только файлы) - PullRequest
11 голосов
/ 13 января 2012

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

Как бы вы могли сохранить эту ситуацию настолько безопасной, насколько это возможно?

Редактировать:

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

Редактировать :

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

Ответы [ 3 ]

5 голосов
/ 21 января 2012

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

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

0 голосов
/ 31 июля 2015

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

не допускайте перемещения кода отдельно от изменений

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

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

'git apply' failed with code 1:'error: patch failed: filename.js:81'
0 голосов
/ 15 января 2012

Вы можете использовать git для добавления чего-либо в ваш коммит.

...