Как я могу получить свои конфликты git merge в diff-like формате? - PullRequest
0 голосов
/ 07 января 2019

Я объединяю два набора изменений git (или, возможно, - в процессе git rebase 'ing, который объединяет наборы изменений) с файлом foo, и возникают некоторые конфликты слияния. Файл выглядит так:

text appearing in all changesets
<<<<<<< HEAD
text added on the head
=======
something else added on another changeset
>>>>>>> 1babf8ed... commit comment here
more text appearing in all changesets
added text, no conflicts
yet more appearing in all changesets

Мой вопрос:

Для определенного файла (например, foo выше) Как я могу отобразить содержимое конфликтов, чтобы ревизия HEAD отображалась как удаленный текст, а другая ревизия изменений (в моем примере) - как добавленный текст? Другими словами, как я могу заставить некоторый инструмент обрабатывать часть между <<<<< и ===== как префикс - и часть между >>>>> и ===== как префикс +, или наоборот ?

Примечания:

  • Лучше всего будет просто вывод, похожий на diff, в стандартный поток вывода, потому что я могу передать это в другой инструмент. Но кое-что с большей привязкой к инструментам, связанным с diff в git, также имеет значение. Я бы предпочел не загружать какую-либо специальную утилиту / приложение, если я могу разумно избежать этого.
  • Одновременное отображение версий HEAD и других коммитов также полезно

1 Ответ

0 голосов
/ 30 января 2019

Конфликты не различаются, поскольку это не дополнения на одной стороне, а удаление на другой.

При этом такие инструменты, как meld, kdiff3 или p4merge, могут отображать конфликты в режиме «бок о бок», чтобы помочь вам исправить их.

Edit:
Например:

Учитывая ситуацию, созданную с помощью этого скрипта:

#!/usr/bin/env bash

git init demoRepo
cd demoRepo
git commit --allow-empty -m "Init"
for i in {1..10}; do
  echo $i >> myFile.txt
  git commit -m "Add ${i} to my file" -- myFile.txt
done
git checkout -b branch2 HEAD~5
for i in A B C D E; do
  echo $i >> myFile.txt
  git commit -m "Add ${i} to my file" -- myFile.txt
done
git merge master

У нас конфликт внутри myFile.txt.

Установите meld в качестве mergetool с:

git config --global merge.tool meld
# Use `--local` if you want this setting to be only in current repository

Затем назовите его с помощью:

git mergetool
# You may also call it without (pre)defining the tool in config, like:
#   git mergetool --tool=meld

Мелд должен знать, что вы конфликтуете с представлением «бок о бок».

meld for conflict resolution

...