【问题标题】:How can I generate a diff for a single file between two branches in github如何在 github 中的两个分支之间为单个文件生成差异
【发布时间】:2013-01-08 03:27:12
【问题描述】:

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

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

git diff tag1 tag2 -- path/to/file

我找到了这里讨论的命令行版本: how can I see the differences in a designated file between a local branch and a remote branch?

【问题讨论】:

    标签: git github


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

    如果您要检索针对特定文件的 URL:

    • 切换到文件已更改标签

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

    • 将您要查找的特定文件的链接复制到剪贴板...和 ​​Tada!大功告成。

    例如,鉴于上述差异,链接 https://github.com/libgit2/libgit2sharp/compare/v0.9.0...v0.9.5#diff-11 将指向在 v0.9.0 和 v0.9.5 之间发生的 LazyFixtures.cs 更改。

    更新

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

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

    【讨论】:

    • 嗨,看起来这对我不起作用,因为我的差异太大。我得到“这个差异很大!我们只显示前 2,500 个文件的状态信息。”所以我只得到 Diff Stats 而不是完整的差异,即使有 #diff 链接。
    • 但是我认为你是对的 - 这就是这样做的方法。谢谢
    • 你也可以使用这个Chrome扩展github.com/danielribeiro/github-diff-highlight-extension在比较分支时获得语法高亮。
    • @plainflavor 这里还有一个更方便的提示,以防您再次遇到这种情况 - 每当您有像 @nulltoken 指出的比较 URL 时,您也可以在 URL 的末尾添加一个 .diff查看完整的差异(尽管是纯文本)。例如。 https://github.com/{user}/{repository}/compare/{from-tag}...{until-tag}.diffSource
    • 我没有看到 Show Diff Stats 按钮。它消失了吗?还是我只是没看到?
    【解决方案2】:

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

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

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

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

    【讨论】:

    【解决方案3】:

    答案适用于只想查看(不下载)GITHUB WEB 页面中文件的代码更改历史/修订的人,以便之前签入。

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

    单击它将显示代码更改。点击历史后;您可以单击包以查看包级别的所有文件签入。

    在 Eclipse 中,您可以使用 EGit 插件和文件上的“右键单击 -> 比较”来比较历史记录。 How can I compare two revisions in git in Eclipse?

    【讨论】:

    • 为了更明确,您单击提交的 7 个十六进制数字“名称”(将鼠标悬停在它上面时没有标签或工具提示,它靠近右侧,就在下一个到“复制到剪贴板”图标),这将带您进入一个页面,该页面显示该提交版本与我认为是以前版本之间的差异。
    • @Jonathan 是的;没错
    • 嘿,我上次看的时候没看到那个屏幕截图。我不知道它是否只是没有为我加载,或者你是否从那时起添加了它,但无论哪种方式都感谢你的回答;太好了。
    • 对于 5000 个文件的提交,这不会让我进入单文件差异。从this history,尝试从this huge commit 找到该文件的增量。
    【解决方案4】:

    我使用nulltoken's answer 组合了一个简单的便捷脚本,用于从命令行提取 GitHub 上的两个提交之间的差异。

    您可以找到full script on 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 锚是“diff-” - 没有记录 AFAIK - 但它惹恼了我,我猜到了。
    【解决方案5】:

    由于这仍然是不可能的,这里有一个基于浏览器的差异工具方法。它不利用自动化,只需要安装 Chrome 扩展程序的能力:

    1. 为 Chrome 浏览器安装差异工具:https://chrome.google.com/webstore/detail/diff-tools-text-pdf-doc-o/lkcdojpmjehlniamnglpjlldkoonlomb
    2. 打开差异工具 (http://iblogbox.com/devtools/diff/)
    3. 从 GitHub 转到 BEFORE commit, tag, or branch,打开文件,然后点击 Raw 按钮获取原始文件视图,全选并复制,然后放入差异工具中的左侧文本框
    4. 重复步骤 3,但对于 AFTER 文件并粘贴到 Diff Tools 的右侧框中
    5. 单击 立即比较 并执行您的 diff ad-hoc

    【讨论】:

      猜你喜欢
      • 2015-10-15
      • 2012-04-07
      • 2022-08-15
      • 2023-04-04
      • 1970-01-01
      • 1970-01-01
      • 2010-11-23
      • 2021-11-11
      • 1970-01-01
      相关资源
      最近更新 更多