Git Visual Diff между ветвями

196

Этот ответ отлично подходит для просмотра визуальных различий между двумя файлами, которые включены в git: Как просмотреть вывод 'git diff' с помощью программы визуальных различий?

Тем не менее, я хотел бы видеть визуальный контраст между двумя ветвями. Пока что моя лучшая ставка выглядит так:

git diff --name-status master dev

который не очень информативен и не очень визуален.

Есть ли что-нибудь лучше там?

Snowcrash
источник
Я добавил ответ ниже, включая визуальное изображение, которое ранее здесь не было адресовано: как увидеть, какие ветви коммитов содержат (в общем или уникально). Вы можете многое сделать с основной функциональностью git. Возможно, было бы неплохо указать, что вы хотели бы включить в визуальные различия. Большинство ответов сосредоточены на построчном различении коммитов, где ваш пример фокусируется на именах файлов, затронутых в данном коммите.
Кей V

Ответы:

227

Используйте git diffс диапазоном .

git diff branch1..branch2

Это позволит сравнить советы каждой ветви.

Если вам действительно нужно программное обеспечение с графическим интерфейсом, вы можете попробовать что-то вроде SourceTree, которое поддерживает Mac OS X и Windows.

Алекс
источник
27
Это не визуальная лань. ;)
морпехи
35
В системах Linux я рекомендую установить Meld, а затем установить его по умолчанию difftoolс git config --global diff.tool meldи , наконец , запустить его вместо равнины diffс git difftool branch1..branch2. Результат выглядит намного лучше.
Габриэль
8
с помощью Meld Visual Difftool без git config:git difftool -t meld branch1..branch2
user3780389
2
Для читателей: Начиная с моего поста, каждый ответ дает способ сделать то, о чем просил человек (разница в графическом интерфейсе), за исключением этого ответа.
Г Хаксли,
3
@ GHuxley, где ОП запрашивает решение с графическим интерфейсом?
Алекс
97

Чтобы увидеть визуальные различия всех различий между двумя ветвями, мне нравится объединять эти две ветви - БЕЗ фиксации слияния - и затем использовать git guiили git Extensions, чтобы получить обзор различий.

Командная строка Git для слияния без коммитов:

git checkout branchA
git merge --no-commit --no-ff branchB

Затем, когда вы закончите, вы можете отменить слияние с

git merge --abort

