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

tim*_*fly 6 git

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

pra*_*atZ 9

使用git cherry查找提交呈现一个分支和其他不存在

git cherry -v master feature
Run Code Online (Sandbox Code Playgroud)

它将列出功能分支中存在但在主分支中不存在的所有提交。

相似地,

git cherry -v feature master 
Run Code Online (Sandbox Code Playgroud)

将列出 master 分支中存在但不存在于 feature 中的所有提交。

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

git cherry -v feature master 1b219e
Run Code Online (Sandbox Code Playgroud)

更新:

您可以创建一个别名来将两者结合起来

[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' -
Run Code Online (Sandbox Code Playgroud)

用,

git mydiff master feature
Run Code Online (Sandbox Code Playgroud)


tor*_*rek 7

列表和计数提交: git rev-list

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

              L - L - L   <-- foo
            /
... - C - C
            \
              U           <-- origin/foo
Run Code Online (Sandbox Code Playgroud)

这里C是常见的提交,Ls是本地提交,U是上游提交.如果你在分支上foo并且你跑步,git status你会看到"前方3,落后1".

以下是git如何获取这些数字:

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

  2. 添加--countgit rev-list参数以使其打印计数而不是原始commit-ID SHA-1值.

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

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

利用rev-list当地的分支机构,使用VSgit cherry

因此,如果你想计算从分支feature而不是从分支master可以访问的提交,你可以做同样的事情,但使用名称featuremaster.该git rev-list语法master..feature的名字都提交的ID从可达feature但不能从master,并--count会得到你一个数:

git rev-list --count master..feature
Run Code Online (Sandbox Code Playgroud)

但是,如果您已经从一个分支到另一个分支中选择了一些提交,那么它们具有不同的提交ID但是相同的差异,这将"过度计数".例如,假设feature有五个提交没有master,但是你(或某个人)已经决定应该挑选出这五个提交中的一个master,你现在可能有这个:

              D - E - F - G - H   <-- feature
            /
... - C - C
            \
              F'                  <-- master
Run Code Online (Sandbox Code Playgroud)

where F'基本上只是提交的副本F.如果你问git rev-list计数提交的feature使不上master,你会得到5; 但如果你问git cherry上找到提交feature上没有的master,它会清除提交F其从清单中,因为它会看到,F'是的副本F.如果算上你列出的提交,git cherry那么你将获得4,而不是5.