git difftool, немедленно открывайте все файлы diff, а не в последовательном - PullRequest
223 голосов
/ 03 августа 2009

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

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

Это упростит просмотр сложного набора изменений; пролистывайте файлы diff и вперед и игнорируйте неважные файлы.

Ответы [ 12 ]

197 голосов
/ 30 апреля 2010

Начиная с git v1.7.11, вы можете использовать git difftool --dir-diff для выполнения различий в каталогах.

Эта функция хорошо работает, например, с Meld 3.14.2 и позволяет просматривать все измененные файлы:

git difftool --dir-diff --tool=meld HEAD~ HEAD

Это удобная функция Bash:

git-diff-meld() (
  git difftool --dir-diff --tool=meld "${1:-HEAD~}" "${2:-HEAD}"
)

Следующий ответ относится к git установкам старше v1.7.11.


Этот же вопрос был задан в списке git mail .

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

Начиная с git v1.7.10, скрипт git-diffall входит в contrib стандартной установки git.

Для версий до v1.7.10 вы можете установить из git-diffall проекта на GitHub .

Вот описание проекта:

Скрипт git-diffall предоставляет механизм сравнения на основе каталога для мерзавец. Сценарий опирается на опция конфигурации diff.tool для определите, какая программа просмотра различий используется.

Этот скрипт совместим со всеми формы, используемые для указания диапазона изменения в diff:

1) git diffall: показывает разницу между рабочее дерево и поэтапные изменения
2) git diffall --cached [<commit>]: показывает разница между поэтапными изменениями и HEAD (или другой именованный коммит)
3) git diffall <commit>: показывает разницу между рабочее дерево с именем commit
4) git diffall <commit> <commit>: показать разницу между двумя именованными коммитами
5) git diffall <commit>..<commit>: так же, как выше
6) git diffall <commit>...<commit>: показать изменения на ветке, содержащей и до во-вторых, начиная с общего предок обоих <commit>

Примечание: все формы имеют необязательный путь ограничитель [--] [<path>]

Этот скрипт основан на примере предоставленный Томасом Растом на Git список .

61 голосов
/ 18 августа 2009

Вот на чем я остановился ...

Скопируйте следующий код в файл с именем git-diffall (без расширения):

#!/bin/sh
git diff --name-only "$@" | while read filename; do
    git difftool "$@" --no-prompt "$filename" &
done

Поместите файл в папку cmd вашего каталога git install (например, C:\Program Files (x86)\Git\cmd)

И использовать, как вы бы git diff:

git diffall
git diffall HEAD
git diffall --cached 
git diffall rev1..rev2
etc...

Примечания. Ключом к этому является параметр & , который указывает внешней команде diff запускаться в фоновом режиме, поэтому файлы обрабатываются немедленно. В случае BeyondCompare это открывает один экран с каждым файлом на отдельной вкладке.

19 голосов
/ 16 ноября 2010

meld имеет удобную функцию: если вы дадите ему каталог под управлением исходного кода (Git, Mercurial, Subversion, Bazaar и, возможно, другие), он автоматически выведет список всех измененных файлов, и вы можете удвоить -нажмите, чтобы увидеть индивидуальные различия.

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

Единственный недостаток - медленнее сканировать изменения, чем передавать изменения из git / hg / svn, хотя достаточно ли медленно, чтобы быть проблемой, будет зависеть от того, как вы его используете. точно.

3 голосов
/ 18 октября 2011

git meld => https://github.com/wmanley/git-meld - это потрясающий скрипт, который откроет аккуратный diff всех файлов в одном окне.

3 голосов
/ 03 августа 2009

Я нашел этот метод (GitDiff.bat и GitDiff.rb), который копирует файлы в старые / новые временные каталоги, а затем сравнивает папки с ними.

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

Редактировать: аналогичный метод здесь в ответ на мой вопрос в списке рассылки git.

2 голосов
/ 25 октября 2012

Диффузный также имеет интеграцию с VCS. Он взаимодействует с множеством других VCS, включая SVN, Mercurial, Bazaar, ... Для Git он даже покажет три панели, если какие-то, но не все изменения, поставлены. В случае конфликтов будет даже четыре панели.

Screenshot of diffuse with staged and unstaged edits

вызвать его с

diffuse -m

в вашей рабочей копии Git.

Если вы спросите меня, лучшее визуальное отличие, которое я видел за десятилетие. (И я тоже попробовал смесь.)

1 голос
/ 29 июня 2018

Следующее работает с meld и kdiff3

git difftool --dir-diff origin/branch1..origin/branch2

Открывает все файлы в окне, которое вы можете легко просматривать. Может использоваться с наборами изменений вместо происхождения / имени ветви

Например: git difftool --dir-diff origin/master..24604fb72f7e16ed44115fbd88b447779cc74bb1

1 голос
/ 17 февраля 2011

Для тех, кто заинтересован в использовании git-diffall на Mac OS X с Araxis, я разветвил проект git-diffall на github и добавил AppleScript, который обертывает команду Araxis Merge. Примечание. Это слегка измененный клон файла araxisgitdiff, поставляемый с Araxis Merge для Mac OS X.

https://github.com/sorens/git-diffall

1 голос
/ 01 июля 2010

Я написал скрипт powershell, который будет дублировать два рабочих дерева и сравнивать их с DiffMerge. Так что вы можете сделать:

GitNdiff master~3 .

Например, чтобы сравнить основную ветвь три проверки назад с текущим рабочим деревом.

Блестящий, новый и, вероятно, полный ошибок. Недостатком является то, что файлы в вашем рабочем дереве, которые еще не были добавлены, копируются в оба рабочих дерева. Это также может быть медленным.

http://github.com/fschwiet/GitNdiff

1 голос
/ 11 августа 2009

Если все, что вы хотите сделать, это открыть все файлы, которые в данный момент изменены, попробуйте что-то вроде:

vi $(git status | sed -n '/.*modified: */s///p')

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

git add --patch
, что позволит вам выборочно ставить фрагменты.
...