如何在github中两个分支之间为单个文件生成差异


111

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

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

git diff tag1 tag2 -- path/to/file

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

Answers:


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项目之间的差异。该差异包括所有修改的文件。

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

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

更改标签

  • 单击“ 显示差异统计信息”按钮(这将显示已修改文件的列表作为链接)

显示差异

  • 将您要保存的特定文件的链接复制到剪贴板上...和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

8
嗨,这似乎对我不起作用,因为我的差异太大。我收到“差异很大!我们仅显示前2500个文件的状态信息。” 因此,即使使用#diff链接,我也只能获得Diff Stats而不是完整的diff。
plainflavor 2013年

1
但是我认为您是对的-这就是这样做的方式。谢谢
plainflavor

1
您还可以在比较分支时使用此Chrome扩展程序github.com/danielribeiro/github-diff-highlight-extension来突出显示语法。
Daniel Ribeiro

3
@plainflavour这里还有一个方便的提示,以防您再次遇到这种情况-每当您具有比较URL(如@nulltoken指出)时,也可以在URL末尾添加.diff以查看完整的diff(尽管为纯文本) )。例如,消息https://github.com/{user}/{repository}/compare/{from-tag}...{until-tag}.diff 来源
dmccabe'5

1
我没有看到“ 显示差异统计信息”按钮。没了吗 还是我只是没有看到它?
dckc


3

答案是给只希望查看(而不下载)GITHUB WEB页面中文件以前更改的历史记录/代码更改的人的。

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

在此处输入图片说明 单击它会显示代码更改。单击历史记录后;您可以单击软件包以查看软件包级别的所有文件签入。

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


1
为了更明确一点,您单击提交的7个十六进制数字“名称”(将鼠标悬停在该名称上时,没有标签或工具提示,它靠近右侧,位于“复制到剪贴板”旁边)图标),然后您将进入一个页面,该页面显示该提交版本与我认为是先前版本之间的差异。
JonathanZ支持MonicaC

@乔纳森是的; 这就是真正的
Kanagavelu Sugumar

嘿,我上次没有看到该屏幕截图。我不知道它是否当时不是为我加载的,或者您是否从那以后添加过它,但是无论哪种方式,都感谢您的回答;这很棒。
JonathanZ在2015年

对于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

@sgarg锚点是“ diff- <文件名的md5>”(未记录AFAIK),但它使我烦恼,我猜到了。
Ben Walding

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转到提交,标记或分支之前,打开文件,然后单击Raw按钮以获取原始文件视图,全选并复制,然后放入Diff Tools的左侧文本框中
  4. 重复步骤3,但对于AFTER文件,将其粘贴到Diff Tools的右侧框中
  5. 单击Compare Now并执行您的差异临时
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.