(h / t к @ jcugat's для комментария)

Тормод Хистад
источник
10
Не стоит недооценивать актуальность этого подхода, если вам нравится использование вашей IDE (или другой не всегда простой в интеграции с Git difftool GUI)! Этот вариант для меня замечательный, так как я использую Intellij и предпочитаю иметь возможность прокручивать измененные файлы в IDE во всем его синтаксисе, подсвечивании ошибок, подсвечивании мертвого кода, редактировании на месте. Я использую этот подход для всех моих обзоров кода, и я оставил ужасный инструмент для сравнения запросов на загрузку в GitHub. Я даже могу вносить изменения по ходу работы, а когда я закончу, я просто создаю новую ветку с добавленным «-code-review» и фиксирую!
kghastie
2
Он работает до тех пор, пока нет конфликтов слияния, и завершается ошибкой при любых конфликтах слияния.
Нага Киран
1
Мне очень нравится такой подход! Кроме того, по крайней мере для меня в git guiнем показаны конфликты как неустановленные, а не конфликты как постановочные, так что вы получите хорошее различие даже. Помогает мне гораздо больше, чем самый лучший ответ: D
DJGummikuh
55

Если вы используете Intellij Idea IDE, вы можете просто использовать опцию сравнения в ветке.

введите описание изображения здесь

Камаль Редди
источник
Есть ли какие-либо конфигурации / опции / настройки, чтобы изменить это сравнение? (например, --ignore-space-at-eol для git diff)
Superole
49

Вы также можете легко сделать это с помощью gitk.

> gitk branch1 branch2

Сначала нажмите на кончик ветки1. Теперь щелкните правой кнопкой мыши на кончике branch2 и выберите Diff this-> selected.

Мартин
источник
7
Использование gitk branch1..branch2только показывает коммиты между двумя ревизиями.
T3rm1
используя gitk (без branch1 branch2), если вы хотите увидеть все изменения, которые вы внесли в вашу ветку.
mikewasmike
31

Для тех из вас, кто использует Windows в TortoiseGit, вы можете получить несколько визуальное сравнение с помощью этой довольно неясной функции:

  1. Перейдите к папке, которую вы хотите сравнить
  2. Удерживайте shiftи щелкните правой кнопкой мыши
  3. Перейти к TortoiseGit -> Обзор ссылок
  4. Используйте, ctrlчтобы выбрать две ветви для сравнения
  5. Щелкните правой кнопкой мыши ваш выбор и нажмите «Сравнить выбранные ссылки»

Источник: http://wikgren.fi/compare-diff-branches-in-tortoise-git-or-how-to-preview-changes-before-doing-a-merge/

Oversearch
источник
Почему вы должны удерживать смену?
Ноль3
1
Удерживая нажатой клавишу shift при щелчке правой кнопкой мыши, всегда открывается полное меню TortoiseGit, если вы настроили TortoiseGit, чтобы он не отображал определенные элементы.
Oversearch
Это круто. Хотелось бы, чтобы это была более заметная особенность.
Дрю
22

Если вы используете OSX или Windows 7+, Atlassian SourceTree работает очень хорошо для этого. Это бесплатно.

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

введите описание изображения здесь

Предполагая, что вы отметили ветвь объекта и хотите увидеть разницу с «master», щелкните правой кнопкой мыши ветку «master» и выберите «Diff против тока».

К сожалению, не похоже, что он будет доступен в дистрибутивах * nix в ближайшее время .

Джордан Паркер
источник
3
Это может быть «бесплатно», но, безусловно, требуется некоторое время, чтобы прочитать их регистрационные условия использования: atlassian.com/legal/customer-agreement Мне до сих пор нравился инструмент, но это может оттолкнуть меня.
akauppi
@akauppi Какие части вас отталкивают? Я думал , что все эти соглашения были в значительной степени то же самое
Алекс
Это было больше года назад. Да, соглашения могут быть похожими, но это был процесс, который подталкивал меня к SourceTree. Это было странно. Прошло, однако. У меня не будет подробностей для вас. Извините
akauppi
16

Попробуйте "difftool" (при условии, что у вас есть настройки diff) - см. Https://www.kernel.org/pub/software/scm/git/docs/git-difftool.html.

Я нахожу статус имени хорошим для сводки, но difftool будет повторять изменения (и -dопция дает вам представление каталога), например

$ git difftool their-branch my-branch

Viewing: 'file1.txt'
Launch 'bc3' [Y/n]:
...

Или, как упомянуто @ rsilva4 с -dтекущей веткой и по умолчанию это просто - например, сравните с master:

$  git difftool -d master..

... и да - есть много вариантов - https://www.kernel.org/pub/software/scm/git/docs/git-reset.html

Пол Колер
источник
3
Спасибо, это было полезно. Добавление опции -d сделает вещи еще лучше:git difftool -d their-abc my-abc
rsilva4
Так как в данный момент на -d --dir-diff: Copy the modified files to a temporary location and perform a directory diff on them. This mode never prompts before launching the diff tool.
сайтеhellhell.com нет
8

Если вы используете GitHub, вы можете использовать веб-сайт для этого:

github.com/url/to/your/repo/compare/SHA_of_tip_of_one_branch...SHA_of_tip_of_another_branch

Это покажет вам сравнение двух.

Arron
источник
Это работает (я делаю это все время), но требует, чтобы вы отправили свой код в репозиторий github. Хотя, на мой взгляд, это не совсем приемлемая оговорка.
adamwong246
2
или просто так github.com/url/to/your/repo/compare/и потом можно выбирать ветки
карамба
И как мне получить этот SHA? Я имею в виду, что означает SHA кончика ветви?
Оптимус Прайм
8

В GitExtensions вы можете выбрать обе ветви в сетке ревизий Ctrlнажатием. Затем вы можете увидеть файлы, которые отличаются между этими ветвями. Когда вы выберете файл, вы увидите diff для него.

Взято отсюда

Mahmoodvcs
источник
У меня выбрано 2 ветви в моей сетке ревизий, но я не вижу никаких команд сравнения в меню вверху или когда я щелкаю правой кнопкой мыши.
Эрик
1
Я нашел это в заголовках нижней панели. Есть Коммит, Дерево файлов и Дифф.
Эрик
7

ОБНОВИТЬ

Mac: сейчас я использую SourceTree. Тщательно рекомендуется. Мне особенно нравится, как вы можете ставить / не ставить куски.

Linux: я имел успех с:

  • SmartGit
  • GitKraken
  • meld

Например, чтобы установить smartgitна Ubuntu:


Это делает работу:

git-diffall с инструментом различий в GUI, таким как meld. Смотрите пункт 5 здесь:

http://rubyglazed.com/post/15772234418/git-ify-your-command-line

Здесь есть хороший пост о git и meld: http://nathanhoad.net/how-to-meld-for-git-diffs-in-ubuntu-hardy

Snowcrash
источник
4

Если вы используете Eclipse, вы можете визуально сравнить текущую ветку в рабочей области с другим тегом / веткой:

Сравнение рабочего пространства Eclipse

Алессандро Диониси
источник
Лично я нахожу поддержку Eclipse для различий, но если это все, что у вас есть, то все в порядке.
ysap
4

Вы также можете использовать бесплатный P4Merge от Perforce, чтобы сделать это:

http://www.perforce.com/product/components/perforce-visual-merge-and-diff-tools

введите описание изображения здесь

Подробности его интеграции с Git можно найти здесь и здесь.

но краткое резюме по ссылкам выше:

  • Поместите следующие биты в ваш ~ / .gitconfig, и тогда вы можете сделать $ git mergetoolи$ git difftool использовать p4merge
  • Обратите внимание, что по- $ git diffпрежнему будет использоваться встроенное средство просмотра различий по умолчанию :) (протестировано с версией git 1.8.2)

