Невозможно сравнить файлы в двух отдельных ветках в Git

У меня есть FileA в ветке A и FileB в ветке B.

Проблема в том, что я могу получить доступ только к одному файлу за раз. Я хотел бы иметь возможность сравнивать файлы с помощью FileMerge или meld, так как это единственные diffTools, которые я нашел для Mac.

Как можно отличить два файла с помощью объединения/объединения файлов?


[Решено]: 1-я разработанная проблема: FileMerge не поддерживает стандартный ввод

Маси: Вы можете использовать opendiff, чтобы разрешить FileMerge иметь файлы из стандартного ввода. Итак, следующая проблема - найти, как заставить инструмент git diff использовать opendiff.


Вторая разработанная проблема: заставить инструмент сравнения Git использовать opendiff на Mac.


person Léo Léopold Hertz 준영    schedule 27.05.2009    source источник
comment
Проблема не в том, что git не использует opendiff, а в том, что README не существует на мастере.   -  person Hank Gay    schedule 28.05.2009


Ответы (4)


Вы можете использовать "git mergetool" для слияния, а в современном git (имеется в виду версия 1.6.3 и выше) "git difftool" для сравнения с помощью графических инструментов. Конечно, вам придется сначала настроить их, но они выполняют некоторое автоопределение (конечно, с некоторыми жестко запрограммированными предпочтениями), и, если я правильно помню, встроена поддержка opendiff.

И тогда, конечно, вы сможете использовать свой графический инструмент (opendiff/FileMerge), как если бы вы использовали обычный «git diff», например

prompt> git difftool somebranch:UNREADME otherbranch:README
person Jakub Narębski    schedule 27.05.2009
comment
Как я уже писал, git-difftool доступен только в git версии 1.6.3 и выше (проверьте вывод git --version). - person Jakub Narębski; 28.05.2009
comment
@проблема решена: MacPorts имеет старый Git. Мне нужно было обновить его. -- Спасибо за ваш ответ! - person Léo Léopold Hertz 준영; 28.05.2009

git поддерживает имена веток как часть пути к репозиторию. Например, если в вашем репозитории есть следующие файлы, README только в master, а UNREADME только в branch:

master:README

branch:UNREADME

Вы можете сравнить их через git с помощью:

git diff branch:UNREADME master:README

Вы можете вывести артефакт репозитория на стандартный вывод с помощью git show:

git show branch1:UNREADME

Итак, если ваша внешняя утилита сравнения может принять 2 файла в командной строке bash, вы можете сравнить их с чем-то вроде:

diff-command <(git show branch1:UNREADME) <(git show master:README)

Где синтаксис <(...) bash берет вывод заключенной команды, запускает ее в канале и помещает путь к файлу канала в командную строку.

person Kyle Burton    schedule 27.05.2009
comment
Как вы можете сделать то же самое с внешним слиянием файлов? -- Я безуспешно запускаю на Mac % open -a filemerge Heee/master:.profile master:.profile - person Léo Léopold Hertz 준영; 27.05.2009
comment
FileMerge.app не принимает ввод со стандартного ввода. Возможно, вам повезет с этим скриптом, созданным Google: kerneltrap.org/mailarchive/git /2007/11/21/435536 - person Jarret Hardie; 27.05.2009
comment
Вы также можете попробовать Changes.app, который имеет утилиту командной строки и может принимать ввод со стандартного ввода... changesapp.com - person Jarret Hardie; 27.05.2009

Например, если вы в настоящее время оформляете заказ в филиале A, вы можете использовать команду:

git diff branchB path/to/common/file/between/branches.txt

Затем вы можете отредактировать diff, если хотите часть изменений, или оставить все как есть, и git apply diff как патч. Что касается инструмента с графическим интерфейсом, который делает это, надеюсь, у кого-то еще будет предложение.

person Jarret Hardie    schedule 27.05.2009

Из документов вам нужно что-то похожее на следующее в вашем .git/ файл конфигурации:

# Our diff algorithm
[diff]
    external = opendiff
person Hank Gay    schedule 27.05.2009