【问题标题】:Showing which files have changed between two revisions显示哪些文件在两个修订版之间发生了更改
【发布时间】:2010-10-23 19:05:44
【问题描述】:

想合并两个分开一段时间的分支,想知道哪些文件被修改了。

偶然发现了这个链接:http://linux.yyz.us/git-howto.html,这非常有用。

我遇到的比较分支的工具是:

  • git diff master..branch
  • git log master..branch
  • git shortlog master..branch

想知道是否有类似“git status master..branch”的东西只能看到两个分支之间不同的文件。

在不创建新工具的情况下,我认为这是您现在可以做到的最接近的方法(如果文件被多次修改,这当然会显示重复):

  • git diff master..branch | grep "^diff"

想知道我是否错过了什么......

【问题讨论】:

  • 有多少人认为这个问题的标题具有误导性?它实际上是关于查找两个分支之间的文件差异。我来这里寻找的是如何查看同一分支上两个修订版之间的文件差异。还是只有我一个?
  • @SandeepanNath:与 git 没有区别。你总是指个人提交。
  • @SamuelO'Malley 我是 git 新手,考虑到看似常见的分支策略,其中所有分支最终合并到 master 分支,最终 master 被推出。现在,考虑推出的事件,其中生产已经在主,但在提示之后(如果最后一次推出发生在最后一次主合并之后,则通过一个修订),我想看看这两个修订之间的差异,以找出将推出的内容。我不想查看上次合并的分支。如果我错了,请纠正我。
  • @SandeepanNath:您可以不使用分支名称,而是选择下面的答案,只需指定提交 ID。如果您在推出时创建标签,甚至可以通过标签名称引用提交。
  • @SandeepanNath 您不能比较 2 个分支,您必须指定修订版。所以比较 2 个分支就是比较 2 个修订版。

标签: git branch git-branch git-diff


【解决方案1】:

请注意,如果您不喜欢结果,git 可以很容易地尝试合并并避免任何问题。这可能比提前寻找潜在问题更容易。

【讨论】:

  • 大卫,这是一个很好的观点,尽管提前知道发生了什么会很好......
【解决方案2】:

将当前分支与main 分支进行比较:

$ git diff --name-status main

比较任意两个分支:

$ git diff --name-status firstbranch..yourBranchName

official documentation 中有更多git diff 选项(特别是--name-status 选项)。

【讨论】:

  • 左侧的每个索引是什么意思(我看到很多 M 和 D)?
  • @user446936 - 您可以在 git status 手册页中看到这些字母的含义 @kernel.org/pub/software/scm/git/docs/git-status.html - 特别是 M == 已修改,D == 已删除
  • git diff --name-status your_branch...master 输出自创建 your_branch 以来在 master 上发生的更改
  • 双点运算符在这里是多余的,因为差异是成对的。
  • 我得到未知的修订或路径不在工作树中。
【解决方案3】:

试试

$ git diff --stat --color master..branchName

这将为您提供有关每次更改的更多信息,同时仍使用相同数量的行。

如果要以其他方式合并,您还可以翻转分支以获得更清晰的差异图片:

$ git diff --stat --color branchName..master

【讨论】:

  • 如果你(强烈推荐,恕我直言)打开了 git color (config --global color.ui true),你可以跳过 --color。 (我有 lks - 懒惰键盘综合症。)
  • 我支持你!顺便说一句,我的意思是说git config --global color.ui true - 完整。
  • 不起作用,抛出错误:fatal: ambiguous argument 'master..branchName': unknown revision or path not in the working tree.
  • @TomášZato 抱歉,您需要将“branchName”替换为您的分支名称。
【解决方案4】:

还请记住,git 具有便宜且易于分支的功能。如果我认为合并可能有问题,我会为合并创建一个分支。因此,如果master 有我想要合并的更改,而ba 是我的分支,需要来自 master 的代码,我可能会执行以下操作:

git checkout ba
git checkout -b ba-merge
git merge master
.... review new code and fix conflicts....
git commit
git checkout ba
git merge ba-merge
git branch -d ba-merge
git merge master

最终结果是,我必须先在一个废弃的分支上尝试合并,然后再拧上我的分支。如果我搞砸了,我可以删除 ba-merge 分支并重新开始。

【讨论】:

  • 太棒了。我从来没有想过那样分支。我认为这应该被视为合并时“最佳实践”的一部分。
  • 当您将 ba-marge 合并回 ba 时,是否有可能必须再次修复冲突?
  • @EricAnderson 对,这是一个图表。 SVN 像口香糖一样粘在课桌下。谢谢。
  • 如果 ba-merge 已经有了 master,为什么还需要做最后一步 'git merge master'
  • @EricAnderson 如果在合并过程中出现故障,为什么需要丢弃分支?只是取消合并更改就足够了吗?比如git reset --hard; git clean -fd ?
【解决方案5】:

如果有人试图从两个分支生成差异文件:

git diff master..otherbranch > myDiffFile.diff

【讨论】:

  • 这已经派上用场了,尤其是对于包含很多差异的大型分支。
  • 这在差异非常大时很有用。默认情况下,它不会在控制台中显示所有差异(我想知道为什么),在这种情况下将差异传递给文件是要走的路。
【解决方案6】:

如果您使用IntelliJ IDEA,您还可以将任何分支与您当前的工作分支进行比较。有关更多信息,请参阅http://www.jetbrains.com/idea/webhelp/merging-deleting-and-comparing-branches.html#d288093e3827free edition 也提供此功能。

