Как получить 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, чтобы поместить все в свою фиксацию, он будет работать нормально.