Как просмотреть git diff в текстовом редакторе? - PullRequest
1 голос
/ 01 ноября 2019

Как мне просмотреть git diff в простом старом текстовом редакторе, таком как Atom? Я не хочу настраивать или использовать инструмент diff, я просто хочу просмотреть diff в любом простом текстовом редакторе.

Ответы на другие вопросы, которые я видел, говорили о настройке инструмента diff, ноЯ просто хочу указать какой-нибудь случайный текстовый редактор.


Дополнительный вопрос:

  • В чем разница между инструментом сравнения и любым текстовым редактором?

Ответы [ 4 ]

4 голосов
/ 01 ноября 2019

Как просмотреть git diff в простом старом текстовом редакторе, таком как Atom? Я не хочу настраивать или использовать инструмент diff, я просто хочу просмотреть diff в любом простом текстовом редакторе.

Вывод Diff - это просто текст, поэтому вы можете перенаправить его в файли откройте этот файл или (в зависимости от редактора и платформы) перенаправьте ввод непосредственно в редактор.

Если вы сделали хотите запустить ваш редактор как инструмент сравнения, Документация описывает, как вызывается редактор. Вы можете захотеть, чтобы скрипт-обертка вызывал атом с переменными среды в правильном месте в командной строке.

Дополнительный вопрос: в чем разница между инструментом diff и любым текстовым редактором?

Общий текстовый редактор вряд ли будет отображать различия так же хорошо, как специальный инструмент. По крайней мере, если он распознает формат, он может выделить части, специфичные для diff.

Настоящий difftool, как правило, дает вам возможность просматривать как старые, так и новые версии файла, а также показывать визуальногде изменения сидят. Он также может подсвечивать внутристрочные изменения (сам diff основан на строках).


Я вообще против изображений текста, но так как мы действительно обсуждаем интерфейс ...

  1. вывод из git diff, открытый в текстовом редакторе: diff opened in text editor Это мало чем отличается от простого чтения различий в терминале, поэтому я не вижу особой пользы,Он выделяет строку index , но это действительно полезно, если я сканирую несколько блоков в одном разностном файле.

  2. Беглый плагин GVim, показывающий те же изменения: change in gvim with fugitive Это вид из моего редактора с беглым плагином. Вы можете увидеть подсветку внутри строки, где я удалил пробел из строки join. Он даже обновится в реальном времени, если я продолжу печатать на правой панели. Это также единственный, который с правильным синтаксисом выделяет исходный код.

  3. то же самое изменение, открытое в объединении с git difftool same change in meld from difftool Это самый дружелюбный видкак изменения вписываются во весь файл IMO.

3 голосов
/ 01 ноября 2019

TL; DR: Git сам ничего не знает о других командах, поэтому вы должны предоставить вспомогательный набор инструкций от до Git, чтобы сообщить ему: для использования программы X в качестве difftool,делать _____ . Лучше всего найти инструкции, уже созданные кем-то еще, например, комментарий EncryptedWatermelon, добавленный к его собственному ответу , но не получится, ну, см. Ниже.

См. Бесполезныеответьте за несколько практических советов.

