Как я могу сделать трехсторонний графический diff (не объединить) с git? - PullRequest
0 голосов
/ 24 апреля 2019

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

Графическая разница двух веток в настоящее время настроена и хорошо работает с 'meld'. Ниже показано графическое окно с изображением, как и ожидалось:

  • git diff branch1 branch2 - myfilename

Я попытался сделать следующее, но я получил вывод ASCII 'diff --cc'.

  • git diff master branch1 branch2 - myfilename

Это правильный синтаксис для получения 3-сторонней разницы? Каковы правильные настройки .gitconfig, чтобы он был открыт? Я использую Git версии 1.8.2.1.

Я ожидаю, что три файла будут открыты в окне слияния, тогда я смогу посмотреть на изменения между branch1 / branch2 и затем визуально убедиться, что то же самое изменение в master. Я только что понял, что могу сделать это, проверяя каждый файл из трех ветвей независимо, а затем передавая имена файлов в качестве аргументов непосредственно в meld. Оформить заказ можно в соответствии с этим SO ответом: https://stackoverflow.com/a/888623/350265

1 Ответ

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

Ручная однострочная команда

Вы можете вызвать meld для трех версий файла, не используя временные файлы, сочетая синтаксис <(cmd) в bash с вашей идеей git show:

meld <(git show master:file) <(git show branch1:file) <(git show branch2:file)

Появится файл с файлами dev/fd/61, /dev/fd/62 и /dev/fd/63, относящимися к файлу в каждой из трех ветвей. Имена не очень дружелюбны, но вы привыкнете к этому. Дело в том, что он покажет то, что вы хотите увидеть.

Создание сценариев

Очевидным следующим шагом является упрощение синтаксиса с помощью скрипта:

Создать файл ~/bin/git-meld3 (или где-либо еще в вашей переменной PATH):

#!/bin/bash
meld <(git show $1:$4) <(git show $2:$4) <(git show $3:$4)

Сделать его исполняемым:

chmod +x ~/bin/git-meld3

Назовите это:

git meld3 master branch1 branch2 myfilename

Команда работает с любым коммитом:

git meld3 master 36d1cf756 HEAD^^^ myfilename

Более гибкий скрипт

Этот ~/bin/git-meld скрипт принимает два или три коммита:

#!/bin/bash
if [[ $# -eq 3 ]]; then
   meld <(git show $1:$3) <(git show $2:$3)
elif [[ $# -eq 4 ]]; then
   meld <(git show $1:$4) <(git show $2:$4) <(git show $3:$4)
else
   echo Usage: git meld committish1 committish2 [committish3] file >&2
   exit 1
fi

PS

На моей собственной машине я должен вызвать meld следующим образом: python2.6 /usr/bin/meld, возможно, потому что он установлен неправильно, так что это мой настоящий ~/bin/git-meld3 скрипт:

#!/bin/bash
python2.6 /usr/bin/meld <(git show $1:$4) <(git show $2:$4) <(git show $3:$4)

Мельд стар! В сценарии написано, что для него требуется Python 2.4, но он не может быть скомпилирован с 2.7 или 3. К счастью, он работает с 2.6, поэтому я смог протестировать свое решение.

...