git difftool, немедленно открывайте все файлы diff, а не в последовательном
Поведение git diff по умолчанию заключается в открытии каждого файла сравнения последовательно (дождитесь закрытия предыдущего файла перед открытием следующего файла).
Я ищу способ открыть все файлы одновременно - в BeyondCompare, например, это откроет все файлы на вкладках в одном и том же окне BC.
Это облегчит рассмотрение сложного набора изменений; пролистайте назад и вперед файлы diff и проигнорируйте неважные файлы.
13 ответов
Вот что я остановился на...
Скопируйте следующий код в файл с именем 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...
Примечания. Ключом к нему является & param, который указывает внешней команде diff запускаться в фоновом режиме, чтобы файлы обрабатывались немедленно. В случае BeyondCompare это открывает один экран с каждым файлом в отдельной вкладке.
Начиная с git
v1.7.11, вы можете использовать git difftool --dir-diff
выполнить каталог 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.
Я собрал сценарий оболочки на основе этого потока электронной почты, который выполняет директорию diff между произвольными коммитами.
Начиная с git v1.7.10, git-diffall
сценарий включен в contrib
стандартной установки git.
Для версий до v1.7.10 вы можете установить с git-diffall
проект на GitHub.
Вот описание проекта:
Скрипт git-diffall предоставляет механизм сравнения на основе каталогов для git. Сценарий использует опцию конфигурации diff.tool, чтобы определить, какой просмотрщик различий используется.
Этот скрипт совместим со всеми формами, используемыми для указания диапазона ревизий для сравнения:
1)
git diffall
: показывает разницу между рабочим деревом и поэтапными изменениями
2)git diffall --cached [<commit>]
: показывает разницу между поэтапными изменениями иHEAD
(или другой именованный коммит)
3)git diffall <commit>
: показывает разницу между рабочим деревом и именованным коммитом
4)git diffall <commit> <commit>
: показать различие между двумя именованными коммитами
5)git diffall <commit>..<commit>
: то же, что и выше
6)git diffall <commit>...<commit>
: показать изменения на ветви, содержащей и вплоть до второго, начиная с общего предка обоих<commit>
Примечание: все формы имеют дополнительный ограничитель пути
[--] [<path>]
Этот скрипт основан на примере, представленном Томасом Растом в списке Git.
meld
имеет удобную функцию: если вы дадите ему каталог под управлением исходного кода (Git, Mercurial, Subversion, Bazaar и, возможно, другие), он автоматически выведет список всех измененных файлов, и вы сможете дважды щелкнуть, чтобы просмотреть индивидуальные различия.
ИМО гораздо проще набрать meld .
и заставить его выяснить VCS, чем настроить VCS для запуска meld
, Кроме того, вы можете использовать одну и ту же команду независимо от того, какую VCS использует ваш проект, и это здорово, если вы часто переключаетесь между ними.
Единственный недостаток - медленнее сканировать изменения, чем передавать изменения из git / hg / svn, хотя то, насколько он медленный, чтобы быть проблемой, будет зависеть от того, как вы его используете, я уверен.
Следующие работы с meld и kdiff3
git difftool --dir-diff origin/branch1..origin/branch2
Открывает все файлы в окне, которое вы можете легко просматривать. Может использоваться с наборами изменений вместо происхождения / имени филиала
например: git difftool --dir-diff origin/master..24604fb72f7e16ed44115fbd88b447779cc74bb1
Я нашел этот метод (GitDiff.bat и GitDiff.rb), который копирует файлы в старые / новые временные каталоги, а затем сравнивает папки с ними.
Но я бы предпочел просматривать рабочие файлы напрямую (из рабочего каталога), поскольку у BeyondCompare есть удобная функция, позволяющая редактировать файл из окна diff, что отлично подходит для быстрой очистки.
Изменить: аналогичный метод здесь в ответ на мой вопрос в списке рассылки git.
git meld
=> https://github.com/wmanley/git-meld - это потрясающий скрипт, который откроет аккуратный diff всех файлов в одном окне.
Здесь замечено, что у Araxis Merge есть опция команды -nowait:
-nowait Предотвращает сравнение от ожидания закрытия сравнения
Может быть, это возвращает код немедленного выхода и будет работать, кто-нибудь испытал это? Не могу найти похожую опцию для BeyondCompare...
Diffuse также имеет интеграцию с VCS. Он взаимодействует с множеством других VCS, в том числе SVN, Mercurial, Bazaar, ... Для Git, он даже покажет три панели, если некоторые, но не все изменения поставлены. В случае конфликтов будет даже четыре панели.
Вызвать его с
diffuse -m
в вашей рабочей копии Git.
Если вы спросите меня, лучшее визуальное отличие, которое я видел за десятилетие. (И я тоже попробовал смесь.)
Для тех, кто заинтересован в использовании git-diffall в Mac OS X с Araxis, я разработал проект git-diffall на github и добавил AppleScript, заключающий в себе команду Araxis Merge. Примечание: это слегка модифицированный клон araxisgitdiff
файл, поставляемый с Araxis Merge для Mac OS X.
Если все, что вы хотите сделать, это открыть все файлы, которые в данный момент изменены, попробуйте что-то вроде:
vi $ (git status | sed -n '/.*modified: * / s /// p')
Если вы делаете коммиты "сложных наборов изменений", вы можете пересмотреть свой рабочий процесс. Одной из действительно приятных особенностей git является то, что он позволяет разработчику легко сводить сложные наборы изменений к серии простых патчей. Вместо того, чтобы пытаться редактировать все файлы, которые в данный момент изменены, вы можете посмотреть на
git add --patchчто позволит вам выборочно ставить куски.
Я написал скрипт powershell, который будет дублировать два рабочих дерева и сравнивать их с DiffMerge. Так что вы можете сделать:
GitNdiff master~3 .
Например, чтобы сравнить основную ветку три проверки назад с текущим рабочим деревом.
Это блестящий и новый и, вероятно, полный ошибок. Недостатком является то, что файлы в вашем рабочем дереве, которые еще не были добавлены, копируются в оба рабочих дерева. Это также может быть медленным.
Написал небольшой инструмент для открытия всех файлов в виде вкладок в vim.
Вы можете использовать Gitk и увидеть все различия одновременно