Почему я получаю git merge конфликты? - PullRequest
1 голос
/ 10 апреля 2019

Я столкнулся с ситуацией, связанной с git и Bitbucket, которую я не понимаю.

Я создал ветку branchB, которая произошла от master.Я сделал несколько коммитов и создал запрос на master.Во время рассмотрения этого запроса на извлечение я начал работать над другой функцией, которая была расширением этой функции с branchB.Поэтому я создал еще одну ветку (branchC), которая произошла от branchB.Когда моя расширенная функция была готова, я создал запрос на получение branchB.См. Изображение I .В то время у меня не было конфликтов слияния.

enter image description here

Я хотел позволить рецензентам взглянуть на оба запроса по отдельности и получитьотдельные запросы на получение с небольшими изменениями.

Мой план был следующим:

  • объединить запрос на получение 1 (PR1) с мастером, используя параметр --squash
  • измените целевую ветвь в запросе на извлечение 2 (PR2) на ведущий (см. Изображение 2 )
  • объедините запрос на извлечение 2 (PR2) с ведущим

Однако, когда я объединяю запрос на извлечение 1 (PR1) с мастером, используя опцию --squash, Bitbucket автоматически изменяет целевую ветвь запроса на извлечение 2 (PR2) на masterи я получил некоторые конфликты в запросе на получение 2 (PR2).

Итак, я разрешил конфликты:

  1. git checkout master

  2. git pull

  3. git checkout branchC

  4. git rebase master

  5. git mergetool

  6. Я решилвсе конфликты здесь.

  7. git rebase --continue

На самом деле, описанная проблема произошла со мной дважды, так как у меня также было branchD, происходящее изbranchC.Когда я слил branchB в master, мне нужно было разрешить некоторые конфликты на шаге 6. Однако, когда я слил branchC в master, мне не пришлось разрешать какие-либо конфликты вручную на шаге 6 (несмотря на то, что Bitbucket показывал мне конфликты слияния, мне пришлось перебазировать branchC).

Мю следующие вопросы:

  1. Почему Bitbucket показывал мне любые конфликты слияниядля PR2, когда я слил PR1 в мастеринг с использованием опции --squash? Я бы ожидал, что он выяснит, что изменение между картинками I и II происходит только в идентификаторах коммитов - кодеэто не изменилось.Git / Butbucket должен быть в состоянии выяснить, какие изменения я хочу внести.
  2. Почему я не получил никаких конфликтов, которые должны быть разрешены вручную, когда я перебирал branchD в master (после слияния branch C в master)? Поскольку Bitbucket не может объединить мой запрос на извлечение, я ожидаю, что мне потребуется разрешить некоторые конфликты вручную.Может ли это быть связано с версией git на моем рабочем столе и в Bitbucket?
  3. Был ли у меня какой-либо лучший вариант, чем создание этих трех запросов на получение в моем случае? Мог ли я избежать этих конфликтов слияния?

Дополнительная информация:

  • версия git на моем рабочем столе: 2.17.1.windows.2
  • Версия Bitbucket: v5.12.2
  • версия gitна сервере Bitbucket: 2.14.5
  • Я искал похожие вопросы ( 1 , 2 , 3 ).Никто из них не занимается моей проблемой.

Буду признателен за любое объяснение этого явления.

Редактировать: 1. Я объединил все свои запросы извлечения, используя опцию --squash.2. Я обновил изображение, чтобы показать, что branchB и branchC не начинаются с коммитов B1 и C1 соответственно.

1 Ответ

1 голос
/ 10 апреля 2019

Если я правильно понимаю Вашу ситуацию.Проблема была в этом --squash.Вот тема, которая объясняет, как выполняются слияния в GIT Как git узнает, какую версию строки сохранить? .

Когда вы слились с --squash, поскольку коммиты gitфактически неизменный, вы создали новый сдавленный коммит с новым ID.Когда вы захотели объединить PR2 обратно с мастером, содержимое файла было изменено в обоих местах.Для branchB было несколько коммитов с некоторыми идентификаторами, а для master был только один коммит с другим идентификатором, и некоторые файлы были изменены в обеих ветвях, поэтому в основном git не знает, какая версия верна.Вот почему не было конфликтов в случае branchC, потому что история коммитов была одинаковой для branchB и branchC (здесь не было сделано --squash).

...