2009-05-27 2 views
59

У меня есть FileA в branchA и FileB в branchB.Невозможно разбить файлы в двух отдельных ветвях в Git

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

Как вы можете сопоставить meld/FileMerge два файла?


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

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


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

+1

Проблема не в том мерзавец не используется opendiff, это то, что README не существует на сервере. –

ответ

66

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

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

prompt> git difftool somebranch:UNREADME otherbranch:README 
+0

Как я писал, git-diffftool доступен только в git версии 1.6.3 и более поздних версиях (проверьте вывод «git -version»). –

+0

Комментарий о «git diff» (и с использованием diff.external) не касается моего ответа ... –

+0

@problem: MacPorts имеет старый Git. Мне нужно было его обновить. -- Спасибо за ваш ответ! –

37

Если вы в настоящее время проверки, чтобы branchA, например, вы можете использовать команду:

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

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

61

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

master:README 

branch:UNREADME 

Вы можете дифф их через мерзавца с:

git diff branch:UNREADME master:README 

Вы можете получить хранилище артефактов на стандартный вывод с git show:

git show branch1:UNREADME 

Так что, если ваш внешний утилита дифф может Tak е 2 файлы на Баш строке, вы можете дифф их с чем-то вроде:

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

Где синтаксис <(...) Баша берета выходного вложенной команды, запускает его в трубе и помещает путь к файлу трубы на командной строки.

+0

Как вы можете сделать то же самое с внешним слиянием файлов? - Я бегу неудачно в Mac% open -a filemerge Heee/master: .profile master: .profile –

+1

FileMerge.app не принимает входные данные от stdin. Возможно, вам повезло с этим скриптом, который был выпущен google: http://kerneltrap.org/mailarchive/git/2007/11/21/435536 –

+1

Вы также можете попробовать Change.app, который имеет утилиту командной строки и может принимать входные данные от stdin ... http://changesapp.com/ –

2

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

# Our diff algorithm 
[diff] 
    external = opendiff 
Смежные вопросы