【讨论】:

    【解决方案7】:

    还有一个基于 GUI 的方法。

    你可以使用 gitk

    1. 运行:

      $ gitk --all
      
    2. 右键单击某个分支的提交,然后在弹出菜单中选择标记此提交

    3. 右键单击另一个分支的提交,然后选择区分此 -> 标记提交区分标记提交 -> 此

    然后在右下面板会有一个更改的文件列表,在左下面板会有差异详情。

    【讨论】:

    • @Orwellophile 我上传了一个video 来展示如何操作。希望对你有帮助。
    • 哇,就我而言,我感觉很特别。我已经在delicious.com 中添加了书签,以供将来参考和额外的google-foo。
    • 严重低估的答案。谢谢!
    【解决方案8】:

    还有一个选项,在这种情况下使用 meld:

    git difftool -d master otherbranch
    

    这不仅允许查看文件之间的差异,还提供了一种指向和单击特定文件的简单方法。

    【讨论】:

    • 可能想将 meld 设置为默认的 difftool:git config --global diff.tool meld
    • 这是我最喜欢的,因为它会使用你配置的任何 difftool。
    • 在 OSX 上不支持。 :-(
    • @MikeS。请查看此答案stackoverflow.com/a/12815806/151918 它包含 OSX 的说明。它至少对我有用,希望它有所帮助。
    • 谢谢!一直在搜索,这个命令可以很容易地看到 2 个分支之间的差异。
    【解决方案9】:

    在协同工作或同时处理多个功能时,上游甚至您的主节点包含未包含在您的分支中的工作,并且会错误地出现在基本差异中,这是很常见的。

    如果您的上游可能已经移动,您应该这样做:

    git fetch
    git diff origin/master...
    

    仅使用 git diff master 可以包含或不包含相关更改。

    【讨论】:

      【解决方案10】:

      如果您只在某些文件中寻找更改,那么:

      git diff branch1 branch2 -- myfile1.js myfile2.js
      

      branch1 是可选的,如果没有提供 branch1,将默认考虑您当前的分支(您所在的分支)。 例如:

      git diff master -- controller/index.js
      

      【讨论】:

        【解决方案11】:

        假设有两个分支

        • A(您正在工作的分支)
        • B(您要与之比较的另一个分支)

        在分支 A 你可以输入

        git diff --color B
        

        那么这会给你一个输出

        重点是

        1. 分支 A 中存在绿色文本

        2. B 分支中存在红色文本

        【讨论】:

          【解决方案12】:

          这里有很多答案,但我想添加一些我常用的东西。如果您在要比较的分支之一,我通常会执行以下操作之一。为了这个答案,我们会说我们在我们的二级分支中。取决于您当时需要的视图取决于您选择的视图,但大多数时候我使用的是两者中的第二个选项。如果您想恢复到原始副本,第一个选项可能会很方便 - 无论哪种方式,都可以完成工作!

          这会将 master 与我们所在的分支(次要)进行比较,原始代码将是添加的行,新代码将被视为删除的行

          git diff ..master
          

          这也会将 master 与我们所在的分支(次要)进行比较,原始代码将是旧行,新代码将是新行

          git diff master..
          

          【讨论】:

            【解决方案13】:

            您还可以使用 TortoiseGit 轻松比较已更改文件的分支。只需点击 Browse References 并选择您要比较的分支。

            例如,如果您将 您的分支master 进行比较,您将获得将在 master 中更改的文件的结果列表,如果您决定将 your-branch 合并到 master

            请记住,如果您将 masteryour-branch 以及 your-branchmaster 进行比较,您将得到不同的结果em>。

            【讨论】:

            • 问题似乎与本机 git 实用程序有关
            【解决方案14】:

            如果您喜欢 GUI 并使用 Windows,这里有一个简单的方法。

            1. 下载 WinMerge
            2. 将两个分支检出到不同的文件夹中
            3. 使用 WinMerge 逐个文件夹进行比较。如果其中一个分支是您正在处理的分支,您也可以轻松地进行修改。

            【讨论】:

            • 这不是最简单的方法,实际上不需要下载repos来区分分支。
            • 这确实不是最简单的方式,但它是 GUI 方式,通常更容易查看所有文件中的差异
            【解决方案15】:
            git diff revision_n revision_m
            

            如果revision_nrevision_m 是连续提交,则输出与 git show revision_m

            【讨论】:

            • 非常适合我的用例。我只需要文件名,所以我使用 --name-only 来获取已更改文件的列表。 git diff --name-only rev_old rev_new
            【解决方案16】:

            对于正在寻找 GUI 解决方案的人,Git Cola 有一个非常不错的“Branch Diff Viewer (Diff -> Branches..)。

            【讨论】:

              【解决方案17】:

              您也可以使用 visual diff

              例如,如果您使用的是Sourcetree,则可以简单地使用select any two commits in log view

              (我个人更喜欢在大多数情况下使用 GUI,我将这个发布给那些可能不熟悉 GUI 选项的人。)

              【讨论】:

                【解决方案18】:

                如果您使用的是 Github / Github Enterprise,您可以通过点击存储库路径的 URL /compare 来使用 Web UI,例如 https://github.com/http4s/http4s/compare。 您可以选择要比较的分支/提交/标签:

                并且差异将显示在 github 界面中的 url /compare/{x1}...{x2} x2x1 是您要比较的分支/提交/标记,例如: https://github.com/http4s/http4s/compare/main...dotty

                你可以在Github Doc看到更多。

                【讨论】:

                • 非常感谢。一直在努力寻找这个。
                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 2016-07-16
                • 1970-01-01
                • 1970-01-01
                • 2012-05-12
                • 1970-01-01
                • 2021-12-21
                • 1970-01-01
                相关资源
                最近更新 更多