Изменения для .gitconfig

[merge]
  keepBackup = false
    tool = p4merge
[mergetool "p4merge"]
    cmd = /Applications/p4merge.app/Contents/Resources/launchp4merge "\"$PWD/$BASE\"" "\"$PWD/$REMOTE\"" "\"$PWD/$LOCAL\"" "\"$PWD/$MERGED\""
    keepTemporaries = false
    trustExitCode = false
    keepBackup = false
[diff]
    tool = p4merge
[difftool "p4merge"]
    cmd = /Applications/p4merge.app/Contents/Resources/launchp4merge "\"$REMOTE\"" "\"$LOCAL\""
Брэд Паркс
источник
2

Если вы используете отличный редактор WebStorm, вы можете сравнить его с любой веткой: Webstorm Git сравнить

Нико
источник
На самом деле я только что заметил, что IntelliJ IDEA (предположительно также WebStorm) обладает способностью «Выделять невыбранные коммиты», что очень четко показывает, какие коммиты существуют в ветви, а не в другом.
arthurakay
Да, я просто использовал intellij, чтобы выборочно откатить множество изменений, внесенных в репо, с помощью «автоформата при сохранении». Было очень легко ... Нужно было найти опцию «Сравнить раньше с местным», чтобы сделать это, хотя
Том Х
1

Посмотри на git show-branch

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

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

Для этого визуала я большой поклонник git show-branch; он разбивает хорошо организованную таблицу коммитов на ветку назад к общему предку. - чтобы попробовать его в репо с несколькими ветвями с расхождениями, просто наберите git show-branchи проверьте вывод - для рецензии с примерами см. Сравнение коммитов между ветвями Git

Кей V
источник
0

Вот как можно увидеть визуальную разницу между целыми коммитами, в отличие от отдельных файлов, в Visual Studio (протестировано в VS 2017). К сожалению, он работает только для коммитов в пределах одной ветви: в «Team Explorer» выберите представление «Branches», щелкните правой кнопкой мыши по репо и выберите «View history», как показано на следующем рисунке.

введите описание изображения здесь

Затем история текущей ветки появляется в основной области. (Там, где ветви, которые закончились как более ранние коммиты на текущей ветке, помечены метками.) Теперь выберите пару коммитов с помощью Ctrl-Left, затем щелкните правой кнопкой мыши и выберите «Сравнить коммиты ...» во всплывающем меню.

Более подробную информацию о сравнении филиалов в мире Microsoft, увидеть этот StackOverflow вопрос: Различия между GIT ветвей с помощью Visual Studio .

Карстен Фюрманн
источник
1
Показывает только историю одной ветви, поэтому не может сравнивать между ветками.
Михал Фита