Как мне увидеть изменения в конфликте деревьев (удаленные нами или удаленные ими)?

При слиянии или перемещении двух веток в git, когда файл был удален в одной, но изменен в другой, git дает конфликт. git status показывает файл как «удаленный нами» или «удаленный ими».

Я нашел множество вопросов о том, как разрешить конфликт, в том числе:

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

Как узнать, что изменилось в версии файла, который не был удален? git просто оставляет весь файл в рабочей копии и не отмечает никаких изменений.

Например:

  • в ветке develop, пользователь А изменяет файл foo.x
  • в ветке feature пользователь B выполняет рефакторинг кода, удаляет файл foo.x, потому что его функции теперь находятся в других файлах
  • пользователь B пытается объединить develop в feature и получает конфликт, помеченный как deleted by us
  • как пользователь B видит, какой пользователь A изменил, чтобы увидеть, нужны ли изменения в отредактированном коде?

person IMSoP    schedule 19.07.2019    source источник


Ответы (1)


Если «удалено нами»:

git diff <your-branch>...<branch-you're-merging-to> /path/to/file

Если "ими удалено":

git diff <branch-you're-merging-to>...<your-branch> /path/to/file

На странице руководства git-diff:

git diff [‹options›] ‹commit› ... ‹commit› [-] [‹path› ...]

Эта форма предназначена для просмотра изменений в ветке, содержащей и до второго ‹commit›, начиная с общего предка обоих ‹commit›. «git diff A ... B» эквивалентно «git diff $ (git merge-base A B) B». Вы можете опустить любое из ‹commit›, что будет иметь тот же эффект, что и использование HEAD.

Это покажет вам только изменения, внесенные в ветку, которая не удалила файл, то есть если ветка, которая удалила файл, сначала внесла в него какие-либо изменения, они не будут отражены в diff.

Если вы выполняете перебазирование, а не слияние, тогда сообщения «удалено нами» / «удалено ими» будут наоборот, поэтому используйте другую команду.

person Calum Halpin    schedule 19.07.2019
comment
Есть ли способ определить две фиксации, не просматривая журналы вручную и не находя их хэши фиксации? - person IMSoP; 19.07.2019
comment
Вы можете использовать merge-base <your-branch> <branch-you're-merging-to>, чтобы найти фиксацию перед работой, и просто использовать имя ветки, с которой вы выполняете слияние, во второй раз. - person Calum Halpin; 19.07.2019
comment
Я обновил ответ, добавив более удобную форму. - person Calum Halpin; 19.07.2019
comment
Спасибо! Работает ли это как для удаленных нами, так и для удаленных ими? И можно ли такой же подход использовать при ребейзинге? (Извините, если это звучит придирчиво - я стараюсь, чтобы это был хороший справочник для будущих читателей.) - person IMSoP; 19.07.2019
comment
Я обновил его, чтобы охватить как обновленные нами, так и обновленные ими. Я думаю, что при перебазировании он должен работать так же, но я не проверял. - person Calum Halpin; 19.07.2019