Как сгенерировать разницу для одного файла между двумя ветками в github

111

Мне нужно создать diff для одного файла, который покажет различия между двумя версиями, которые на самом деле являются тегами в github. Затем я хочу отправить эту разницу кому-нибудь по электронной почте, чтобы URL-адрес github для сравнения был идеальным. Просмотр сравнения github позволит мне сделать это для всех измененных файлов, но это бесполезно, так как в моем репо тысячи файлов.

Я могу сделать это в командной строке следующим образом, но это не помогает, поскольку мне нужно отправить разницу кому-то по электронной почте:

git diff tag1 tag2 -- path/to/file

Я нашел версию командной строки, обсуждаемую здесь: как я могу увидеть различия в назначенном файле между локальной ветвью и удаленной ветвью?

простой ароматизатор
источник

Ответы:

90

GitHub предоставляет только способ показать разницу между двумя коммитами.

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

https://github.com/{user}/{repository}/compare/{from-tag}...{until-tag}

В качестве примера https://github.com/libgit2/libgit2sharp/compare/v0.9.0...v0.9.5 показывает разницу между двумя версиями проекта LibGit2Sharp. Этот diff включает все измененные файлы.

Если вы хотите получить URL-адрес, предназначенный для определенного файла:

  • Перейдите на вкладку " Файлы измененные".

измененная вкладка

  • Нажмите кнопку Show Diff Stats (это отобразит список измененных файлов в виде ссылок)

show-diff

  • Скопируйте в буфер обмена ссылку на конкретный файл, который вам нужен ... и Тада! Готово.

Например, учитывая приведенную выше разницу , ссылка https://github.com/libgit2/libgit2sharp/compare/v0.9.0...v0.9.5#diff-11 будет указывать на LazyFixtures.csизменения, которые произошли между версией v0.9.0 и v0.9.5.

Обновить

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

$ git diff v0.9.0 v0.9.5 -- LibGit2Sharp.Tests/LazyFixture.cs > /tmp/lazyfixture.diff
нулевой токен
источник
8
Привет, похоже, это не сработает для меня, потому что моя разница слишком велика. Я получаю: «Это большое различие! Мы показываем информацию о статусе только для первых 2 500 файлов». поэтому я получаю только статистику различий, а не полные различия, даже со ссылками #diff.
plainflavour
1
однако я думаю, что вы правы - это способ сделать это. Спасибо
plainflavour
1
Вы также можете использовать это расширение Chrome github.com/danielribeiro/github-diff-highlight-extension, чтобы выделить синтаксис при сравнении веток.
Даниэль Рибейро,
3
@plainflavour Еще один полезный совет на тот случай, если вы снова столкнетесь с этим - всякий раз, когда у вас есть URL-адрес сравнения, например @nulltoken, вы также можете просто добавить .diff в конец URL-адреса, чтобы увидеть полную разницу (хотя и в виде открытого текста ). Например, https://github.com/{user}/{repository}/compare/{from-tag}...{until-tag}.diff источник
dmccabe
1
Я не вижу кнопки " Показать статистику различий". Это ушло? Или я просто этого не вижу?
dckc
7

Вот мой способ решения следующей проблемы.

Это большое сравнение! Мы показываем только 250 последних коммитов

Скопируйте необработанное представление файла, который вы хотите сравнить, на https://gist.github.com/ . Используйте две конкретные точки фиксации, которые вы хотите сравнить. Начните со старого коммита.

https://gist.github.com/ имеет удобное параллельное представление различий, когда вы нажимаете «Редакции».

f01
источник
3
Спасибо, это именно то предложение, которое мне нужно для gist.github.com/ncoghlan/1067805fe673b3735ac854e195747493/… ! :)
ncoghlan 09
3

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

Перейдите к этому файлу в github, затем выберите ИСТОРИЯ . Откроется страница со списком ссылок на комментарии, как показано ниже.

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

