it-roy-ru.com

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

Я знаю, что могу видеть разницу между 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 /projectA_Master projectA

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

143
Marten Bauer

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

52
Will Manley

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

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
290
Jörg W Mittag

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

Настроить 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
93
GutenYe

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

git difftool -d branchname

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

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

git difftool -d stash

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

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

10
Piotr Jurkiewicz

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

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

git checkout branch_a
git checkout -b do_diff
git reset --soft branch_b
meld .
5
realtime

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

http://Gist.github.com/498628

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

5
Mark Longair

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

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

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

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

1
Stefan Forster

Я не могу комментировать под ответ Piort Jurkiewicz на комментарий pykiss: "копировать новые файлы из ветки в рабочий каталог не работает :(", но:

Решение скопировать файл file.txt из branch_B в рабочую ветку branch_A:

git chechout branch_B -- file.txt

from этот ответ to этот вопрос . Я не знаю, как это сделать в самой структуре.

0
Geoffroy

Если у вас есть чистый рабочий каталог и чистый индекс (или вас это не волнует), то вот что вам нужно:

git diff master..devel | patch -p1 && meld . && git reset --hard
0
sqrt163