如何为 github 中两个分支之间的单个文件生成 diff

我需要为一个文件生成一个 diff,它将显示两个版本之间的差异,这两个版本实际上是 github 中的标记。然后我想把这个 diff 通过电子邮件发送给某人,这样一个 github 的 diff URL 将是理想的。Github 比较视图允许我对所有已更改的文件执行此操作,但这样做没有用,因为我的回购文件中有数千个文件。

我可以在命令行中这样做,但这没有帮助,因为我需要通过电子邮件将 diff 发送给某人:

git diff tag1 tag2 -- path/to/file

我找到了这里讨论的命令行版本: 如何看到本地分支和远程分支在指定文件中的差异?

135249 次浏览

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

  • 把你要找的文件的链接复制到剪贴板上,然后就完事了。

例如,考虑到上面的差异,链接 译自: 美国《科学》杂志网站(href = “ https://github.com/libgit2/libgit2Sharp/ゑ/v0.9.0.v0.9.5 # diff-11”rel = “ noReferrer”> https://github.com/libgit2/libgit2sharp/compare/v0.9.0...v0.9.5#diff-11将指向在 v0.9.0和 v0.9.5之间发生的 LazyFixtures.cs更改。

更新

根据您的注释,您的 diff 太大,不能通过 Web 界面呈现,那么还是使用老的命令行工具吧?您可以将 diff 的输出重定向到一个文件,然后将该文件作为电子邮件附件发送。

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

对于那些只想查看(而不是下载) GitHub 网页上文件的历史/代码更改修订的用户:

在 GitHub 上转到该文件,然后选择 历史。这将打开一个包含提交链接列表的页面,如下所示。

Screenshot of a GitHub file history page showing that commit titles and hashes are clickable

在单击它时,它将显示代码更改。单击历史记录后,可以单击包来查看所有文件的包级别提交。

在 Eclipse 中,您可以使用 艾吉特插件和文件上的“右键单击-> Compare with”来比较历史记录。 在 Eclipse 中如何比较 git 中的两个修订版本?

我使用 无效令牌的回答编写了一个简单的方便脚本,用于从命令行提取 GitHub 上两次提交之间的差异。

你可以找到 大意完整的剧本,但这里有一些好的地方:

# 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 栏中,然后可以复制该字符串。

下面是应用以下问题时的解决办法。

这个比较很大! 我们只显示了最近的250次提交

复制要与 https://gist.github.com/进行比较的文件的原始视图。使用要比较的两个特定提交点。从较早的提交开始。

当你点击“修订”时, https://gist.github.com/ 有一个很好的并排 diff 视图。

由于这仍然是不可能的,这里有一个基于浏览器的 diff-tool 方法。它不利用自动化,只要求安装 Chrome 扩展:

  1. 为 Chrome 浏览器安装 Diff 工具: https://chrome.google.com/webstore/detail/diff-tools-text-pdf-doc-o/lkcdojpmjehlniamnglpjlldkoonlomb
  2. 打开差分工具(http://iblogbox.com/devtools/diff/)
  3. 从 GitHub 转到 BEFORE 提交、标记或分支,打开文件,然后单击 Raw按钮获取原始文件视图,选择-all 并复制,然后放入 Diff Tools 的左侧文本框
  4. 对 AFTER 文件重复步骤3,并粘贴到 Diff Tools 的右侧框中
  5. 单击 Compare Now并执行 diff ad-hoc