Как получить общего предка конфликтующего файла с помощью git - PullRequest
0 голосов
/ 22 мая 2018

Я объединил 2 филиала и получил конфликты.Один из них - просто беспорядок, потому что он был сильно переработан на одной ветви (B1).Тем не менее, я ожидаю, что другая ветвь (B2) будет содержать простое изменение, которое, к несчастью, затронуло много строк.

Так что я думаю, что самый простой способ сделать слияние - это сохранить B1 и повторитьизменения сделаны на B2.Но я хочу быть уверенным в том, что это за изменения в В2, прежде чем начать, чтобы быть уверенным, что я ничего не забыл.

Для этого

  • Я хочу знатьпоследняя общая фиксация предка для этого файла между 2 ветвями
  • в идеале, я хотел бы сделать это в моей текущей ситуации "конфликтующих слияний" без необходимости извлекать

Ответы [ 2 ]

0 голосов
/ 22 мая 2018

Обратите внимание, что во время ручного объединения некоторого конфликтующего файла file.ext, все три версии этого файла хранятся в области индекса / промежуточного хранения в трех слотах, зарезервированных дляэтот случай.Они пронумерованы:

  • слот 1 содержит базовую версию;
  • слот 2 содержит версию --ours из фиксации HEAD;
  • удерживает слот 3--theirs версия из другого коммита.

Хотя git checkout имеет --ours и --theirs для извлечения этих двух версий, в базовой версии отсутствует опция.Однако git show можно использовать для извлечения всех трех версий: например,

git show :1:file.ext > file.ext.base
git show :2:file.ext > file.ext.ours
git show :3:file.ext > file.ext.theirs

.

Если вы когда-либо используете команду git mergetool, это просто оболочка сценария оболочки, котораявыполняет вышеупомянутое (используя немного разные имена), а затем запускает выбранный инструмент слияния для этих трех файлов.

0 голосов
/ 22 мая 2018

Я только что вспомнил:

git merge-base B1 B2

дают общего предка ветвей B1 и B2.Это для целых веток.Но никакие последующие изменения не применяются к любому файлу в обеих ветвях.

Затем, чтобы увидеть разницу, просто

git diff common_ancestor..B2 path/to/the/file 

, где common_ancestor - это коммит, полученный с git merge-base

...