Посмотреть отличия веток со слиянием?

159

Я знаю, что могу увидеть разницу между HEAD и текущим состоянием meld .. Но как я могу увидеть различия между ветвями, например masterи develсо смесью?

На данный момент я делаю следующие шаги:

  1. Переименовать папку рабочей копии
    например mv /projectA /projectA_master)
  2. Клонировать проект снова
    git clone url
  3. Переключиться на develфилиал
    cd projectA && git -b devel origin/devel
  4. Посмотреть различия с сочетанием
    meld /projectA_Master projectA

Разве нет более простого способа получить тот же результат в слиянии? Мне это нужно только для просмотра изменений, а не для слияния.

Мартен Бауэр
источник

Ответы:

55

Я также обнаружил, что эта проблема раздражает, поэтому я создал git meld, который позволяет более удобно использовать произвольные коммиты для рабочего дерева или рабочей области. Вы можете найти его по адресу https://github.com/wmanley/git-meld . Это немного похоже на сценарий Марка, но он работает для сравнения любого произвольного коммита, промежуточной области или рабочего каталога с любым другим. Если одна из вещей, с которыми вы сравниваете, - это рабочее дерево, то оно также доступно для чтения и записи, поэтому вы не потеряете свои изменения.

Уилл Мэнли
источник
1
Отличный инструмент, Уилл. Спасибо! Настоятельно рекомендуется ... теперь, если только это работает на слияниях.
Dipstick
TYVM для отличного инструмента - (напоминание себе добавить! К псевдониму)
kfmfe04
26
Цитирую Will из репозитория hit github: «ПРИМЕЧАНИЕ: git-meld устарел, поскольку git difftool изучил опцию --dir-diff в git 1.7.11».
13
318

Коротко и сладко:

git config --global diff.tool meld

Это настраивает Git для использования meldв качестве инструмента сравнения. (Вам не нужно указывать аргументы командной строки, поддержка meldвстроена в Git.)

Затем, если вам нужен графический diff вместо текстового, вы просто вызываете git difftoolвместо git diff(они оба принимают одинаковые аргументы). В твоем случае:

git difftool master..devel

Обновление: Если вы не хотите , чтобы один-файл-на-времени диф, но вместо этого хотите «подкаталог» вид использования сливаться со всеми изменениями между двумя ветвями, отметьте -dили --dir-diffопцию git difftool. Например, когда я нахожусь на ветви XYZ и хочу увидеть, что отличается между этим и ABC ветви, я запускаю это:

git difftool -d ABC
Йорг Миттаг
источник
3
это не то, что я ищу. Это показывает мне различия файла за файлом. Я архивировал это с помощью сценария diff.py и 'git diff master..devel' ранее. Я хочу видеть все различия и дерево каталогов, как 'meld folderA / folderB /'.
Мартен Бауэр
Мартен, вот так мерзавец работает. Он только отслеживает файл, поэтому вы можете видеть только файл различий за файлом. В git вы не можете совершить только один пустой каталог. Есть какая-то конкретная причина, по которой вы хотите отображать diff между dir?
Донни Курния
@DonnyKurnia: Мне понадобилось немного времени, чтобы понять, что пытается сделать OP: у Meld есть отдельный интерфейс для просмотра всех изменений в каталоге. Вы можете фильтровать просмотренные файлы, основываясь на том, изменились ли они, новые. ОП хочет использовать этот интерфейс для отображения изменений. (Это позволяет вам увидеть список всех изменений и выбрать те, которые вы хотите изменить.) Таким образом, это не сравнение между каталогами, а сравнение между фиксациями, но в целом.
idbrii
17
@MartenBauer Я думаю, это то, что вы хотите: git difftool --dir-diff master devel
Стефан
3
Можно ли это сделать так, чтобы текущая ветвь не находилась в папке tmp и поэтому позволяла редактировать?
zkent
100

Начиная с git v1.7.11, вы можете использовать git difftool --dir-diffдля выполнения директории diff. Который довольно хорошо работает со скриптами без https://github.com/wmanley/git-meld .

Настроить Git

git config --global diff.tool meld

Используй это

git difftool -d topic             // -d is --dir-diff
git difftool -d master..topic

Для macOS

