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

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

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

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

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


person Marten Bauer    schedule 05.01.2010    source источник
comment
Отвечает ли это на ваш вопрос? Настройка и использование Meld в качестве инструмента git difftool и mergetool   -  person evan.bovie    schedule 05.06.2020


Ответы (8)


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

person Will Manley    schedule 30.11.2010
comment
Отличный инструмент, Уилл. Спасибо! Тщательно рекомендуется ... теперь, если бы только он работал и на слияниях. - person Dipstick; 18.11.2011
comment
TYVM для отличного инструмента - (напоминание себе добавить! К псевдониму) - person kfmfe04; 27.01.2012
comment
Цитата Уилла из репозитория github: ПРИМЕЧАНИЕ: git-meld устарел, так как git difftool изучил параметр --dir-diff в git 1.7.11. - person oluc; 05.05.2013

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

git config --global diff.tool meld

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

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

git difftool master..devel

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

git difftool -d ABC
person Jörg W Mittag    schedule 05.01.2010
comment
это не то, что я ищу. Он показывает мне различия файл за файлом. Я заархивировал это ранее с помощью скриптов diff.py и git diff master..devel. Я хочу видеть все различия и дерево каталогов как 'meld folderA / folderB /'. - person Marten Bauer; 07.01.2010
comment
Мартен, так работает мерзавец. Он только отслеживает файл, поэтому вы можете видеть только разницу файл за файлом. В git вы не можете зафиксировать только пустой каталог. Есть какая-то конкретная причина, по которой вы хотите отображать разницу между каталогами? - person Donny Kurnia; 23.01.2010
comment
@DonnyKurnia: Мне потребовалось немного времени, чтобы понять, что OP пытается сделать: Meld имеет отдельный пользовательский интерфейс для просмотра всех изменений в каталоге. Вы можете фильтровать просматриваемые файлы в зависимости от того, были ли они такими же, измененными или новыми. OP хочет использовать этот пользовательский интерфейс для отображения изменений. (Это позволяет вам увидеть список всех изменений и выбрать те, которые вы хотите сравнить.) Таким образом, это не сравнение каталогов, а сравнение коммитов, рассматриваемых как единое целое. - person idbrii; 05.08.2012
comment
@MartenBauer Я думаю, это то, что вам нужно: git difftool --dir-diff master devel - person Stéphane; 22.12.2013
comment
Можно ли это сделать, чтобы текущая ветка не находилась в папке tmp и, следовательно, позволяла редактировать? - person zkent; 03.03.2014
comment
мы можем использовать его с git gui в tools / add как git difftool -d $REVISION! - person Aquarius Power; 20.06.2014
comment
Это прекрасно работает! Но если опция -d не работает как исключение, попробуйте обновить свою версию слияния. Взгляните на: stackoverflow.com/questions / 28833983 /, если у вас возникла эта проблема. - person Benjamin; 10.03.2015
comment
Отлично, спасибо! Для меня это всегда было по умолчанию с Hg & DiffMerge. Сводил меня с ума, когда я переехал в Git. - person Justin; 08.05.2015

Начиная с git v1.7.11, вы можете использовать git difftool --dir-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
person GutenYe    schedule 10.10.2012
comment
Я думаю, это действительно то, чего хотела ОП. Обратите внимание на параметр -g для использования инструмента guidiff и параметр -d для использования --dir-diff. Это хорошо для проверки кода. Nit: опция difftool.prompt не требуется при указании -d, по крайней мере, для Git 1.8. - person Michael Percy; 22.07.2013
comment
Это потрясающе. Именно то, что мне нужно. Спасибо! - person Nicholas; 31.10.2013
comment
Можно ли это сделать, чтобы текущая ветка не находилась в папке tmp и, следовательно, позволяла редактировать? - person zkent; 03.03.2014
comment
Буду признателен за ответ на вопрос @zkent ... :( - person tavlima; 14.03.2014
comment
@zkent @tavlima: Эта команда уже позволяет редактировать вашу текущую версию. Даже если вы видите, что поток tmp объединяется, если вы сохраните - Ctrl+s - правую часть, ваш файл будет изменен. - person Benjamin; 02.10.2015
comment
Я настроил именно так, как вы описали, но он просто ничего не делает, даже Meld не открылся. когда я открываю Meld вручную, он работает. - person To Kra; 09.01.2017
comment
У меня это не сработало на macOS. См. мой ответ для более полного решения. - person evan.bovie; 04.06.2020

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

git difftool -d branchname

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

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

git difftool -d stash

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

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

person Piotr Jurkiewicz    schedule 20.03.2014
comment
Петр, это именно то, что я пытался сделать, но в моем случае (на CentOS) никаких символических ссылок не создается. Есть ли какая-либо необходимая настройка конфигурации или минимальная версия meld, которая поддерживает это? - person wrjohns; 22.05.2015
comment
Я думаю, что за создание символических ссылок отвечает Git, а не Meld. См. Руководство Git для команды difftool. Может стоит обновить его до более новой версии? - person Piotr Jurkiewicz; 22.05.2015
comment
копировать новые файлы из ветки в рабочий каталог не получается :( - person pykiss; 22.07.2016

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

http://gist.github.com/498628

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

person Mark Longair    schedule 29.07.2010

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

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

git checkout branch_a
git checkout -b do_diff
git reset --soft branch_b
meld .
person realtime    schedule 09.09.2011

Для 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.

person evan.bovie    schedule 04.06.2020
comment
Спасибо! Это работает! версия macOS: 11.1 - person JS.; 17.02.2021

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

Вы должны настроить параметры редактирования 'git gui', global: "Use merge tool: meld".

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

meld запустится и отобразит все еще выбранную первую фиксацию справа.

person Stefan Forster    schedule 03.02.2014