【问题标题】:Using Git, show all commits that are in one branch, but not the other(s)使用 Git,显示一个分支中的所有提交,但不显示其他分支
【发布时间】:2010-12-15 05:12:47
【问题描述】:

我有一个旧分支,我想删除它。但是,在这样做之前,我想检查对这个分支所做的所有提交是否在某个时候合并到了另一个分支中。因此,我想查看对我当前分支所做的所有提交,这些提交尚未应用于任何其他分支[或者,如果没有一些脚本就不可能,那么如何查看一个分支中尚未应用的所有提交到另一个给定的分支?]。

【问题讨论】:

标签: git branch git-branch


【解决方案1】:

你可能只是想要

git branch --contains branch-to-delete

这将列出所有包含“分支到删除”提交的分支。 如果它报告的不仅仅是“branch-to-delete”,则该分支已被合并。

您的替代方案实际上只是 rev-list 语法的东西。例如git log one-branch..another-branch 展示了 one-branch 需要拥有的一切 another-branch 拥有的一切。

您可能还对git show-branch 感兴趣,以此来查看在哪里。

【讨论】:

  • “如果报告了某些内容,则分支已合并”这行可能会被误解:如果git branch --contains some-branch 只返回some-branch,那么它确实返回了一些内容,但它没有 i> 被合并了。
  • 请注意,git log foo..bar 将显示 bar 的最新和 foo 的最新之间的提交,但不会显示更早以前丢失的其他提交。要查看 bar 而不是 foo 中的所有内容,您应该使用 @jimmyorr 的解决方案。
【解决方案2】:

如果您需要检查的是 一个(单个) 分支,例如,如果您希望将分支“B”完全合并到分支“A”中,则只需执行以下操作:

$ git checkout A
$ git branch -d B

git branch -d <branchname> 具有“分支必须完全合并到 HEAD 中”的安全性。

注意:如果分支 B 合并到 A 中,这实际上会删除分支 B。