В eclipse вы можете сравнить историю с помощью плагина EGit и «Щелкните правой кнопкой мыши -> Сравнить с» в файле. Как я могу сравнить две версии в git в Eclipse?

Канагавелу Сугумар
источник
1
Чтобы быть более точным, вы нажимаете на «имя» коммита из 7 шестнадцатеричных цифр (при наведении курсора на него нет ярлыка или подсказки, оно рядом с правой стороной, рядом с «копией в буфер обмена» icon), и вы попадете на страницу, которая показывает разницу между версией этой фиксации и предыдущей версией, как я предполагаю.
JonathanZ поддерживает MonicaC
@ Джонатан Да; это правда
Канагавелу Сугумар
Эй, я не видел снимок экрана в прошлый раз. Я не знаю, просто ли он не загружался для меня тогда или вы добавили его с тех пор, но в любом случае спасибо за ваш ответ; Здорово.
JonathanZ поддерживает MonicaC
Для коммита 5000 файлов это не приводит меня к однофайловому различию. Из этой истории попробуйте найти дельту этого файла из этого огромного коммита .
Карл Уолш
0

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

Вы можете найти полный сценарий в gist , но вот хорошие моменты:

# Parse the following patterns for repo urls to get the github repo url
# https://github.com/owner/repo-name.git
# git@github.com:owner/repo-name.git
BASE_URL="https://github.com/""$(git config --get remote.origin.url | sed 's/.*github\.com[/:]\(.*\).git/\1/')""/compare"

if [[ "$#" -eq 1 ]]; then
  if [[ "$1" =~ .*\.\..* ]]; then
    # Handle "git hubdiff fromcommit..tocommit"
    open "${BASE_URL}/$(git rev-parse "${1/\.\.*/}")...$(git rev-parse ${1/*\.\./})"
  else
    # Handle "git hubdiff fromcommit"
    open "${BASE_URL}/$(git rev-parse "$1")...$(git rev-parse HEAD)"
  fi
elif [[ "$#" -eq 2 ]]; then
  # Handle "git hubdiff fromcommit tocommit"
  open "${BASE_URL}/$(git rev-parse "$1")...$(git rev-parse "$2")"
fi

Он принимает в качестве аргументов ветки, коммиты и все остальное, что может быть разрешено git rev-parse. Я использовал open, который работает только в macOS для открытия веб-страниц, поэтому, если вы находитесь в другой среде, вы захотите настроить это.

Как и в случае с ответом nulltoken, чтобы указать на один файл в diff, вам нужно будет щелкнуть заголовок файла, чтобы строка привязки появилась в строке URL-адреса, которую вы затем можете скопировать.

Крис
источник
каким-либо способом получить строку привязки для сравнения, которая не отображает нужный файл, потому что их слишком много?
sgarg 09
@sgarg Якорь - "diff- <md5 of the filename>" - не задокументировано AFAIK - но меня это раздражало, и я догадался.
Бен Уолдинг,
0

Поскольку это все еще невозможно, вот метод diff-tool на основе браузера. Он не использует автоматизацию, а требует только возможности установки расширений Chrome:

  1. Установите Diff Tools для браузеров Chrome: https://chrome.google.com/webstore/detail/diff-tools-text-pdf-doc-o/lkcdojpmjehlniamnglpjlldkoonlomb
  2. Откройте Diff Tools ( http://iblogbox.com/devtools/diff/ )
  3. Из GitHub перейдите в раздел ПЕРЕД фиксацией, тегом или веткой, откройте файл, затем нажмите Rawкнопку, чтобы получить необработанное представление файла, выберите все и скопируйте, затем поместите в текстовое поле слева в Diff Tools
  4. Повторите шаг 3, но для файла AFTER, и вставьте его в правое поле в Diff Tools.
  5. Нажмите Compare Nowи выполните специальное сравнение
kayleeFrye_onDeck
источник