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

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

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

git diff tag1 tag2 -- path/to/file

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

Ответ 1

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-адрес, предназначенный для определенного файла:

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

changed-tab

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

show-diff

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

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

Update

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

$ git diff v0.9.0 v0.9.5 -- LibGit2Sharp.Tests/LazyFixture.cs > /tmp/lazyfixture.diff

Ответ 2

Вот мое обходное решение, когда применяется следующая проблема.

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

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

https://gist.github.com/ имеет приятный бок о бок diff, когда вы нажимаете "Revisions".

Ответ 3

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

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

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

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

Ответ 4

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

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

# Parse the following patterns for repo urls to get the github repo url
# https://github.com/owner/repo-name.git
# [email protected]: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, которую вы затем можете скопировать.