133

我需要为单个文件生成一个差异,以显示两个版本之间的差异,这实际上是 github 中的标签。然后我想通过电子邮件将此差异发送给某人,因此差异的 github URL 将是理想的。github 比较视图将允许我对所有更改的文件执行此操作,但这并不好,因为我的存储库中有数千个文件。

我可以在命令行中按如下方式执行此操作,但这无济于事,因为我需要通过电子邮件将差异发送给某人:

git diff tag1 tag2 -- path/to/file

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

4

5 回答 5

115

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 项目的两个版本之间的差异。此差异包括所有修改后的文件。

如果要检索以特定文件为目标的 URL:

  • 切换到“文件已更改”选项卡

更改标签

  • 点击Show Diff Stats按钮(这将显示修改文件列表作为链接)

显示差异

  • 将您所追求的特定文件的链接复制到剪贴板......和Tada!你完成了。

例如,鉴于上面的差异,链接https://github.com/libgit2/libgit2sharp/compare/v0.9.0...v0.9.5#diff-11将指向LazyFixtures.cs版本 v0.9.0 和v0.9.5。

更新

根据您的评论指出您的差异太大而无法通过 Web 界面呈现,那么恢复到良好的旧命令行工具怎么样?您可以将 diff 的输出重定向到一个文件,然后将该文件作为电子邮件附件发送。

$ git diff v0.9.0 v0.9.5 -- LibGit2Sharp.Tests/LazyFixture.cs > /tmp/lazyfixture.diff
于 2013-01-24T14:18:46.497 回答
13

当以下问题适用时,这是我的解决方法。

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

将要比较的文件的原始视图复制到https://gist.github.com/。使用您要比较的两个特定提交点。从较旧的提交开始。

当您单击“修订”时, https://gist.github.com/有一个很好的并排差异视图。

于 2017-02-25T16:05:23.033 回答
3

答案适用于只想查看(不下载)GITHUB 网页中文件的代码更改历史/修订以进行先前签入的人。

转到 github 中的那个文件,然后选择HISTORY。这将打开带有签入评论链接列表的页面,如下所示。

在此处输入图像描述 单击它将显示代码更改。点击历史后;您可以单击包以查看包级别的所有文件签入。

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

于 2015-11-03T08:57:15.747 回答
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 栏中,然后您可以复制它。

于 2017-01-05T04:14:11.893 回答
0

由于这仍然是不可能的,这里有一个基于浏览器的 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 commit、tag 或 branch,打开文件,然后单击Raw按钮以获取原始文件视图,全选并复制,然后放入 Diff Tools 中的左侧文本框
  4. 重复步骤 3,但对于 AFTER 文件并粘贴到 Diff Tools 的右侧框中
  5. 单击Compare Now并执行您的 diff ad-hoc
于 2019-12-13T01:55:02.893 回答