如何查看有多少提交本地分支在git中另一个本地分支的前面/后面?

时间:2014-12-10 17:35:48

标签: git

如果我正在开发一个功能分支,我想知道这个分支在master分支的前面或后面有多少次提交。我似乎无法找到执行此操作的命令。

2 个答案:

答案 0 :(得分:5)

列出和计算提交:git rev-list

快速的方法是在{"上游"时执行git status所做的事情。具体来说,git status只计算当前分支上不在上游分支上的修订。例如,考虑具有foo上游的分支origin/foo,假设您已经进行了三次本地提交,然后使用git fetch引入了一个上游提交:

              L - L - L   <-- foo
            /
... - C - C
            \
              U           <-- origin/foo

这里C是常见提交,L是本地提交,U是上游提交。如果您在分支机构foo上运行git status,那么您将看到&#34;提前3,在1&#34;之后。

以下是git如何得到这些数字:

  1. git rev-list foo --not origin/foo:这会在foo上生成所有提交的列表,但不会生成origin/foo上的所有提交的列表。也就是说,从origin/foo(提交U)开始,删除提交,所有早期提交都可以访问:U和所有C提交。然后,从foo开始,找到尚未被删除的所有可到达提交:这只是三个L提交。

  2. --count添加到git rev-list参数,使其打印计数而不是原始commit-ID SHA-1值。

  3. 重复git rev-list origin/foo --not foo:这是所有可以从origin/foo但不能从foo到达的提交,在此示例中只提交U。 (再次,添加--count以获取计数,而不是实际的提交ID。)

  4. 请注意,foo --not origin/foo语法中的origin/foo..foo拼写为git status。 (在HEAD的情况下,它始终查看当前分支(通过@{upstream}命名 - 及其上游。)您可以使用{{1 }}语法获取上游的名称,或将其缩短为@{u};如果您根本没有列出任何名称,则HEAD是默认值;因此要重新实现git status,您可以只需查看git rev-list --count ..@{u}git rev-list --count @{u}..。)

    在本地分支上使用rev-list,使用git cherry

    因此,如果您想要计算从分支feature而不是从分支master可到达的提交,您可以使用名称featuremaster执行相同的操作。 git rev-list语法master..feature将所有提交ID命名为feature,但不能来自master,而--count会为您计算:

    git rev-list --count master..feature
    

    如果您已经从一个分支到另一个分支中挑选了一些提交,那么它们具有不同的提交ID但是相同的差异,这将超过&#34;过度计数&#34;。例如,假设feature有五次提交master没有做过,但是你(或某人)已经决定将这五份提交中的一项提交到master,你现在可能有这个:

                  D - E - F - G - H   <-- feature
                /
    ... - C - C
                \
                  F'                  <-- master
    

    其中F'基本上只是提交F的副本。如果您要求git rev-list计算feature上不在master上的提交,那么您将获得5;但是,如果您要求git cherryfeature上找不到master上的提交,则会从其列表中删除提交F,因为它会看到F' }是F的副本。如果算上git cherry列出的提交,那么你将获得4,而不是5。

答案 1 :(得分:3)

使用git cherry查找一个分支中存在的提交,而不存在于其他

git cherry -v master feature

它将列出功能分支中存在的所有提交,这些提交在主服务器中不存在。

类似地,

git cherry -v feature master 

将列出主分支中存在的所有提交,这些提交在功能中不存在。

您还可以提供额外的第三个参数来选择起点。

git cherry -v feature master 1b219e

<强>更新

您可以创建一个别名来合并两个

[alias]
    mydiff = !sh -c 'echo "Commits in $2 not in $1" && git cherry -v $1 $2 && echo "Commits in $1 not in $2" && git cherry -v $2 $1' -

使用,

git mydiff master feature