brew cask install meld
git config --global difftool.meld.cmd 'open -W -a Meld --args \"$LOCAL\" \"$PWD/$REMOTE\"'
git config --global difftool.meld.trustExitCode true
GutenYe
источник
2
Я думаю, что это действительно то, чего хотел ОП. Обратите внимание на опцию -g для использования инструмента guidiff и опцию -d для использования --dir-diff. Это хорошо для проверки кода. Nit: опция difftool.prompt не требуется при указании -d, по крайней мере для Git 1.8.
Майкл Перси
1
Это потрясающе. Именно то, что мне было нужно. Спасибо!
Николай
5
Можно ли это сделать так, чтобы текущая ветвь не находилась в папке tmp и поэтому позволяла редактировать?
Зкент
2
Буду признателен также за ответ на вопрос @zkent ... :(
tavlima
3
@zkent @tavlima: Эта команда уже позволяет редактировать вашу текущую версию. Даже если вы видите, что tmp floder в meld, если вы сохраняете - Ctrl+s- правую часть, ваш файл изменяется.
Бенджамин
13

Важно сказать, что git difftool -dвы можете редактировать свои рабочие файлы в Meld и сохранять их . Для этого вам нужно сравнить какую-то ветку с вашим текущим рабочим деревом, например:

git difftool -d branchname

Meld покажет, что и левая, и правая директории находятся в / tmp. Однако файлы в правильном каталоге на самом деле являются символическими ссылками на ваши файлы в текущем рабочем каталоге (не относится к Windows). Таким образом, вы можете редактировать их прямо в Meld, и когда вы сохраните их, ваши изменения будут сохранены в вашем рабочем каталоге.

Еще более интересный вариант - сравнение текущей рабочей директории с тайником. Вы можете сделать это, просто набрав:

git difftool -d stash

Затем вы можете перенести некоторые изменения из stash (левое окно) в вашу текущую рабочую копию (правое окно), не используя git stash pop/applyи избегая надоедливого разрешения конфликтов, которое может быть вызвано этими командами.

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

Петр Юркевич
источник
Петр, это именно то, что я пытался сделать, но в моем случае (на CentOS) никакие символические ссылки не создаются. Требуется ли какая-либо конфигурация конфигурации или минимальная версия meld, которая поддерживает это?
wrjohns
Я думаю, что Git отвечает за создание символических ссылок, а не Meld. Проверьте руководство Git для команды difftool. Может быть, вы должны обновить его до более новой версии?
Петр Юркевич
2
копировать новые файлы из ветки в рабочий
каталог
5

Хотя из других ответов кажется, что на данный момент нет способа сделать это непосредственно в репозитории git, легко (благодаря ответу на другой вопрос :)) написать скрипт, который будет извлекать деревья двух коммитов. во временные каталоги и запустите на них соединение, удалив оба каталога при выходе из соединения:

http://gist.github.com/498628

Конечно, вы потеряете любые изменения, сделанные с помощью meld, но я думаю, что это очень удобно для быстрого обзора различий.

Марк Лонгэйр
источник
3

Я думаю, что простой способ сделать это с помощью git reset --soft :

Цель: сравнить различия между branch_a и branch_b с meld

git checkout branch_a
git checkout -b do_diff
git reset --soft branch_b
meld .
в режиме реального времени
источник
0

В git V1.7.9 вы можете сравнить два коммита без командной строки:

Вы должны настроить параметры редактирования в «git gui»: «Использовать инструмент слияния: meld».

Запустите gitk , выберите коммит, щелкните правой кнопкой мыши другой коммит> « diff this -> selected ». Под 'patch' щелкните правой кнопкой мыши файл> " external diff ".

meld запустится и отобразит все еще выбранный первый коммит с правой стороны.

Стефан Форстер
источник
0

Для Meld на macOS добавьте это в свой файл, ~/.gitconfigкак рекомендует разработчик приложения macOS, yousseb :

[diff]
  tool = meld
[difftool]
  prompt = false
[difftool "meld"]
  trustExitCode = true
  cmd = open -W -a Meld --args \"$LOCAL\" \"$REMOTE\"
[merge]
  tool = meld
[mergetool]
  prompt = false
[mergetool "meld"]
  trustExitCode = true
  cmd = open -W -a Meld --args --auto-merge \"$LOCAL\" \"$BASE\" \"$REMOTE\" --output=\"$MERGED\"

Вы можете опустить mergeконфиги, если хотите.

@ GutenYe ответ не сработал для меня из-за автоматического побега и / или чего-то с zsh.

evan.bovie
источник