如果我正在开发一个功能分支,我想知道这个分支在master分支的前面或后面有多少次提交。我似乎无法找到执行此操作的命令。
答案 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如何得到这些数字:
git rev-list foo --not origin/foo
:这会在foo
上生成所有提交的列表,但不会生成origin/foo
上的所有提交的列表。也就是说,从origin/foo
(提交U
)开始,删除提交,所有早期提交都可以访问:U
和所有C
提交。然后,从foo
开始,找到尚未被删除的所有可到达提交:这只是三个L
提交。
将--count
添加到git rev-list
参数,使其打印计数而不是原始commit-ID SHA-1值。
重复git rev-list origin/foo --not foo
:这是所有可以从origin/foo
但不能从foo
到达的提交,在此示例中只提交U
。 (再次,添加--count
以获取计数,而不是实际的提交ID。)
请注意,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
可到达的提交,您可以使用名称feature
和master
执行相同的操作。 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 cherry
在feature
上找不到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