【讨论】:

    【解决方案3】:

    要查看哪些提交在一个分支上而不是另一个分支上的列表,请使用 git log:

    git log --no-merges oldbranch ^newbranch
    

    ...也就是说,显示 oldbranch 上所有 not 在 newbranch 上的提交的提交日志。您可以列出要包含和排除的多个分支,例如

    git log  --no-merges oldbranch1 oldbranch2 ^newbranch1 ^newbranch2
    

    注意:在 Windows 命令提示符下(不是 Powershell)^ 是一个转义键,因此需要用另一个 ^ 进行转义:

    git log --no-merges oldbranch ^^newbranch
    

    【讨论】:

    • 这正是我想要的。但是,在这里使用^ 作为前缀让我很困惑。在这种情况下,它意味着排除该分支。使用 ^ 作为后缀将是对该分支的父提交的相对引用。
    • 非常有用,谢谢。我很好奇,为什么需要 --no-merges 标志?肯定有人也想看到这些提交吗?
    • 感谢@jimmyor,作为旁注,我在 PowerShell 中使用 PoshGit 时不需要 ^^。我只需要^
    • 这是一个很好的答案,但 oldbranchnewbranch (对我来说)有点令人困惑。我建议使用 branch_withcommitsbranch_missingcommits 之类的东西,尽管它有点冗长,因为它立即清楚命令正在寻找什么。我会自己进行编辑,但这感觉像是一个相当大的改动,需要先发制人。你介意我做这个改变(或者你可以自己做)吗?
    • 或者,为了阐明^ 的含义,我们可以将^newbranch 替换为^excludebranch
    【解决方案4】:

    虽然此处发布的一些答案将帮助您找到所需的内容,但 git branch 的以下子命令是更适合您任务的解决方案。

    --merged is used to find all branches which can be safely deleted, since those branches are fully contained by HEAD.

    master 中,可以运行命令来枚举可以安全删除的分支,如下所示:

    git branch --merged
      develop
      fpg_download_links
    * master
      master_merge_static
    
    # Delete local and remote tracking branches you don't want
    git branch -d fpg_download_links
    git push origin :fpg_download_links
    git branch -d master_merge_static
    git push origin :master_merge_static
    
    # There is also a flag to specify remote branches in the output
    git branch --remotes --merged
    

    【讨论】:

      【解决方案5】:

      您可以使用这个简单的脚本来查看未合并的提交

      #!/bin/bash
      # Show commits that exists only on branch and not in current
      # Usage:
      #   git branch-notmerge <branchname>
      #
      # Setup git alias
      #   git config alias.branch-notmerge [path/to/this/script]
      grep -Fvf <(git log --pretty=format:'%H - %s') <(git log $1 --pretty=format:'%H - %s')
      

      您也可以使用工具git-wtf 来显示分支的状态

      【讨论】:

        【解决方案6】:

        在 oldbranch 中而不是在 newbranch 中显示提交:

        git log newbranch..oldbranch
        

        通过这些提交显示差异(注意有三个点):

        git diff newbranch...oldbranch
        

        这是带有图表插图的文档https://git-scm.com/book/en/v2/Git-Tools-Revision-Selection#Commit-Ranges

        【讨论】:

        • 见上面的Paul A Jungwirth's comment。看来这会错过一些旧的提交?
        • 我不确定旧提交是什么意思。双点基本上要求 Git 解决一系列提交,这些提交可以从一个提交到达,但不能从另一个提交到达。这是带有图表插图的文档git-scm.com/book/en/v2/…
        • 如果我们使用newbrancholdbranch,我们可以分别使用git log ..oldbranchgit log newbranch..
        • jimmyorr 的解决方案对我不起作用,但这要归功于裁判姓名之间的两个点 ..。我还使用了--cherry-pick 选项来隐藏两个分支上都存在但哈希值不同的提交,因为它们是从一个分支到另一个分支的精心挑选的。
        • 这个问题是它只显示(除了新分支和旧分支)两个分支之间按时间顺序进行的提交。如果新分支上的某些提交是在旧分支创建之前进行的,它们将不会显示。
        【解决方案7】:

        jimmyorr's answer 在 Windows 上不起作用。像这样使用--not 而不是^ 会有所帮助:

        git log oldbranch --not newbranch --no-merges
        

        【讨论】:

        • 没错,+1。请注意,虽然 Windows 支持 ^,但需要转义,在 Windows 中,它是(另一个)^:git log oldbranch ^^newbranch --no-merges
        • 具体来说,它确实可以在 Windows 的 Powershell 控制台中运行,但在 CMD 中需要额外的“^”。
        【解决方案8】:

        对于那些仍在寻找简单答案的人,请查看git cherry。它比较实际差异而不是提交哈希。这意味着它可以容纳经过精心挑选或重新定位的提交。

        首先checkout你要删除的分支:

        git checkout [branch-to-delete]

        然后使用 git cherry 将其与您的主要开发分支进行比较:

        git cherry -v master

        示例输出:

        + 8a14709d08c99c36e907e47f9c4dacebeff46ecb Commit message
        + b30ccc3fb38d3d64c5fef079a761c7e0a5c7da81 Another commit message
        - 85867e38712de930864c5edb7856342e1358b2a0 Yet another message
        

        注意:-v 标志将包含提交消息以及 SHA 哈希。

        前面带“+”的行在要删除的分支中,但不在主分支中。前面带有“-”的那些在 master 中具有等效的提交。

        对于不在 master 中的提交,将cherry pick 与 grep 结合起来:

        git cherry -v master | grep "^\+"

        示例输出:

        + 8a14709d08c99c36e907e47f9c4dacebeff46ecb Commit message
        + b30ccc3fb38d3d64c5fef079a761c7e0a5c7da81 Another commit message
        

        【讨论】:

        • 我已经尝试过了,但它仍然报告在 fb(功能分支)中有许多不在 mb(主分支)中的提交。但是,如果我在 fb 中执行 git diff mb,我看不出有什么不同。我确实使用了变基并压扁了所有东西。我几乎可以肯定这就是原因,但我只是想确定一下。如果是这种情况,那么我将尽可能避免挤压;我在“不丢失信息阵营”中。我想知道是否有可能添加一个日志显示模式,它可以显示合并,就好像它们是变基一样,以保持历史干净,但不会丢失任何信息。
        • 不确定您在这里的确切情况,但是如果您已将多个提交压缩为一个并将其与提交分开的另一个分支进行比较,那么这绝对行不通。在这种情况下,您可能只想使用 unix diff 实用程序来比较各种文件。或者,您可以创建一个临时分支并压缩其中的所有提交,类似于您对原始分支所做的操作,然后使用它,我认为这会起作用。
        【解决方案9】:

        只需使用git cherry 选择分支newFeature42 中的所有提交,例如:

        git cherry -v master newFeature42

        【讨论】:

          【解决方案10】:

          显示来自other-branch 且不在您当前分支中的提交和提交内容:

          git show @..other-branch
          

          此外,您可以将来自other-branch 的提交直接应用到您当前的分支:

          git cherry-pick @..other-branch
          

          【讨论】:

            【解决方案11】:

            我也想计算提交,所以这里是如何做到这一点:

            计算当前分支 (HEAD) 上有多少提交,但不在 master 上:

            git log --oneline ^master HEAD | wc -l
            

            wc -l 表示“字数”--计算 'l'ines 的数量。

            当然要查看整个日志消息,正如其他答案给出的那样:

            git log ^master HEAD
            

            ...或以精简的--oneline 形式:

            git log --oneline ^master HEAD
            

            如果您也不想计算合并提交,您可以排除带有--no-merges 的那些:

            git log --oneline --no-merges ^master HEAD | wc -l
            

            等等

            【讨论】:

              猜你喜欢
              • 2011-08-08
              • 2021-02-26
              • 2015-04-10
              • 1970-01-01
              • 1970-01-01
              • 2020-05-22
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多