Обратите внимание, что для самого Git, говоря проще, diff означает сравните две ревизии ,Например, две ревизии могут быть двумя коммитами или одним коммитом и содержимым вашего рабочего дерева. Git имеет несколько дополнительных особых случаев, так что вы можете использовать его как более изящную версию стандартной команды Unix / Linux diff, но в основном это две ревизии, каждая из которых представляет собой целый набор файлов:

  • Если ревизия слева содержит файл с именем F , а ревизия справа содержит файл с именем F , Git будет сравнивать содержимоедве версии F .

  • Если на левой стороне есть файл D , и его нет в правосторонней ревизии, файл D был удалено .

  • Если на левой стороне нет файла A , но в правом - файл A боковая ревизия, файл A был добавлен .

  • Если вы включите обнаружение переименования - что является значением по умолчанию с Git 2.9 - Git будет,в случае добавленных и удаленных файлов попытайтесь выяснить, может ли вновь добавленный файл в основном совпадать со старым, но удаленным файлом, и, если это так, сообщить об этом как переименованный файл,со старым именем D (удалено) и новым именем A (добавлено). Затем Git сравнивает содержимое левой стороны D с содержимым правой стороны A .

  • При сравнениисодержимое файлов, если все одинаково, Git вообще ничего не говорит о файле. В противном случае вы можете сделать так, чтобы Git дал вам набор инструкций в форме «удалить эту строку» и / или «добавить эту другую строку». Следуя инструкциям, преобразует старую версию файла в новую версию файла. Эти инструкции не обязательно то, что кто-то на самом деле сделал! Они просто достигнут того же результата . (Обычно есть только один очевидный способ достижения результата, так что оказывается, что кто-то сделал.)

Имея это в виду, вот что git difftool делает:

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

  • Затем со списком измененных файлов - набор имен F , которые были в обеих ревизиях, но не совпадали в двух ревизиях, - он создает копию левойбоковая версия файла и копия правой версии. В большинстве случаев он должен делать эти копии, потому что файлы, хранящиеся в Git, хранятся в замороженном и сжатом виде, который на самом деле может прочитать только Git. Git должен распаковать / разморозить их, «перегидратировав» внутреннюю высушенную лиофилизированную форму файла, чтобы другие программы могли ее прочитать.

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

  • Теперь, когда есть две копии файла, Git использует вспомогательную программу для запуска выбранного вами инструмента сравнения. Эта вспомогательная программа получает несколько частей информации, таких как:

    • имя каждой временной копии
    • оригинальное имя файла (временная копия обычно имеет какое-то уродливое временное имянапример .tmp-123456


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

Это вспомогательная программа. Это относительно простой сценарий оболочки, весящий чуть более 100 строк. Но он использует больше сценариев оболочки: в частности, он использует эту большую вспомогательную библиотеку mergetool , которая весит более 450 строк сценария оболочки.

Чтобы предоставить собственный инструмент, вы должны:в любом случае для лучшего использования - напишите сценарий оболочки, который используется второй библиотекой (помощник по слиянию) вместе с первым сценарием, который предоставляет знания о том, как запустить выбранный вами инструмент. Ключевые элементы этого взаимодействия:

  • открытие двух файлов
  • с более полезным именем, чем .tmpwhatever
  • определение того, когда и хочет ли пользовательперейдите к следующему diff или выйдите.

Две существующие библиотеки вспомогательного кода сценария оболочки имеют некоторые недостатки, так что если ваша программа относительно проста в использовании, существующие помощники могут запустить ее самостоятельно. Им просто нужно знать , где находится исполняемый файл и какие аргументы передать и , доверять ли его коду выхода . Вы можете установить их с помощью git config, установив difftool.<em>name</em>.cmd и mergetool.<em>name</em>.trustExitCode. Например:

git config --global difftool.foo.cmd '<path> "$LOCAL" "$REMOTE"'
git config --global mergetool.foo.trustExitCode true

будет в порядке (но не так уж и здорово: имена файлов будут странными и бесполезными), если команда в path выйдет из нуля для "перейти кnext diff "и ненулевое значение для" выйти сейчас ".

0 голосов
/ 01 ноября 2019

Инструмент сравнения (например, http://meldmerge.org/) покажет вам различия в 2, 3 или даже 4 панелях (ваша версия, удаленная версия, объединенная версия, версия предка).

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

0 голосов
/ 01 ноября 2019

git diff будет отображаться на вашей консоли, если вывод будет коротким, в противном случае он перейдет на ваш пейджер. т. е. less или more

git difftool будет отображаться в формате tkdiff, xxdiff, meld, сравнивать gvimdiff, ... или что бы вы ни установили

Difftools часто позволяют редактировать файл, покапейджер только для чтения

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...